一、Host模型
Host模型是使用宿主机网络对外提供服务,它本身并没有固定的IP地址。它的IP地址与宿主机的IP相同。
从上图可以看到,Host网络没有IP相关的配置信息。
命令格式:
$ docker run --net=host -itd --name [容器名称] [镜像名称]
例如:
$ docker run --net=host -itd --name nginx-test nginx
$ docke ps
运行效果:
从图上可以看出,PORTS列为空。也就是说,该容器没有与宿主机做端口映射。
但是,当我们查看网络状态发现,启动容器之后,宿主机的80端口被占用了。当关闭容器后,宿主机的80端口号会被释放。
查看host网络的配置信息,可以看到我们刚刚创建的容器。
如果要在宿主机客户端访问容器服务,可以通过宿主机的IP直接访问。例如:
二、None模型
None模型是一个自由度比较高的网络模式,它可以最大化的自定义我们想要的网络。如果使用None网络模型,创建容器的时候系统不会为容器配置任何网络。因此,需要我们自己手动进行配置。
命令格式:
$ docker run --net-none -itd --name [容器名称] [镜像名称]
例如:
$ docker run --net=none -itd --name nginx-test nginx
上面命令在创建容器时候指定的网络类型为none。
$ docker inspect nginx-test
运行效果:
从图上看出,容器中没有保存任何的网络配置信息。
$ netstat -tnulp
运行效果:
从图上也没有看到80端口的网络启动。
所以,如果要访问None网络类型的容器服务,需要将Docker容器配置到和宿主机同一个网段,同时还要指定容器的IP地址。
例如:自定义容器网络和宿主机为同一网段,容器ip可以指定。这里需要安装一个网桥管理软件bridge-utils。
第一步:安装网桥管理软件。
$ sudo apt-get install bridge-utils -y
第二步:配置网卡。
# 先备份配置文件
$ sudo cp /etc/network/interfaces /etc/network/interfaces-old
# 再修改配置文件
$ sudo vim /etc/network/interfaces
添加以下内容:
auto br0
iface br0 inet static
address 192.168.31.20
netmask 255.255.255.0
gateway 192.168.31.1
dns-nameservers 8.8.8.8
bridge_ports ens33
第三步:重启网络服务。
$ service networking restart
第四步:配置docker。
这里请参考上一章节中“自定义网桥”部分的内容。
第五步:验证dns服务。
$ ping baidu.com
如果执行ping命令失败,那么表示dns解析没有配置好,需要我们进行dns的配置。如果命令执行成功,可以省略该步骤的操作。
# sudo vim /etc/resolv.conf
添加以下内容:
nameserver 223.5.5.5
nameserver 114.114.114.114
nameserver 8.8.8.8
然后再执行以下命令重启网络即可。
$ sudo /etc/init.d/networking restart
第五步:创建容器,指定网络类型为none,并把宿主机的/etc/apt文件挂载到容器的/home/etc目录下。
$ docker run -itd --net=none --name ubuntu-test -v /etc/apt/:/home/etc/ ubuntu /bin/bash
第六步:指定容器IP。
# 安装pipework(链接:https://pan.baidu.com/s/1_fk2OxPLenK614V9fbuWfw 提取码:c1kx )
# 下载完成后,把压缩包拷贝到虚拟机中,并解压缩
$ unzip pipework-master.zip
# 解压完成后,把pipework文件拷贝到bin目录下
$ sudo cp pipework-master/pipework /usr/local/bin
# 指定容器IP,IP地址必须要与宿主机同一个网段,否则容器无法访问网络
$ sudo pipework br0 ubuntu-test 192.168.31.129/24@192.168.31.1
# 进入容器
$ docker exec -it ubuntu-test /bin/bash
# 删除容器的sources.list文件
root@xxx:/# rm /etc/apt/sources.list
# 将/home/etc/sources.list文件拷贝到/etc/apt目录下
root@xxx:/# cp /home/etc/sources.list /etc/apt/
# 更新软件源
root@xxx:/# apt-get update
# 安装ping命令
root@xxx:/# apt-get install inetutils-ping -y
# 安装ifconfig命令
root@xxx:/# apt-get install net-tools -y
# 测试
root@xxx:/# ping [宿主机IP]
三、跨主机容器通信
3.1 主机网络配置
第一步:创建网桥(请参考上一章节“自定义网桥”部分)
第二步:配置网卡
$ sudo vim /etc/network/interfaces
添加以下内容:
# 主机1
auto br0
iface br0 inet static
address 192.168.31.20
netmask 255.255.255.0
gateway 192.168.31.1
dns-nameservers 8.8.8.8
bridge_ports ens33
# 主机2
auto br0
iface br0 inet static
address 192.168.31.30
netmask 255.255.255.0
gateway 192.168.31.1
dns-nameservers 8.8.8.8
bridge_ports ens33
第三步:docker配置网桥
vim /etc/default/docker
添加以下内容:
#主机1
DOCKER_OPTS="-b=br0 --fixed-cidr=192.168.31.99/26"
#主机2
DOCKER_OPTS="-b=br0 --fixed-cidr=192.168.31.170/26"
其中,-b 用来指定容器连接的网桥名字;–fixed-cidr用来限定为容器分配的IP地址范围。
第四步:创建服务依赖文件
$ sudo mkdir -p /etc/systemd/system/docker.service.d
$ sudo vim /etc/systemd/system/docker.service.d/Using_Environment_File.conf
添加以下内容:
[Service]
EnvironmentFile=-/etc/default/docker
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_OPTS
第五步:重启服务
# 重新加载配置文件
$ systemctl daemon-reload
# 重启宿主机
$ sudo reboot
# 重启网络
$ sudo /etc/init.d/networking restart
第六步:检查dns
$ ping baidu.com
如果ping失败,那么修改resolve.conf文件。
$ sudo vim /etc/resolv.conf
然后添加内容:
nameserver 223.5.5.5
nameserver 114.114.114.114
nameserver 8.8.8.8
添加完保存退出。再次重启网络。
$ sudo /etc/init.d/networking restart
3.2 容器网络配置
第一步:在不同宿主机上分别创建两个容器。
#主机1:
$ docker run -itd --name ubuntu-test1 -v /etc/apt/:/home/etc ubuntu /bin/bash
$ docker run -itd --name ubuntu-test2 -v /etc/apt/:/home/etc ubuntu /bin/bash
#主机2
$ docker run -itd --name ubuntu-test3 -v /etc/apt/:/home/etc ubuntu /bin/bash
$ docker run -itd --name ubuntu-test4 -v /etc/apt/:/home/etc ubuntu /bin/bash
第二步:启动四个会话,在每一个会话中进入一个容器。
#主机1
$docker exec -it ubuntu-test1 /bin/bash
$docker exec -it ubuntu-test2 /bin/bash
#主机2
$docker exec -it ubuntu-test3 /bin/bash
$docker exec -it ubuntu-test4 /bin/bash
第三步:为每个容器安装ping命令和ifconfig命令。
# 1.更新/etc/apt/目录下的sources.list文件
root@xxx:/# rm /etc/apt/sources.list
root@xxx:/# cp /home/etc/sources.list /etc/apt/
# 2.容器内部进行软件源更新
root@xxx:/# apt-get update
# 3.容器内部安装ping命令
root@xxx:/# apt-get install inetutils-ping -y
# 4.容器内部安装ifconfig命令
root@xxx:/# apt-get install net-tools -y
执行完上面所有步骤后,进行相关测试。这里主要测试宿主机中容器之间的网络通信,以及不同宿主机容器之间的网络通信。