主页 > 互联网  > 

Docker网络模式实战

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 /">nginx </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

 

标签:

Docker网络模式实战由讯客互联互联网栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“Docker网络模式实战