Docker 网络
Docker 安装时会自动在 host 上创建三个网络, 我们可用 docker network ls 命令查看:
- NETWORK ID NAME DRIVER SCOPE
- 145ad1eae556 bridge bridge local
- 9bfdab5aff70 host host local
- 9c2a17659cb7 none null local
none 网络
故名思议, none 网络就是什么都没有的网络. 挂在这个网络下的容器除了 lo, 没有其他任何网卡. 容器创建时, 可以通过 --network=none 指定使用 none 网络.
一些对安全性要求高并且不需要联网的应用可以使用 none 网络. 比如某个容器的唯一用途是生成随机密码, 就可以放到 none 网络中避免密码被窃取.
host 网络
连接到 host 网络的容器共享 Docker host 的网络栈, 容器的网络配置与 host 完全一样. 可以通过 --network=host 指定使用 host 网络.
直接使用 Docker host 的网络最大的好处就是性能, 如果容器对网络传输效率有较高要求, 则可以选择 host 网络. 当然不便之处就是牺牲一些灵活性, 比如要考虑端口冲突问题, Docker host 上已经使用的端口就不能再用了.
Docker host 的另一个用途是让容器可以直接配置 host 网路. 比如某些跨 host 的网络解决方案, 其本身也是以容器方式运行的, 这些方案需要对网络进行配置, 比如管理 iptables.
应用最广泛也是默认的 bridge 网络
Docker 安装时会创建一个 命名为 docker0 的 linux bridge. 如果不指定 --network, 创建的容器默认都会挂到 docker0 上. 可以通过 docker network inspect bridge 看一下 bridge 网络的配置信息.
容器网络拓扑结构如图所示:
容器创建时, docker 会自动从 172.17.0.0/16 中分配一个 IP, 这里 16 位的掩码保证有足够多的 IP 可以供容器使用.
user-defined 网络
Docker 提供三种 user-defined 网络驱动: bridge, overlay 和 macvlan.overlay 和 macvlan 用于创建跨主机的网络.
bridge 驱动创建
bridge 驱动创建类似前面默认的 bridge 网络
docker network create --drive bridge my_net
查看新增网桥
brctl show 名称为新建 bridge 网络 my_net 的短 id
执行 docker network inspect 查看一下 my_net 的配置信息.
创建网段时指定 --subnet 和 --gateway 可以指定 IP 网段.
docker network create --drive bridge --subnet 172.22.16.0/24 --gateway 172.22.16.1 my_net2
网关在 my_net2 对应的网桥上
容器要使用新的网络, 需要在启动时通过 --network 指定:
docker run -it --network=my_net2 busybox
通过 --ip 容器指定一个静态 IP:
docker run -it --network=my_net2 --ip=172.22.16.8 busybox
注: 只有使用 --subnet 创建的网络才能指定静态 IP.
当前 docker host 的网络拓扑结构:
来源: http://www.jianshu.com/p/0057c14ed809