文章目录
概述
本文为个人学习笔记,内容整理自B站尚硅谷周阳老师的docker教程视频,由于工作需要,本文仅整理高级篇部分关于docker network的部分66-77小节的视频,更多高级篇内容详见教程,原视频请点击这里,docker基础篇教程请点击这里
2023年5月26日更新高级篇docker network部分,未完待续…
docker network
1. 简介
启动docker,在宿主机上查看网络配置(可以使用ifconfig
命令也可以使用ip addr
命令),会发现网络配置中多出来一个docker0的虚拟网桥,在内核层连通了其他物理机或虚拟网卡,这就将所有容器和本地主机都放在同一个物理网络,用来实现宿主机与容器以及容器与容器之间的网络通信
2. 常用命令
(1)创建网络,常用于自定义网络模式中,默认使用网桥模式
docker network create 网络名称
(2)删除网络
docker network rm 网络名称
(3)删除所有无效不占用的网络
docker network prune 网络名称
(4)查看网络源数据
docker network inspect 网络名称
(5)查看当前网络
docker network ls
(6)将容器连接到某个网络上
docker network connect [options] 网络名称 容器名称
(7)将容器从某个网络上断开连接
docker network disconnect [options] 网络名称 容器名称
实验一:创建网络mytest,新建容器u1配置该网络,在容器停止运行的情况下删除网络后,启动容器会失败,配置容器的网络断开mytest网络的配置,重新配置容器的网络为bridge模式,启动容器成功
3. 作用
(1)实现容器间的互联和通信以及端口映射
(2)容器ip变动时候可以通过容器名直接网络通信而不受到影响(具体看4.5小节)
4. 网络模式类型
4.1 bridge模式
该模式下会给每个容器独立分配ip,并将容器连接到docker0虚拟网桥,该模式是容器网络配置的默认模式。使用--network bridge
命令指定bridge模式
如上图所示,在bridge模式下,宿主机和容器之间,容器与容器之间,通信都需要通过docker0网桥
(1)使用桥接模式时,会在宿主机中虚拟一个网桥docker0,docker启动一个容器时会根据网桥docker0的网段分配给容器一个ip地址,成为container-ip,同时网桥docker0是每个容器的默认网关。同一宿主机内的容器都接入同一个网桥docker0,这样容器之间就能够通过容器的container-ip直接通信
(2)网桥docker0类似一个交换机有多个接口,每个接口都叫veth,在本地主机和每一个容器都会创建一个虚拟接口eth0,他们通过网桥docker0彼此联通,这样一对接口叫veth pair
实验二:以后台运行方式创建ubuntu容器后,查看容器状态发现容器没有运行,再次启动ubuntu容器后查看容器状态发现容器依旧没有运行
(一个小坑,若ubuntu以后台运行方式创建实例,则会在创建的同时被docker杀掉,如下图所示)
实验三:创建两个ubuntu容器u1和u2,u1不指定网络配置模式,u2指定网络配置模式,创建后查看u1和u2的网络配置情况和宿主机的网络配置情况,发现u1和u2都是bridge网络模式,并且宿主机网络配置情况会多出两个端口对应情况,测试u1和u2容器的ping通情况,测试宿主机和u1和u2容器的ping通情况
查看u1和u2的网络配置信息,发现未指定网络配置的u1使用了默认模式,bridge
在ubuntu容器实例u1和u2中使用ip、ifconfig、ping命令时,需要使用apt-get进行安装,看这里
查看宿主机网络配置,发现多了两个veth和eth0对应端口的匹配(veth是网桥docker0的接口,eth0是容器上虚拟网卡的接口)
查看u1和u2的网络配置,发现各自多了一个veth和eth0的端口匹配
u1和u2能够相互ping通
宿主机能够ping通u1和u2
实验四:创建两个ubuntu容器u1和u2,查看ip地址然后删除容器u2,创建容器u3,查看ip地址,发现之前分配给u2的ip地址现在分配给了u3,测试u1和u3基于ip的ping通情况
使用实验三创建的ubuntu容器u1和u2,查看ip
删除容器u2,创建容器u3,查看ip,发现之前分配给u2的ip地址现在分配给了u3,说明容器的ip地址分配是动态变化的,因此在生产情况下基于bridge的网络模式不能基于ip地址来实现网络通信,要使用容器名来实现通信才比较合理,而自定义网络模式则提供了基于容器名的网络通信,详见4.5
u1和u3能够相互ping通
4.2 host模式
该模式下不会给容器分配独立的ip地址,而是共用宿主机的ip地址与外界通信
实验五:创建网络配置为host模式的ubuntu容器,查看其ip情况
以host模式创建容器u1,查看ip,发现和宿主机执行ifconfig
命令的返回界面一模一样,ip地址也相同
4.3 none模式
该模式下不会给容器分配ip地址等网络配置,查看ip信息只会有一个本地回环地址,网络配置需要自己进行配置,生产环境中基本不用这种模式
4.4 container模式
该模式下容器的网络配置会和指定的容器的网络配置相同,但是这种模式下有一个坑,当某些容器占用了指定端口后,再新建一个容器使用container模式与该容器共享网络配置时,会导致端口冲突
使用以下命令指定container模式下共享网络配置的容器
--network=container:容器实例名称
实验六:bridge模式新建一个ubuntu容器u1,container模式新建一个ubuntu容器u2共享u1的网络配置,查看网络配置情况,容器u1停止运行,进入容器u2查看网络配置情况
4.5 自定义模式
该模式下创建容器时需要指定自己创建的网络,可以实现使用容器名进行通信,原理是自定义模式下将容器ip和容器名绑定在一起了,因此不管ip地址如何变化,只要容器名不变,就可以实现通信,在生产环境中较为常见
实验七:创建自定义网络mynetwork1和mynetwork2,创建ubuntu容器u1和u2使用mynetwork1自定义网络,创建ubuntu容器u3使用mynetwork2自定义网络,测试三者的ping通情况,删除u2,再创建u3使用network1,再创建u2使用network1,查看网络情况,此时u2的ip会改变,测试u1与u2的ping通情况
容器u1能够ping通在同个自定义网络的容器u2,但不能ping通在不同个网络的容器u3
容器u2能够ping通在同个自定义网络的容器u1,但不能ping通在不同个网络的容器u3
容器u3不能ping通在不同个网络的容器u1和u2
删除u2,使用mynetwork1网络创建u4,发现u4会使用了u2的ip,再度使用mynetwork1创建u2时,会发现u2此时的ip发生了变化,但是这并不妨碍u1使用容器名u2来ping通u2,这便是使用自定义网络模式的好处!