Docker网络模式实战
docker的镜像是令人称道的地方,但网络功能还是相对薄弱的部分
docker安装后会自动创建3种网络:bridge、host、none
docker原生bridge网路
docker安装时会创建一个名为 docker0 的Linux bridge,新建的容器会自动桥接到这个接口
docker安装时会创建一个名为 docker0 的Linux bridge,新建的容器会自动桥接到这个接口
-
bridge模式下容器没有一个公有ip,只有宿主机可以直接访问,外部主机是不可见的。
-
容器通过宿主机的NAT规则后可以访问外网
docker原生网络host
host网络模式需要在容器创建时指定 --network=host host模式
可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少 隔离性
docker run -it --name test --network host busybox
#如果公用一个网络,那么所有的网络资源都是公用的,比如启动了nginx容器那么真实主机的80端口被占
用,在启动第二个nginx容器就会失败
docker 原生网络none
none模式是指禁用网络功能,只有lo接口,在容器创建时使用--network=none指定。
docker的自定义网络
docker提供了三种自定义网络驱动:
-
bridge
-
overlay
-
macvlan
bridge驱动类似默认的bridge网络模式,但增加了一些新的功能,
overlay和macvlan是用于创建跨主机网络
自定义桥接网络
[root@k8s-master ~]# docker network create my_net1
f40b3816e3871d65cd52db8720c5912faf5a2929e56455db4f2ae0b606ae6d2f
[root@k8s-master ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
e8c1c59371c7 bridge bridge local
7172dc5dc9d3 host host local
f40b3816e387 my_net1 bridge local
5451367be09b none null local
桥接默认是单调递增
桥接也支持自定义子网和网关
[root@k8s-master ~]# docker network create my_net2 --subnet 192.168.0.0/24 --gateway 192.168.0.100
aee5e62af64a74d6b4c4dcf38b01b8f94932d2d8966560c8706bed82b33d41bf
[root@k8s-master ~]# docker network inspect my_net2
[
{
"Name": "my_net2",
"Id": "aee5e62af64a74d6b4c4dcf38b01b8f94932d2d8966560c8706bed82b33d41bf",
"Created": "2025-03-02T05:23:21.965532026-05:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/24",
"Gateway": "192.168.0.100"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
为什么要自定义桥接?
docker引擎在分配ip时时根据容器启动顺序分配到,谁先启动谁用,是动态变更的
多容器互访用ip很显然不是很靠谱,那么多容器访问一般使用容器的名字访问更加稳定
docker原生网络是不支持dns解析的,自定义网络中内嵌了dns
web1:
web2:
#关闭容器后重启容器,启动顺序调换
[root@docker ~]# docker stop web1 web2
web1
web2
[root@docker ~]# docker start web2
web2
[root@docker ~]# docker start web1
web1
#我们会发容器ip颠倒
如何让不同的自定义网络互通?
[root@k8s-master ~]# docker run -d --name web1 --network my_net1 nginx
[root@k8s-master ~]# docker run -it --name test --network my_net2 busybox
[root@k8s-master ~]# docker run -it --name test --network my_net2 busybox
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:C0:A8:00:01
inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
/ # ping 172.18.0.2
PING 172.18.0.2 (172.18.0.2): 56 data bytes
#可见ping不通,接下来连接网络
[root@k8s-master ~]# docker network connect my_net1 test
/ # ping 172.18.0.2
PING 172.18.0.2 (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.362 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.164 ms
joined容器网络
Joined容器一种较为特别的网络模式,•在容器创建时使用--network=container:vm1指定。
处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用localhost高效快速通 信。
[root@k8s-master ~]# docker run -it --rm --network container:web1 busybox
[root@k8s-master ~]# docker run -it --rm --network container:web1 centos:7
Unable to find image 'centos:7' locally
7: Pulling from library/centos
2d473b07cdd5: Pull complete
Digest: sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4
Status: Downloaded newer image for centos:7
[root@7dd2aec1b01b /]# curl localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
joined网络示例演示
利用容器部署phpmyadmin管理mysql
[root@k8s-master ~]# docker run -d --name mysqladmin --network my_net1 -e PMA_ARBITRARY=1 -p 80:80 phpmyadmin:latest
[root@k8s-master ~]# docker run -d --name mysql -e MYSQL_ROOT_PASSWORD='lee' --network container:mysqladmin mysql:5.7