容器网络
如何创建自定义网络、容器之间如何通信、容器如何与外界交互
docker network ls 查看docker安装时在host上创建的网络
|NETWORK ID | NAME | DRIVER |SCOPE|
|--------------|
|d1f615ee4cab | bridge | bridge | local|
|524400edcb11 | host | host | local|
|2feb82deae99 | none | null | local|
- none网络
挂在这个网络上的容器除了lo,没有其他网卡 创建容器时 —network=none指定
- host网络
共享docker host的网络栈,容器的网络配置与host完全一样 —network=host指定
在容器中可以看到host的所有网卡,连hostname都是host的
直接使用docker host 网络的最大好处就是性能
- bridge网络
容器默认使用的网络
# brctl show
#查看桥接网卡
Linux container 中用到一个叫做veth的东西,这是一种新的设备,专门为 container 所建。veth 从名字上来看是 Virtual ETHernet 的缩写,它的作用很简单,就是要把从一个 network namespace 发出的数据包转发到另一个 namespace。veth 设备是成对的,一个是 container 之中,另一个在 container 之外,即在真实机器上能看到的。
# docker network ls
查看全部网络
# docker network inspect bridge
查看指定子网信息
创建 user-defined 网络 用户定义网络
Docker 提供三种 user-defined 网络驱动:bridge
, overlay
和 macvlan
# docker network create --driver bridge my_net
#创建桥接网络
# docker netwok create —driver bridge —subnet 192.168.1.0/24 —gateway 192.168.1.1 my_net0
#创建桥接网络并指定网段、网关
# brctl show
# docker network inspect my_net
# docker run -d --network=my_net0 --name=test1 ubuntu bash -c "while true;do sleep 1;done"
#创建容器时指定特定网络
IP通信
两个容器要能互通 必须要有属于同一网络的网卡 这样就可以通过IP进行交互 只要在创建容器时指定 --network 或者通过
docker network connect 将现有容器加入到指定网络
# docker network connect my_net0 con_A
网络名 容器名
docker DNS server
通过IP进行容器间 访问已经满足需求,但是还是不够灵活 在应用部署之前不确定其IP地址
docker daemon实现了一个内嵌的DNS server 使容器可以通过容器名进行通信
只要在容器启动时为容器指定容器名 --name
# docker run -it --network=my_net0 --name=compute centos
# docker run -it --network=my_net0 --name=controller centos
docker DNS 有个限制默认的bridge无法使用,只能用于user-defined网络
joined 容器
joined容器可以使多个容器共享一个网络栈,共享网卡和配置信息 joined 容器之间可以通过127.0.0.1直接通信
先创建一个容器
# docker run -it --name web --network=my_net0 centos bash
然后--network 指定网络为容器web
# docker run -it --name client --network=container:web ubuntu bash
1、不同容器使用lookback进行通信(高效)
2、运行在独立容器中的网络监控程序
外部网络
1、容器访问外部网络
通过iptables作nat转换ip
2、外部网络访问容器
端口映射
docker可以将对外提供服务的端口映射到host主机的某个端口容器启动时使用 -p 参数指定
# docker run -d -p 80 httpd
# docker run -d -p 8080:80 httpd
将host 8080端口 映射到 httpd容器的 80 端口
查看端口映射
# docker port CONTAINER
# docker ps
# ps -ef | grep docker-proxy
每映射一个端口,docker-proxy 就启动一个进程对访问的流量进行处理