大家好我是木木,在当今快速发展的云计算与云原生时代,容器化技术蓬勃兴起,Docker 作为实现容器化的主流工具之一,为开发者和运维人员带来了极大的便捷 。下面我们一起开始进阶第5篇:查看网络列表、使用桥接模式、主机模式、无网络模式。
环境准备
默认环境已经准备好,没有准备的可以参考:Docker入门篇1:搜索镜像、拉取镜像、查看本地镜像列表、删除本地镜像-CSDN博客
操作实战
查看网络列表 docker network ls
通过该命令可以看到docker有哪些网络模式的列表。
下图可以看到,Docker默认有3种模式,分别是桥接、主机、无网络。
列名解析:
NETWORK ID:网络的唯一标识符
NAME:网络的名称
DRIVER:网络对应的驱动。不同驱动对网络有不同的功能。
bridge:bridge网络驱动,负责创建和管理网桥,实现容器间的网络通讯。
host:host网络驱动,直接使用宿主机的网络。
null:null网络驱动,表示没有网络功能。
SCOPE:说明网络的范围。local表示该网络只能在当前的Docker进程的宿主机有效。
容器设置使用桥接模式
注意命令最好手敲,直接复制可能有字符问题
docker run -d --name my_ubuntu_bridge1 --network bridge ubuntu sleep infinity
docker run -d --name my_ubuntu_bridge2 --network bridge ubuntu sleep infinity
启动2个ubuntu容器,名称分别为my_ubuntu_bridge1、my_ubuntu_bridge2,使用bridge网络
案例测试:
1、查看网络列表
2、下载unbutu镜像(docker pull ubuntu),启动2个ubuntu容器,名称分别为my_ubuntu_bridge1、my_ubuntu_bridge2
为什么启动ubuntu时要加入 sleep infinity 参数,下面会说到。
3、查看2个ubuntu的容器IP,输出:docker network inspect bridge,看到它们的IP分别是172.17.0.4、172.17.0.5
4、分别进入my_ubuntu_bridge1容器和my_ubuntu_bridge2容器 安装ping的命令。
此步如果安装的ubuntu镜像是完整镜像,自带ping的命令可以跳过此步。
博客主这边因为ubuntu没有ping命令所以需要进入容器安装。
docker exec -it my_ubuntu_bridge1 bash
apt-get update
apt-get install -y iputils-ping
安装完后exit退出容器,进入下一个容器安装。
5、使用my_ubuntu_bridge1容器 ping my_nginx_bridge2容器的IP。为什么不使用my_ubuntu_bridge1 ping 容器 my_nginx_bridge2的名称,下面会说到。
docker exec -it my_ubuntu_bridge1 ping 172.17.0.5
到此,根据图片可以看到 2个容器间的网络是已经互通。说明2个容器使用bridge网络模式,确实可以进行网络通讯。
下面使用主机模式,主机模式下每个容器也可以进行网络通讯,但是IP地址都是公用主机IP,每个容器没有自己独立IP地址。
容器设置主机模式
docker run -d --name my_ubuntu_host3 --network host ubuntu sleep infinity
docker run -d --name my_ubuntu_host4 --network host ubuntu sleep infinity
启动2个ubuntu容器,名称分别为my_ubuntu_host3、my_ubuntu_host4,使用host网络
其他操作同桥接模式一样,分别进入新建2个容器内 安装ping的命令。之后查看容器的IP,再使用ping命令进行测试。
通过上图可以看到使用主机模式同样可以进行网络或者容器间的通讯,但是容器并没有自己的IP地址,都是公用的主机IP。
容器设置无网络模式
启动ubuntu使用无网络模式
因为上面其他模式演示时用的ubuntu的镜像是简易版没有ping功能,但是可以联网安装ping命令的包。
目前我们无网络模式下,ubuntu没有ping命令,但是想要使用ping做测试,博客主通过Dockerfile文件重新构建一个带有ping命令的ubuntu镜像和脚本。需要的可以在https://download.csdn.net/download/m0_50572459/90596394进行下载。
该Dockerfile构建使用的是华为云swr仓库ubuntu系统是一个简易系统,支持ping命令。
docker run -d --name my_ubuntu_none1 --network none ubuntu-ping sleep infinity
通过上图可以看到,ping的时候提示网络不可达,说明网络不通,这是因为无网络模式下,容器没有被分配IP,它也无法和外部通讯。
常见问题
1、为什么启动ubuntu时要加入 sleep infinity 参数
ubuntu默认的启动命令是 /bin/bash,当我们使用容器docker run -d 后台模式运行时, /bin/bash执行完就会退出容器。这是因为/bin/bash执行完后没有其他的可持续运行任务。Docker监测到ubuntu中没有可持续运行的运行任务,它会认为该容器任务完成,就会自动退出。
Docker容器的运行机制是会依赖一个可持续运行任务,通过容器中会运行一些服务或者程序作为可持续的运行任务,比如应用程序、nginx这种中间服务作为可持续运维服务。此处我们启动ubuntu为它使用的可持续运行程任务是使用sleep infinity。
sleep infinity会使进程一直进入睡眠状态,不会结束,方便我们的使用操作。
2、使用my_ubuntu_bridge1 ping 容器 my_nginx_bridge2的名称,报ping: my_ubuntu_bridge2: Name or service not known
原因是容器内部没有对应DNS,所以解析不到容器名称。在Docker的 bridge 网络中默认是不会为容器配置DNS解析,这是因为在之前的docker版本中没有内置DNS服务。
解决方法:
方法一:启动容器时可以添加--dns 参数指定DNS的服务器或者是进入到容器中自己配置DNS解析。
方法二:通过自定义bridge网络。在Docker自定义网络时会默认配置DNS解析,主要原因是因为Docker内置DNS服务器,所以容器可以通过容器名进行通信。