Docker
本身有4种网络工作模式,和一些自定义网络模式,在安装 Docker
时,默认会自动创建 bridge
、 none
、 host
--net=container:NAME_or_ID
指定。装 Docker
时,它会自动创建上面的三个网络。如果需要指定某种网络,则用 --network
标志来指定。
类似虚拟机 Vmware
中的桥接模式,即容器和宿主机在同一个网络中,但没有独立 IP
地址。这是因为 Docker
使用 Linux
的 Namespaces
技术来进行资源隔离,一个 Docker
容器一般会分配一个独立的 Network Namespace
,但是因为使用的是 host
模式,此容器将不会获得一个独立的 Network Namespace
,而是和宿主机共用一个 Network Namespace
。所以容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
该模式关闭了容器的网络功能,旨在说明容器并不需要网络。
相当于 Vmware
中的 Nat
模式,容器使用独立 Network Namespace
,并连接到 docker0
虚拟网卡(默认模式)。通过 docker0
网桥以及 Iptables nat
表配置与宿主机通信。
概念类似 host
模式, Container
模式指定新构建的容器和同已存在容器共享一个 Network Namespace
,而不是和宿主机共享IP、端口范围等。这样,两个容器除网络方面,其他的如文件系统、进程列表等还是隔离的。
我通过在 Windows 10
操作系统的虚拟机,安装的 CentOS 7.0
, CentOS
是最小安装版,安装后需要将服务器内核和补丁全部更新一遍。
在 CentOS
安装 Docker
后,可以查看 Docker
版本为 20.10.17
,截止当前是 Docekr
社区版当中的最新版本。
构建容器,默认使用 bridge
模式,构建命令中默认有 --net bridge
,创建网络避开 bridge 名字,因为这是 docker0 的名字。
docker network create
的基本命令如下:
Flag shorthand -h has been deprecated, please use --help
Usage: docker network create [OPTIONS] NETWORK
Create a network
Options:
--attachable Enable manual container attachment
--aux-address map Auxiliary IPv4 or IPv6 addresses used by Network driver (default map[])
--config-from string The network from which to copy the configuration
--config-only Create a configuration only network
-d, --driver string Driver to manage the Network (default "bridge")
--gateway strings IPv4 or IPv6 Gateway for the master subnet
--ingress Create swarm routing-mesh network
--internal Restrict external access to the network
--ip-range strings Allocate container ip from a sub-range
--ipam-driver string IP Address Management Driver (default "default")
--ipam-opt map Set IPAM driver specific options (default map[])
--ipv6 Enable IPv6 networking
--label list Set metadata on a network
-o, --opt map Set driver specific options (default map[])
--scope string Control the network's scope
--subnet strings Subnet in CIDR format that represents a network segment
基于 bridge
模式创建名称为 bridge_nww
的网络。
docker network create -d bridge bridge_nww
创建一个容器,使用上述所创建的网络。
docker run -d -it --name clone_new --network bridge_nww clone-boot
docker network inspect bridge_nww
查看下网络使用情况。
[
{
"Name": "bridge_nww",
"Id": "90eb654cb702b85fc8af44ced8121f06f284dc16d57b45dbff66648885582729",
"Created": "2022-08-27T22:42:19.07173123-04:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.22.0.0/16",
"Gateway": "172.22.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"a8d257e00caefe4624fba5effbd67ae90ee46dc95793e877313fbc7cef814dd5": {
"Name": "clone_new",
"EndpointID": "e7dc1dfb4d0ff05ed02619f2eabd2217665bdd9500e9d64eb13753b5f9f2ec8b",
"MacAddress": "02:42:ac:16:00:02",
"IPv4Address": "172.22.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
Containers
中有我们的构建的容器。
自己创建网络可以直接使用容器名来互 Ping
,比如我有一个 Redis
的集群,就可以搭一个网络。网络之间是互相隔离的,不同集群使用不同网络。
docker exec -it ${容器1} ping ${容器2}
先用默认 Bridge
模式创建两个容器 ct1
和 ct2
,新构建一个新的网络工作模式 bridge_ct,
再构建一个使用 bridge_ct
网络的 ct3
。
docker run -itd --name ct1 wentos:7.0 /bin/bash
docker run -itd --name ct2 wentos:7.0 /bin/bash
docker network create -d bridge bridge_ct
docker run -itd --name ct3 --network bridge_ct wentos:7.0 /bin/bash
docker network connect bridge_ct ct2
后面我们依次登录 ct1
、 ct2
、 ct3
,使用 docker attach ct1
命令,罗列出来各他们的 ip
信息。
名称 | ip | 网络 |
---|---|---|
ct1 | 172.17.0.3 | bridge |
ct2 | 172.17.0.5、172.23.0.3 | bridge |
ct3 | 172.23.0.2 | bridge、 bridge_ct |
验证结果
ct2
与 ct1
可以互相 ping
通ct2
中 ct3
可以互相 ping
通在容器 ct1
中 ct3
可以是无法通信的
结论:不同容器间需相互通信,须在同一个网络环境下;使用默认 bridge
网络管理的容器可以使用容器IP进行通信,但无法使用容器名称进行通信;而使用自定义网络管理的容器则可以使用容器IP进行通信