1.host网络
连接到 host 网络的容器共享 Docker host 的网络栈,容器的网络配置与 host 完全一样。可以通过--network=host
指定使用 host 网络。docker run -it --network=host busybox
直接使用 Docker host 的网络最大的好处就是性能,如果容器对网络传输效率有较高要求,则可以选择 host 网络。
当然不便之处就是牺牲一些灵活性,比如要考虑端口冲突问题,Docker host 上已经使用的端口就不能再用了。
2.bridge网络
bridge 是一个很特殊的网络,Docker 安装时会创建一个 命名为 docker0 的 linux bridge。如果不指定 --network,创建的容器默认都会挂到 docker0 上
在host上面
[root@docker226 yum.repos.d]# ip a
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ed:c8:be:9d brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 scope global docker0
5: vethb5f4665@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP
link/ether 9e:78:8e:6c:a8:be brd ff:ff:ff:ff:ff:ff link-netnsid 0
[root@docker226 yum.repos.d]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.0242edc8be9d no vethb5f4665 (一个新的网络接口 vethcd8f150 被挂到了 docker0 上,vethcd8f150 就是新创建容器的虚拟网卡。)
在docker里面
[root@docker226 yum.repos.d]# docker exec -it 0d6b3d648b98 /bin/bash
root@0d6b3d648b98:/usr/local/apache2#ip a
4: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 scope global eth0
valid_lft forever preferred_lft forever
Docker 每创建一个容器就会创建一组互联的网络接口。这组接口就像管道的两端(就是说,从一端发送的数据会在另一端接收到)。
这组接口其中一端作为容器里的 eth0 接口,而领一端统一命名为类似 vethxxxx 这种名字,作为宿主机的一个端口。
可以把 veth 接口认为是虚拟网线的一端。这个虚拟网线一端插在名为 docker0 的网桥上,另一端插到容器里。
可以把它们想象成由一根虚拟网线连接起来的一对网卡,网卡的一头(eth0)在容器中,另一头(vethcd8f150)挂在网桥 docker0 上,其效果就是将 eth0@if39 也挂在了 docker0 上。
3.用户定义网络
Docker 本身提供两种网络驱动:bridge 和 overlay。bridge 只能用于单机网络模式,overlay 用于创建跨主机的网络
docker network create -d bridge my_bridge
[root@docker226 yum.repos.d]# brctl show
bridge name bridge id STP enabled interfaces
br-8c4ec67f261a 8000.0242de446a3a no
docker0 8000.0242edc8be9d no vethb4e1e38
4.自定义网络ip段
如果要自定义网络 IP 段,只需在创建网段时指定--subnet
和--gateway
参数:
docker network create -d bridge --subnet 192.168.31.0/24 --gateway 192.168.31.1 my_bridge2
容器要使用新的网络,需要在启动时通过--network
指定:
docker run -it --network=my_bridge2 --name busybox1 busybox
5.给容器指定固定ip
我们在启动容器的时候,可以通过参数 --ip 来指定特定的 IP,只有使用--subnet
创建的 User-defined 网络才能指定静态 IP。
docker run -it --network=my_bridge2 --ip 192.168.31.25 --name busybox2 busybox
/ # ip a
44: eth0@if45: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:c0:a8:1f:19 brd ff:ff:ff:ff:ff:ff
inet 192.168.31.25/24 scope global eth0