Docker 安装时会自动在 host 上创建三个网络,我们可用 docker network ls 命令查看:
none 网络
什么都没有的网络,没有任何网卡。作用用于隔离一些安全要求高,但是不需要联网的应用
host网络
连接到 host 网络的容器共享 Docker host 的网络栈,容器的网络配置与 host 完全一样。可以通过 --network=host 指定使用 host 网络。
brideg网络
Docker 安装时会创建一个 命名为 docker0 的 linux bridge。如果不指定--network,创建的容器默认都会挂到 docker0 上。
通过 docker network inspect bridge 查看 bridge 网络的配置信息:
bridge 网络配置的 subnet 就是 172.18.0.0/16,并且网关是 172.18.0.1。这个网关就是 docker0
自定义网络
我们可通过 bridge 驱动创建类似前面默认的 bridge 网络
docker network create --driver bridge my_net #创建
docker network inspect my_net 查看my_net 的配置信息
创建网段时指定 --subnet 和 --gateway 参数可自定义网段
docker network create --driver bridge --subnet 172.22.15.0/24 --gateway 172.22.15.1 my_net
容器要使用新的网络,需要在启动时通过 --network 指定,--ip可配置静态ip
注:只有使用 --subnet 创建的网络才能指定静态 IP。
docker run -it --network=my_net --ip 172.22.15.22 busybox
容器间的连通性
同一网络中的容器,网关之间都是可以通的
不同网桥间通信可以为 容器添加一块 net_my的网卡。这个可以通过docker network connect 命令实现。
Docker DNS Server
docker daemon 实现了一个内嵌的 DNS server,使容器可以直接通过“容器名”通信,启动时用 --name 为容器命名。
下面启动两个容器 bbox1 和 bbox2:
docker run -it --network=my_net --name=bbox1 busybox
docker run -it --network=my_net --name=bbox2 busybox
然后,bbox2 就可以直接 ping 到 bbox1 了:
注:只能在自定义网络中使用
joined 容器
joined 容器是另一种实现容器间通信的方式。
joined 容器非常特别,它可以使两个或多个容器共享一个网络栈,共享网卡和配置信息,joined 容器之间可以通过 127.0.0.1 直接通信。
先创建一个 httpd 容器,名字为 web1。
docker run -d -it --name=web1 httpd
然后创建 busybox 容器并通过 --network=container:web1 指定 jointed 容器为 web1:
docker run -it --network=container:web1 busybox
两容器共享网络栈
joined适用于
1.不同容器中的程序希望通过 loopback 高效快速地通信,比如 web server 与 app server。
2.希望监控其他容器的网络流量,比如运行在独立容器中的网络监控程序。
外网
docker容器默认可以访问外网,只要通过nat,外网可以利用端口映射访问内部容器