前言
网络是虚拟化技术中最复杂的部分,也是 Docker 应用中的一个重要环节,Docker 中的网络主要解决容器与容器、容器与外部网络、外部网络与容器之间的相互通信问题。
一、Docker 容器网络基本原理
Docker 的网络很好地利用了 Linux 虚拟网络技术,在宿主机的物理网卡和容器内分别创建一个虚拟接口(veth),并让它们通过宿主机的 docker0 网桥进行连接,这样的一对 veth 叫做 veth pair。
宿主机与 Docker 容器建立通信的过程:
- 客户端执行 "docker run" 命令创建并启动容器。
- Docker 引擎创建一对虚拟接口 veth pair,并把它们分别放到宿主机和新容器的网络命名空间中。
- Docker 引擎将宿主机上的 veth 接口连接到宿主机的 docker0 网桥上,并且给它分配一个以 “ veth” 开头的名字,如 veth92dc1bc。
- Docker 引擎将容器上的 veth 接口改名为 “eth0” ,并且该接口只有在容器内网络命名空间中时可见的。
- Docker 引擎从宿主机的 docker0 网桥上分配一个空闲的 IP 地址给容器内的 eth0 ,例如:172.17.0.2。并将容器内 eth0 的路由网关设置为 docker0 的内部 IP 地址,例如:172.17.0.1。
完成上述步骤后,容器就可以使用其内部的虚拟接口 "eth0" 来连接到其它的容器和访问外部的网络了。
###启动一个httpd容器。
root@docker:~# docker run -d -p 80:80 httpd
65fb138571d46f71603bad7ced1689b0355001fd1cbfea09ee86b841752fcf14
root@docker:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
65fb138571d4 httpd "httpd-foreground" 4 seconds ago Up 2 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp strange_banzai
###查看宿主机网卡,多了一个veth开头的设备。
root@docker:~# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:a9ff:fe70:a0a6 prefixlen 64 scopeid 0x20<link>
ether 02:42:a9:70:a0:a6 txqueuelen 0 (Ethernet)
RX packets 67687 bytes 2805575 (2.8 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 88138 bytes 188341450 (188.3 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.128 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::20c:29ff:fe1f:47c7 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:1f:47:c7 txqueuelen 1000 (Ethernet)
RX packets 1228433 bytes 1662216674 (1.6 GB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 324203 bytes 23973244 (23.9 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 818 bytes 84854 (84.8 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 818 bytes 84854 (84.8 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
veth92dc1bc: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::e811:68ff:feaa:fb05 prefixlen 64 scopeid 0x20<link>
ether ea:11:68:aa:fb:05 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 9 bytes 806 (806.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
###进入容器,并更新镜像源。
root@docker:~# docker exec -it 65fb138571d4 bash
root@65fb138571d4:/usr/local/apache2# cat <<'EOF' > /etc/apt/sources.list
deb http://mirrors.cernet.edu.cn/debian/ bullseye main contrib non-free
deb http://mirrors.cernet.edu.cn/debian/ bullseye-updates main contrib non-free
deb http://mirrors.cernet.edu.cn/debian/ bullseye-backports main contrib non-free
deb http://security.debian.org/debian-security bullseye-security main contrib non-free
EOF
###安装net-tools
root@65fb138571d4:/usr/local/apache2# apt update
...
root@65fb138571d4:/usr/local/apache2# apt install -y net-tools
...
###查看容器网卡信息。
root@65fb138571d4:/usr/local/apache2# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 3197 bytes 9848735 (9.3 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2549 bytes 145109 (141.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
二、Docker 网络驱动
Docker 拥有多种网络驱动程序,以提供核心网络功能。
- bridge
默认网络驱动程序,如未指定驱动程序,使用此网络类型。主要用于同一宿主机上不同容器之间的通信。
- host
对于独立容器,移除容器和 Docker 主机之间的网络隔离,并直接使用宿主机的网络。
- none
容器禁用所有网络,不能与外部通信。none 网络没有办法联网,封闭的网络能很好的保证容器的安全性。
- overlay
overlay 网络将多个 Docker 守护进程连接在一起,并使 swarm 服务能够相互通信。还可以使用 overlay网络促进 swarm 服务和独立容器之间的通信,或者在不同 Docker 守护进程上的两个独立容器之间的通信,实现跨主机通信。
- macvlan
macvlan 允许将 MAC 地址分配给容器,使其显示为网络上的物理设备。Docker 守护进程通过容器的 MAC 地址将流量路由到容器。有时使用 macvlan 驱动程序是最佳选择,比如在处理遗留应用程序时,希望直接连接到物理网络而不是通过 Docker 主机的网络堆栈路由。
- Network plugins
可以在 Docker 中安装第三方网络插件,这些插件可以从 Docker Hub 或第三方获得。
三、Docker 网络管理命令
使用 docker network --help 命令,可以查看 docker 网络相关的命令。
root@docker:~# docker network --help
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
Run 'docker network COMMAND --help' for more information on a command.
- docker network ls 查看已建立的网络对象。
常用命令参数:-f,过滤条件,如"driver=bridge"。
-q,只回显网络对象的ID。
安装好 Docker 后,默认会自动创建三个网络,可以使用命令查看。
###查看默认网络。
root@docker:~# docker network ls
NETWORK ID NAME DRIVER SCOPE
dc322c5dd3bc bridge bridge local
b1e9477f6959 host host local
1fbd8be30335 none null local
###查看桥接网络。
root@docker:~# docker network ls -f "driver=bridge"
NETWORK ID NAME DRIVER SCOPE
dc322c5dd3bc bridge bridge local
###查看桥接网络的ID。
root@docker:~# docker network ls -qf "driver=bridge"
dc322c5dd3bc
- docker network inspect 查看网络详细信息。
###查看默认bridge网络详细信息。
root@docker:/docker# docker network inspect bridge
[
{
"Name": "bridge",
"Id": "d91e497829267345e0d5ad9cd85f51e5ce25d736455cee57db62d3b0d8ea73c1",
"Created": "2023-02-22T16:04:44.832948002Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
- docker network create 创建新网络对象。
常用命令参数:-d,指定网络驱动(默认是"bridge")。
--subnet,指定子网网段。
--ip-range,指定容器的IP范围。
--gateway,指定子网网关。
###创建一个桥接网络,指定子网、IP范围和网关。
root@docker:/docker# docker network create --driver=bridge --subnet=192.168.0.0/16 --ip-range=192.168.100.0/24 --gateway=192.168.100.254 mybridge
e6fd1c4250936fb20cb3726c07fe0fbcddd762fb3839526e13fa25bcacac98d2
###查看创建的网络。
root@docker:/docker# docker network ls
NETWORK ID NAME DRIVER SCOPE
d91e49782926 bridge bridge local
b1e9477f6959 host host local
e6fd1c425093 mybridge bridge local
1fbd8be30335 none null local
- docker run --network 运行容器时指定网络。
###使用创建的mybridge网络运行一个httpd容器。
root@docker:/docker# docker run -d --name httpd -p 80:80 --net mybridge httpd
22fcd650fef5ab06f62cb78335234cb6333b0f0ff9026af73441e2130cfda1a4
root@docker:/docker# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
22fcd650fef5 httpd "httpd-foreground" 4 seconds ago Up 2 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp httpd
###查看容器ip地址。
root@docker:/docker# docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' httpd
192.168.100.0
###使用容器地址访问服务测试。
root@docker:/docker# curl http://192.168.100.0
<html><body><h1>It works!</h1></body></html>
- docker network rm 删除网络,需要先将使用该网络创建的容器停止并删除。
###直接删除网络,有报错。
root@docker:/docker# docker network rm mybridge
Error response from daemon: error while removing network: network mybridge id 0c21cd98605cd4e36e59b3af6cd5390c2c05f42cfa2668eaefb383ad0026db8b has active endpoints
###停止并删除使用该网络创建的容器。
root@docker:/docker# docker stop httpd
httpd
root@docker:/docker# docker rm httpd
httpd
###再次删除网络,成功。
root@docker:/docker# docker network rm mybridge
mybridge
root@docker:/docker# docker network ls
NETWORK ID NAME DRIVER SCOPE
d91e49782926 bridge bridge local
b1e9477f6959 host host local
1fbd8be30335 none null local
四、Docker 的四种网络模式
1、bridge模式
bridge 模式是 Docker 默认的网络通信模式,是开发者最常使用的模式。在 bridge 模式下,Docker引擎会创建独立的网络命名空间,这样就保证运行在每一个命名空间中的容器具有独立的网卡等网络资源。
利用 bridge 模式,可以非常方便地实现容器与容器之间、容器与宿主机之间的网络隔离。通过使用宿主机上的 docker0 网桥,可以实现 Docker 容器与宿主机乃至外部网络的网络通信。宿主机和宿主机上的其他容器可以通过容器 IP 访问容器中的服务,外部无法直接访问容器,需要建立容器与宿主机之间的端口映射,通过宿主机映射的端口才能访问容器中的服务。
###创建一个自定义bridge网络,并查看创建的网络。
root@docker:~# docker network create --driver=bridge --subnet=192.168.0.0/16 --ip-range=192.168.100.0/24 --gateway=192.168.100.254 mybridge
1ce3edb49bf147d7c8e815be15015c1340a8db671fb1a63e3f080b1d8486a1ae
root@docker:~# docker network ls
NETWORK ID NAME DRIVER SCOPE
544b79483258 bridge bridge local
b1e9477f6959 host host local
1ce3edb49bf1 mybridge bridge local
1fbd8be30335 none null local
###使用自定义mybridge网络创建一个容器,并通过--ip参数指定容器IP地址。
root@docker:~# docker run -d -p 80:80 --network=mybridge --ip=192.168.100.10 httpd
c7ee9141d7a3e4b5ddbf0e30072ef9ec9b31a5b00d0f2138b6e776c75e15417a
root@docker:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c7ee9141d7a3 httpd "httpd-foreground" 21 seconds ago Up 19 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp sweet_margulis
###进入容器,安装net-tools(更新软件源和安装操作,参考第一章节),查看容器网卡信息。
root@c7ee9141d7a3:/usr/local/apache2# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.100.10 netmask 255.255.0.0 broadcast 192.168.255.255
ether 02:42:c0:a8:64:0a txqueuelen 0 (Ethernet)
RX packets 1349 bytes 9606339 (9.1 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1182 bytes 67993 (66.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 10 bytes 924 (924.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 10 bytes 924 (924.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
###宿主机上通过容器IP地址,访问httpd服务测试。
root@docker:~# curl http://192.168.100.10
<html><body><h1>It works!</h1></body></html>
###再启动一个centos的容器,指定mybridge网络,地址为192.168.100.20.
root@docker:~# docker run -itd --network=mybridge --ip=192.168.100.20 centos
c544e04dec4740fb72dff1de9e873f6a135294c2f84c817ef9a0885d30167199
###进入centos的容器,查看IP地址,访问httpd的容器测试。
root@docker:~# docker exec -it c54 bash
[root@c544e04dec47 /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
165: eth0@if166: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:c0:a8:64:14 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.100.20/16 brd 192.168.255.255 scope global eth0
valid_lft forever preferred_lft forever
[root@c544e04dec47 /]# curl http://192.168.100.10
<html><body><h1>It works!</h1></body></html>
###外部网络通过宿主机及映射端口访问httpd容器服务。
root@docker:~# curl http://192.168.1.128:80
<html><body><h1>It works!</h1></body></html>
2、host模式
在使用 host 模式时,容器与宿主机共享同一个网络命名空间,容器IP地址和宿主机IP地址相同。如果宿主机具有公网的 IP 地址,则容器也拥有这个公网的 IP 地址。即容器可以直接使用宿主机的 IP 地址与外界进行通信,且容器内服务的端口也可以直接使用宿主机的端口。
###停止和删除前面启动的容器,使用host模式创建容器。
root@docker:~# docker stop c7ee
c7ee
root@docker:~# docker rm c7ee
c7ee
root@docker:~# docker run -d --network=host httpd
87077f55e08c8aa6613aeea23b3b4138713a3c2bb87c6b2dc4fcb2dee44c3264
###因为是host模式,在宿主机上可以直接用127.0.0.1访问服务。
root@docker:~# curl http://127.0.0.1
<html><body><h1>It works!</h1></body></html>
###查看宿主机和容器的网卡信息,因为是共享,所以信息是一致的。
##宿主机网卡信息:
root@docker:~# ifconfig
br-1ce3edb49bf1: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.100.254 netmask 255.255.0.0 broadcast 192.168.255.255
inet6 fe80::42:2cff:fea2:4764 prefixlen 64 scopeid 0x20<link>
ether 02:42:2c:a2:47:64 txqueuelen 0 (Ethernet)
RX packets 1363 bytes 58987 (58.9 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1566 bytes 9618192 (9.6 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:a9ff:fe70:a0a6 prefixlen 64 scopeid 0x20<link>
ether 02:42:a9:70:a0:a6 txqueuelen 0 (Ethernet)
RX packets 70236 bytes 2914998 (2.9 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 91308 bytes 198188119 (198.1 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.128 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::20c:29ff:fe1f:47c7 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:1f:47:c7 txqueuelen 1000 (Ethernet)
RX packets 1891509 bytes 2609128548 (2.6 GB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 419618 bytes 31516751 (31.5 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 1010 bytes 106807 (106.8 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1010 bytes 106807 (106.8 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
##容器网卡信息:
root@docker:/usr/local/apache2# ifconfig
br-1ce3edb49bf1: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.100.254 netmask 255.255.0.0 broadcast 192.168.255.255
inet6 fe80::42:2cff:fea2:4764 prefixlen 64 scopeid 0x20<link>
ether 02:42:2c:a2:47:64 txqueuelen 0 (Ethernet)
RX packets 1363 bytes 58987 (57.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1566 bytes 9618192 (9.1 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:a9ff:fe70:a0a6 prefixlen 64 scopeid 0x20<link>
ether 02:42:a9:70:a0:a6 txqueuelen 0 (Ethernet)
RX packets 70236 bytes 2914998 (2.7 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 91308 bytes 198188119 (189.0 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.128 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::20c:29ff:fe1f:47c7 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:1f:47:c7 txqueuelen 1000 (Ethernet)
RX packets 1898593 bytes 2619049663 (2.4 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 421389 bytes 31648476 (30.1 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 1010 bytes 106807 (104.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1010 bytes 106807 (104.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
使用 host 模式,尽管可以很方便地通过 localhost 或者 127.0.0.1 实现容器与宿主机的相互访问,并且性能也比较好,但这种模式也存在以下问题:
- 由于容器使用了宿主机的网络环境,因此网络环境的隔离性功能被减弱,从而造成宿主机和容器争用网络资源。容器本身也不再拥有所有的网络资源,而是与宿主机共享网络资源。
- 宿主机和容器使用了相同的 IP 地址,这不利于网络的配置和管理。
3、none模式
none 模式下的容器具有独立的网络命名空间,但不包含任何网络配置,只有 lo 回环网络,无法与外界进行通信,封闭的网络能很好地保证容器的安全性。
###使用none模式运行一个centos容器。
root@docker:~# docker run -itd --network=none centos
bf01798c9107579b1593a08666f8d7db344f2029eb7b8f0160a62b8794c56408
###进入容器查看网卡信息,只有一个lo网卡。
root@docker:~# docker exec -it bf0 bash
[root@bf01798c9107 /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
4、container模式
在 container 模式下,容器之间会共享网络环境,即一个容器会使用另一个容器的网络命名空间。因此,在这种模式下,容器之间可以通过 localhost 或者 127.0.0.1 进行相互间的访问,从而提高了传输的效率。
###停止和删除前面运行的容器。
略。
###先运行一个容器,并查看容器网络信息。
root@docker:~# docker run -d -p 80:80 httpd
29a3d9a721bac8246d32225517573a12bc21601e032a40bcbecd8f8ba81fb85e
root@docker:~# docker exec -it 29a bash
root@29a3d9a721ba:/usr/local/apache2# cat <<'EOF' > /etc/apt/sources.list
deb http://mirrors.cernet.edu.cn/debian/ bullseye main contrib non-free
deb http://mirrors.cernet.edu.cn/debian/ bullseye-updates main contrib non-free
deb http://mirrors.cernet.edu.cn/debian/ bullseye-backports main contrib non-free
deb http://security.debian.org/debian-security bullseye-security main contrib non-free
EOF
root@29a3d9a721ba:/usr/local/apache2# apt update
...略
root@29a3d9a721ba:/usr/local/apache2# apt install -y net-tools
...略
root@29a3d9a721ba:/usr/local/apache2# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 3060 bytes 9698793 (9.2 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2759 bytes 153096 (149.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
###使用container模式运行一个centos容器,并查看网络信息。
root@docker:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
29a3d9a721ba httpd "httpd-foreground" 5 minutes ago Up 5 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp hardcore_wiles
root@docker:~# docker run -itd --network=container:29a3d9a721ba centos
1349a56e8cc5753ea8603d26aaf5102483f0438cc6408585c312f98291588e92
root@docker:~# docker exec -it 134 bash
[root@29a3d9a721ba /]# yum install -y net-tools
...略
[root@29a3d9a721ba /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 3167 bytes 10048964 (9.5 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2867 bytes 160055 (156.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
###两个容器网络信息完全相同,在centos容器中,可以使用127.0.0.1访问httpd容器服务。
[root@29a3d9a721ba /]# curl http://127.0.0.1
<html><body><h1>It works!</h1></body></html>
总结
以上就是今天学习了解的容器网络相关的内容。