Docker网络
docker网络介绍
docker未启动时,默认网络情况
1
2
3
4
5
6
7
8
docker 未启动时,不包含docker0的虚拟网络
lo: 本地网络(localhost)
virbr0: 在CentOS7的安装过程中,如果有选择相关虚拟化的服务安装系统后,启动网卡时会发现有一个以网桥连接的私网地址的virbr0网卡(virbr0网卡:它还有一个固定的默认IP地址 192.168.122.1 ),是做虚拟机网桥使用的,其作用是为连接其上的虚拟网卡提供NAT访问外网的功能
#: 在Linux安装,勾选安装系统时候附带了libvirt服务才会生成的一个东西,如果不需要可以直接将libvirt服务卸载; yum remove libvirt-libs.x86_64docker启动后,网络情况
1
2
docker 启动后,会产生一个名为 docker0 的虚拟网桥
docker网络命令
全部命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@CentOS7_001 zyd]# 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.
[root@CentOS7_001 zyd]#查看
docker网络模式1
2
3
4
## 查看docker网络模式命令
docker network ls查看
docker网络源数据1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43# 命令结构
docker network inspect [OPTIONS] NETWORK [NETWORK...]
[root@CentOS7_001 zyd]# docker network inspect bridge
[
{
"Name": "bridge",
"Id": "f5a026bc1a0286e3d6d8a5704cf25a60f7cd16e893a9d58f0b3b39a8d350aa28",
"Created": "2023-07-03T09:44:52.274931144+08:00",
"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网络1
2
3
4# 命令结构
docker network create [OPTIONS] NETWORK
docker network create my_network删除
docker网络1
2
3
4# 命令结构
docker network rm NETWORK [NETWORK...]
docker network rm my_network
docker网络作用
容器间的互联和通信以及端口映射
容器IP变动的时候可以通过服务名直接网络通信而不受到影响
docker网络模式
网络模式介绍
| Network | Description | 使用 |
|---|---|---|
| none | No networking in the container. 容器有独立的 Network namespaces ,但并没有对其进行任何网络设置,如分配 veth pair 和网桥连接, IP等 |
–network none |
| bridge (default) | Connect the container to the bridge via veth interfaces. 为每一个容器分配、设置IP等,并将容器连接到一个 'docker0' 虚拟网桥,默认为该模式 |
–network bridge 默认使用docker0 |
| host | Use the host’s network stack inside the container. 容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口 |
–network host |
| container:<name|id> | Use the network stack of another container, specified via its name or id. 新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP、端口范围等 |
–network container:NAME或容器ID指定 |
| NETWORK | Connects the container to a user created network (using docker network create command) 将容器连接到用户创建的网络(使用命令) |
容器实例内默认网络IP生产规则
案例
成功创建两个
ubuntu容器u1和u21
2
3
4
5[root@CentOS7_001 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dd1fcd31d420 ubuntu "/bin/bash" About a minute ago Up 5 seconds u2
1dbdb42b4518 ubuntu "/bin/bash" 8 minutes ago Up 3 minutes u1
[root@CentOS7_001 ~]#查看
u1和u2内部network实例u1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23[root@CentOS7_001 ~]# docker inspect u1 |tail -n 20
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "f5a026bc1a0286e3d6d8a5704cf25a60f7cd16e893a9d58f0b3b39a8d350aa28",
"EndpointID": "ae82e5b9bc2c3b2d6d35fed23f836b712e1dc7a7f53ff6750279b9ea8273400a",
"Gateway": "172.17.0.1", # 固定网关,不会变化
"IPAddress": "172.17.0.2", # 容器ip
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}
}
}
}
]
[root@CentOS7_001 ~]#u2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@CentOS7_001 ~]# docker inspect u2 |tail -n 20
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "f5a026bc1a0286e3d6d8a5704cf25a60f7cd16e893a9d58f0b3b39a8d350aa28",
"EndpointID": "072a0543108455076d68be272cd03d395ae8be6a7fde1dcac461e86416f61a50",
"Gateway": "172.17.0.1", # 固定网关
"IPAddress": "172.17.0.3", # 容器ip
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:03",
"DriverOpts": null
}
}
}
}
]
[root@CentOS7_001 ~]#通过查看
u1和u2容器实例对比,固定网关IP为172.17.0.1,容器IP自动递增测试,关闭
u2,启动容器u3查看内部实例关闭
u21
2
3
4
[root@CentOS7_001 ~]# docker stop u2
u2
[root@CentOS7_001 ~]#启动
u31
2
3
4
5
6
7
8[root@CentOS7_001 ~]# docker run -it --name u3 ubuntu /bin/bash
root@97b2e870414a:/# [root@CentOS7_001 ~]#
[root@CentOS7_001 ~]#
[root@CentOS7_001 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
97b2e870414a ubuntu "/bin/bash" 10 seconds ago Up 9 seconds u3
1dbdb42b4518 ubuntu "/bin/bash" 15 minutes ago Up 9 minutes u1
[root@CentOS7_001 ~]#查看
u3容器实例1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@CentOS7_001 ~]# docker inspect u3 |tail -n 20
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "f5a026bc1a0286e3d6d8a5704cf25a60f7cd16e893a9d58f0b3b39a8d350aa28",
"EndpointID": "a4c555dec467f15fc947eee14cfde60c4e4ea7e82dfbd7d48c4f538ceeb71ea2",
"Gateway": "172.17.0.1", # 固定网关
"IPAddress": "172.17.0.3", # 容器ip
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:03",
"DriverOpts": null
}
}
}
}
]
[root@CentOS7_001 ~]#
结论
docker 内部的容器IP是会发生变化的
网络模式案例说明
bridge
docker服务默认会创建一个
docker0网桥(其上有一个docker0内部接口),该网桥网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一物理网络。docker默认指定了docker0接口的IP地址和子网掩码,让主机和容器之间可以通过网桥相互通信
查看
bridge网络详细信息详细说明


详情版

1 | 1.Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个ip地址,称为Container-IP,同时Docker网络是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能通过容器的Container-IP通信。 |

实例
1 | ### 启动两个容器 |
bridge网络案例

host
直接使用宿主机的IP与外界进行通信,不再需要额外进行NAT转换
1 | 容器将不会获得一个独立的Network Namespace,而是和宿主机公用一个Network Namespace。容器将不会虚拟出自己的网卡而是使用宿主机的IP和端口 |

实例
1 | ### 启动一个容器,使用host模式 |
host网络案例



在使用host网络模式时,不需要设置 -p 的端口映射,如何访问容器?
http:宿主机IP:8080/
可以直接使用
IP+默认端口号,可以访问成功;因为此时容器的IP借用主机的,所以容器共享宿主机网络IP;这样的好处就是外部主机和容器可以直接通信
none
在none模式下,并不为Docker容器进行网络配置
也就是说,这个Docker容器没有网卡、IP、路由等信息;只有一个lo需要我们自己为Docker容器添加网卡、配置IP等
禁用网络功能,只有lo表识(就是127.0.0.1表示本地回环)
案例
1 | ### 启动一个容器,使用none模式 |
none网络案例

container
container网络模式
新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP,端口范围等。同样,两个容器除了网络方面,其他的如文件系统,进程列表等还是隔离的。

演示案例
由于tomcat会公用同一个ip和同一个端口,导致端口冲突,不适合使用tomcat演示;
换个镜像演示
Alpine Linux是一款独立的,非商业的通用的Linux发行版,专为追求安全性,简单性和资源效率的用户而设计.因为它小,简单而且安全;所以作为基础镜像是非常好的一个选择.
案例
1 | ## 启动两个alpine容器 |
网络案例

由于此时 alpine2依赖 alpine1的网络;如果此时关闭 alpine1;在观察alpine2
1 | ## 演示案例,关闭alpine1服务;观察alpine2容器网络 |
自定义网络
- docker link 介绍
容器互联
– link 可以通过容器名互相通信,容器间共享环境变量
– link 主要用来解决两个容器通过ip地址连接时
容器ip地址会变的问题
–link案例
1 | ## 先创建启动mysql容器 |
1 | ## 创建启动源容器wordpress |
验证: 连通性验证
1 | ## 启动的容器host |
自定义网络案例
- 使用自定义网络之前
1 |
|
- 使用自定义网络
自定义桥接网卡:自定义网络默认使用的是桥接网络
brideg
1 | ## 新建自定义网络 |
结论
自定义网络本身就维护好了主机名和ip的对应关系(ip和域名都名能通)
贴一个架构图




