我们已经了解了容器的基本创建和使用 接下来我们讲讲两个容器之间通信时或容器想访问外网时是如何实现的~
我们先来看看容器的常用网络类型
我们先拉取一个轻量的linux alpin
docker pull alpin
docker 网络类型分类
none
容器不分配网卡
docker container run -id –name test –network none alpin
#进入容器查看测试结果 它只有回环网卡
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
/ #
host
使用宿主机网络,也是无需分配网卡,直接宿主机的网络,性能最高
docker container run -id –name test-host –network host alpine
#进入容器查看测试结果 它共享了宿主机的网卡
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: services1@services1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 12:91:4c:f8:97:6e brd ff:ff:ff:ff:ff:ff
inet 192.168.65.6/32 scope global services1
valid_lft forever preferred_lft forever
inet6 fdc4:f303:9324::6/128 scope global
valid_lft forever preferred_lft forever
inet6 fe80::1091:4cff:fef8:976e/64 scope link
valid_lft forever preferred_lft forever
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN qlen 1000
link/ether 32:91:1a:33:4d:54 brd ff:ff:ff:ff:ff:ff
inet 192.168.65.3/24 brd 192.168.65.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fdc4:f303:9324::3/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::3091:1aff:fe33:4d54/64 scope link
valid_lft forever preferred_lft forever
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
link/ether 02:42:3f:4f:d7:6b brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:3fff:fe4f:d76b/64 scope link
valid_lft forever preferred_lft forever
/ #
bridgecour
桥接模式,会为容器分配虚拟网卡 默认就是桥接模式
docker container run -id –name test-bridge –network bridge alpine
#进入容器查看测试结果 它桥接了宿主机的eth0
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
37: eth0@if38: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
/ #
container
和一个已经存在的容器共享网络
docker container run -id –name test-container –network container:test-bridge alpine
#进入容器查看测试结果 它共享了test-bridge的网卡信息
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
37: eth0@if38: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
/ #
custom
单机自定义网络,内置了DNS解析功能,可以实现基于容器名称相互访问
可以将容器名称解析为对应的IP地址
创建一个自定义网络试试看
#docker network create -d bridge –gateway 172.20.0.254 –subnet 172.20.0.0/16 –ip-range 172.20.100.0/24 custom-net
#解释
– 网络类型 桥接网络(bridge)
– 子网范围 `172.20.0.0/16`
– 自动分配 IP 范围(分配给容器的IP范围)`172.20.100.0/24`
– 默认网关 `172.20.0.254`
– 网关地址 gateway
– 子网地址 subnet
– 容器分配的IP地址范围 ip-range
我们最后创建了自定义网络 那么我们该怎么查看~
查看网络的类型
#查看网络类型是none类型的容器有哪些
docker network ls
#查看网络类型是none类型的容器有哪些
docker network inspect none
#查看网络类型是host类型的容器有哪些
docker network inspect host
测试自定义网络类型
使用自定义网络时与上述命令相同
#创建自定义网络容器test1
docker container run -it –name test1 –network custom-net alpine
#创建自定义网络容器test2
docker container run -it –name test2 –network custom-net alpine
#可以进入容器测试两个容器时可以互相通信的
现在我们想移除网络怎么办~
移除网络
前提是网络没有被容器占用 才能删除
移除所有未使用的网络
#创建了一个空的网络
docker network create none
#移除没有使用的网络
docker network prune -f
移除所有未使用的网络
移除指定网络
#创建了一个自定义网络 gox 和 gom
docker network create gox
docker network create gom
#删除一个自定义网络 gox
docker network rm gox