首页技术栈归档照片墙音乐日记随想收藏夹友链留言关于

Docker 网络

写作时间:2026-07-07
# 网络

Docker网络

docker网络所有命令有误

理解网络

docker是如何处理容器网络访问的?

#清除所有的安装的容器docker rmi -f $(docker images -q)
[root@yuan ~]# docker run -d -P --name tomcat01 tomcat

# 查看容器的内部网络地址 ip addr,发现容器启动的是否会得到一个eth0@if85 ip地址,docker分配
[root@yuan ~]# docker exec -it tomcat01 ip addr
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
84: eth0@if85: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

# 思考Linux能不能ping通容器内部
[root@yuan ~]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.395 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.149 ms

# Linux可以ping通docker容器内部

原理

我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0桥接模式,使用的技术是evth-pair技术

再次测试ip addr,多了一对网卡

![](/upload/articles/ip addr.png)

# 我们发现这些网卡都是一对对的
# veth-pair 就是一对的虚拟设备接口,它们都是成对出现的,一段连着协议,一段彼此相连
# 正因为有这个特性veth-pair充当一个桥梁,连接各种虚拟网络设备
# OpenStack,Docker容器之间的连接,OVS的连接,都是使用veth-pair技术

结论:tomcat01和tomcat02是共用的一个路由器,docker0

所有的容器在不指定网络的情况下,都是由docker0路由的,docker会给我们的容器分配一个默认的可用ip

Docker使用的是Linux桥接,宿主机中是一个Docker容器的网桥 docker0

Docker中所有的网络接口都是虚拟的,虚拟的转发效率比较高(内网传递文件)

只要容器删除,对应的网桥就没了

容器互联--Link

#无法直接ping通
[root@yuan ~]# docker exec -it tomcat01 ping tomcat02
OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "ping": executable file not found in $PATH: unknown
#通过link解决无法ping通的问题     
[root@yuan ~]# docker run -d -P --name tomcat03 --link tomcat02 tomcat
f5a0ca81fbe09fbfe68a774439a7060c7defd9052d0607fb6edd9fe52d02289b
[root@yuan ~]#docker exec -it tomcat03 ping tomcat02

[root@yuan ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
16a982e24a11   bridge    bridge    local
8136fc0f97dd   host      host      local
21c46ca55896   none      null      local
[root@yuan ~]# docker inspect 16a982e24a11

探究原理

[root@yuan ~]# docker exec -it tomcat03 cat /etc/hosts
127. 0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172. 17.0.3	tomcat02 798f4caab6e3
172. 17.0.4	0050dfc49003

--link就是我们在hosts配置中增加了一个172.18.0.3 tomcat02 798f4caab6e3

其实这个tomcat03就是本地配置了tomcat02的配置

本质探究:–link就是我们在hosts配置中增加了一个172.17.0.3 tomcat02 9f6a048802b9

我们现在 玩Docker已经不建议使用–link了!

自定义网络!不适用于docker0!

自定义网络

查看所有的docker网络

docker network ls

网络模式

bridge:桥接 docker(默认,自己创建的也是使用bridge模式)

none:不配置网络

host:和宿主机共享网络

container:容器内网络连通!(用的少!局限很大)

测试

清除所有安装的容器:docker rmi -f $(docker images -q)

# 我们直接启动的命令 --net bridge 而这个就是我们的docker0
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --net bridge tomcat

# docker0特点:默认,域名不能访问,--link可以打通连接  
# 我么可以自定义一个网络   
# 我么可以自定义一个网络
# --driver bridge
# --subnet 192.168.0.0/16 192.168.0.2 192.168.255.255
# --gateway 192.168.0.1   
[root@yuan ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
02de698446c3bdb338b6333f19faca6bde36dc53718cd7fe981c70cfe125af74
[root@yuan ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
16a982e24a11   bridge    bridge    local
8136fc0f97dd   host      host      local
02de698446c3   mynet     bridge    local

自定义的网络

[root@yuan ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat
98527f2ee2cdf277eb0be601744290390663cb93b2ff7b0340b2a74c90e913c9
[root@yuan ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat
e7e50b5b666d9d641a5c7ac78b034334483eaea54b6e57fc953f7cb014ce4e14

# 现在不需要使用--link也可以ping名字了!
[root@yuan ~]# docker exec -it tomcat-net-01 ping tomcat-net-02
PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.087 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.164 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.116 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=4 ttl=64 time=0.103 ms

**小结:**我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐使用这个网络

好处:

redis - 不同集群使用不同的网络,保证集群是健康和安全的

mysql - 不同集群使用不同的网络,保证集群是健康和安全的

网络联通

测试

[root@yuan ~]# docker run -d -P --name tomcat01 tomcat
7ec75032e914fc8bc13b91ab60d2dd15f8644b1e240233a3b07b79f690206477
[root@yuan ~]# docker run -d -P --name tomcat02 tomcat
98321d687578d7bb64fe23933c9a7a6beecd9f14c405439b131615be654130a7


网络联通1

# 测试打通 tomcat01 - mynet
[root@yuan ~]# docker network connect mynet tomcat01

# 连通之后将tomcat01放到了mynet网络下

# 一个容器两个ip地址 阿里云服务:公网ip 私网ip

# tomcat01 和tomcat-net-01是打通的
[root@yuan ~]# docker exec -it tomcat01 ping tomcat-net-01
PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.099 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.139 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.165 ms

# tomcat02 和tomcat-net-01是没打通的
[root@yuan ~]# docker exec -it tomcat02 ping tomcat-net-01
ping: tomcat-net-01: Name or service not known

**结论:**如果需要跨网络操作别人,就需要使用docker network connect进行连通

avatar

yuanyourdomain

写代码,做研究,记录生活。

RECOMMENDED

MyBatis 动态 SQL

2026-07-08

Nginx 基础入门

2026-07-08

Maven 多模块与私服

2026-07-08