目录
1. 是什么
1.1 Docker 不启动,默认网络情况
执行ifconfig命令会出现3个东西:
- ens33:本地宿主机的地址
- lo:本地回环链路
- virbr0:在CentOS7的安装过程中如果有选择相关虚拟化的服务安装系统后,启动网卡时会发现有一个以网桥连接的私网地址的virbr0网卡(virbr0网卡:它还有一个固定的默认IP地址:192.168.122.1),是做虚拟机网桥使用的,其作用是为连接其上的虚拟网卡提供NAT访问外网的功能。
1.2 Docker 启动后,网络情况
执行ifconfig命令,会发现除了上面3个外,还有一个docker0的虚拟网桥。
通过docker0这个虚拟网桥和宿主机以及容器和容器之间docker的网络通信。
2. 能干什么
容器间的互联和通信以及端口映射
容器IP变动时候可以通过服务名直接网络通信,而不受到影响
3. 常用的基本命令
[root@192 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
915418bfd4c2 bridge bridge local
4efb24f4052c host host local
00b385ce1061 none null local
[root@192 ~]# 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.
4. 网络模式
4.1 总体介绍
网桥模式 |
简介 | 命令 |
bridge | 为每一个容器分配、设置IP等,并将容器连接到一个docker0的虚拟网桥,默认为该模式 | --network bridge |
host | 容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口 | --network host |
none | 容器有独立的network namespace,但并没有对其进行任何网络设置,如分配veth pair和网桥连接等 | --network nonw |
container | 新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP、端口等 | --network container:NAME或容器ID |
docker容器内部的ip是由可能会变的。
4.2. bridge
[root@192 ~]# docker network inspect bridge
[
{
"Name": "bridge",
"Id": "915418bfd4c23739d46c6a4e18c3e37caeda86d1edbe46761f4ffdc68a36d35c",
"Created": "2024-03-27T15:47:41.733889499+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"
}
]
},
4.2.1 是什么
docker服务默认会创建一个docker0的网桥(其上有一个docker0内部接口),该桥接网络的名称为docker0,它在内核层联通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。Docker默认指定了docker0接口的IP地址和子网掩码,让主机和容器之间可以通过网桥互相通信
4.2.2 深入理解bridge
- Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时时会根据Docker网桥的的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能通过容器的Container-IP直接通信。
- docker run 的时候,没有指定network的话,默认使用的网桥模式就是bridge。在宿主机ifconfig就可以看到docker0和自己create的network eth0 eth1 eth2...代表网卡一、网卡二、网..,lo代表127.0.0.1,即localhost,inet addr用来表示网卡的IP地址。
- 网桥docker0创建一对对等虚拟设备接口一个叫veth,另一个叫eth0,成对匹配。
3.1. 整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫veth,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通
3.2. 每个容器实例内部也有一块网卡,每个接口叫eth0
3.3. docker0上面的每个veth匹配某个容器实例内部的eth0,俩俩配对,一一匹配
通过上述,将宿主机上的所有容器都连接到这个内部网络上,俩个容器在同一个网络下,会从这个网关下各自拿到分配的ip。此时俩个容器的网络是互通的
4.3 host
4.3.1 是什么
直接使用宿主机的IP地址与外界进行通信,不在需要额外的NAT转换。
4.3.2 深入理解host
容器将不会获得一个独立的Network Namespace,而是和宿主机公用一个Network Namespace。容器将不会虚拟出自己的网卡而是使用宿主机的IP和端口。
4.4. none
4.4.1 是什么
禁用网络功能,只有lo标志(就是127.0.0.1表示本地回环)
在none模式下,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息,只有一个lo。需要我们自己为Docker容器添加网卡、配置IP等。
4.5. container
4.5.1 是什么
新建的容器和已经存在的容器共享一个网络ip配置而不是和宿主机共享。新创建的容器不会创建自己的网络、配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,俩个容器除了网络方面,其他的都还是隔离的。
4.6 自定义网络
docker netword rm YOUR_NAME
4.6.1 使用自定义网络之前
场景:在同一宿主机上同一image启动俩个tomcat容器,名字分别是tomcat81和tomcat82。启动之后分别进入tomcat81和tomcat82容器中查看自己的ip地址,然后通过IP地址ping对方,这是没有问题。然后通过服务名ping对方,ping不通。
如果执行 ip addr 或者 ping xxx 找不到命名,执行下面命令。
apt update
apt install -y iproute2
apt-get install iputils-ping
4.6.2 使用自定义网络之后
场景:在同一宿主机上同一image上通过 --network YOUR_NETWORK_NAME 启动俩个tomcat容器,名字分别是tomcat83和tomcat84。启动之后分别进入tomcat83和tomcat84容器中,然后通过服务名ping对方,可以ping通。
自定义桥接网络默认使用的是桥接网络bridge。
4.6.2.1 新建自定义网络
docker network create dylan_network
4.6.2.2 新建容器加入自定义网络
docker run -d -p 8083:8080 --network dylan_network --name tomcat83 tomcat
docker run -d -p 8084:8080 --network dylan_network --name tomcat84 tomcat
结论:自定义网络本身就维护好了主机名和ip的对应关系(ip和域名都能ping通)