docker 几种网络模式
- bridge模式
使用–net=bridge参数指定网络模式,docker的默认模式就是bridge模式,默认选择bridge的情况下,容器启动的时候会通过DHCP获取一个ip地址,这可能不是我们想要的,在centos系统下,可以通过pipework脚本对容器分配固定ip,(这个ip可以和宿主机同网段)。
pipework缺陷:容器重启后 IP 设置会自动消失,需要重新设置。 - host模式
使用–net=host参数指定网络模式。
共享宿主机的网络设置 - none模式
使用–net=none参数指定网络模式
创建的容器没有网络设置,只有lo回环网络设置 - container模式
使用–name=container:容器名称 or 容器id参数指定网络模式。
该模式是指创建新容器时,可以通过该参数指定其和一个已存在的网络容器共享一个network namespace。如下图所示,黄色容器的网卡共享左边绿色容器的,因此不会拥有自己独立的ip,而是会共享左边容器的ip和端口范围。两个容器间通过lo进行通信。
常用基本命令
- 查看docker网络
docker network ls
默认创建3种网络,分别为bridge、host、none。
- 查看完整的网络id
docker network ls --no-trunc
- 创建网络,默认为bridge模式
docker network create van
- 删除docker网络
docker network rm van
- 查看网络详细信息
docker network inspect bridge
- 将正在运行的容器连接到指定的网络
docker network connect 网络名 正在运行的容器
- 容器启动时设置网络
docker run -itd --network=网络名 即将启动的容器
- 指定容器的ip地址
docker network connect --ip 10.10.10.10 网络名 容器
- 删除所有无用的网络
docker network prune
- 强制断开容器的网络连接
docker network disconnect 网络名 容器
实战
我们启动两个centos的镜像,分别为c1、c2
docker run -it --name c1 mycentos:1.5 /bin/bash
docker run -it --name c2 mycentos:1.5 /bin/bash
-
c1的网络设置如下所示
-
c2的网络设置如下所示
-
在c1里面ping c2的网络地址是可以ping通的,如下所示
-
在c2里面ping c1的网络地址是可以ping通的,如下所示
-
此时我们先关闭c1、在创建容器c3、最后启动c1,观察下c1和c3的网络配置
#关闭c1
docker stop c1
#创建c3的指令
docker run -it --name c3 mycentos:1.5 /bin/bash
#在启动c1
docker start c1
-
查看c3的网络配置
-
查看c1的网络配置
-
我们可以发现原先c1的ip已经被c3占用了,c1的ip被分配为173.17.0.5。
这种情况下我们如果通过指定ip的方式去访问对应的中间件的话(如mysql、redis),就有可能会出现当容器重启时,ip发生变更而导致无法正常访问的场景。
如何解决呢,我们可以通过配置自定义网络、通过服务名的方式访问,如下所示
- 首先我们先关闭并删除对应的容器(c1、c2、c3)
- 创建自定义docker网络
docker network create van_network
- 创建容器c1、c2、c3
docker run -it --name c1 --network=van_network mycentos:1.5 /bin/bash
docker run -it --name c2 --network=van_network mycentos:1.5 /bin/bash
docker run -it --name c3 --network=van_network mycentos:1.5 /bin/bash
- 在c3中分别ping c2 和 c1的容器
可以发现都可以ping的通。
- 当我们c2容器先关闭在启动,ip发生变更之后。在c3容器中访问c2,观察是否可以正常访问
可以发现虽然c2的ip从172.21.0.3 变更成172.21.0.5,但是我们通过容器名称仍然可以正常访问成功。
自定义网络本身就维护好了主机名和IP的对应关系,也就是IP和域名都能联通
- 如果我们想给容器分配一个固定的ip,那么我们可以通过pipework给现有容器配IP地址。
# 安装pipework。如果没有安装,可以通过以下命令克隆pipework的GitHub仓库并将其脚本复制到/usr/bin目录下
git clone https://github.com/jpetazzo/pipework.git
cp pipework/pipework /usr/bin/
# 运行pipework为容器指定网络配置。首先,找到你的Docker容器的名字或ID,然后运行pipework
# 以下是一个示例命令,将容器c1配置在192.168.157.2 /24网络上,并设置静态IP192.168.157.160
#pipework 网桥名 容器实例 ID 分配给容器的 IP/掩码@网关
pipework br0 c1 192.168.157.160/24@192.168.157.2