利用 Docker 在不同宿主机做 CentOS 系统容器( 四 )


3.2.4、配置docker0虚拟网桥
安装启动flanneld后重启Docker服务,查看Docker服务生成的docker0网桥IP是否已经位于flanneld生成flannel0网卡的网段之中,比如flannel0网卡的IP是:172.18.92.0,docker0的IP是:172.18.92.1,则配置成功 。如果IP地址的前三段有一段不同,则说明需要重新对docker0虚拟网桥进行配置,配置方法如下:
1、停掉Docker服务,修改docker.service配置文件
[root@master ~] # systemctl stop docker
[root@master ~] # vim /usr/lib/systemd/system/docker.service
ExecStart= /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --bip= 172.18. 92.1/ 24
如上就是需要在docker.service文件中的ExecStart参数后添加–bip=172.18.92.1/24,bip的值请查看/run/flannel/subnet.env文件的FLANNEL_SUBNET值,这两个需要保持一致 。
2、重启Docker
[root@master ~] # systemctl daemon-reload
[root@master ~] # systemctl restart docker
3、docker0是否配置成功
[root@master ~] # ifconfig flannel0
flannel0:flags= 4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1472
inet 172.18. 92.0netmask 255.255. 0. 0destination 172.18. 92.0
inet6 fe80:: 244d:d95c:a79f:af2d prefixlen 64scopeid 0x20<link>
unspec 00- 00- 00- 00- 00- 00- 00- 00- 00- 00- 00- 00- 00- 00- 00- 00txqueuelen 500(UNSPEC)
RX packets 2701666bytes 143511551( 136.8MiB)
RX errors 0dropped 0overruns 0frame 0
TX packets 2701343bytes 153069980( 145.9MiB)
TX errors 0dropped 0overruns 0carrier 0collisions 0
[root@master ~] # ifconfig docker0
docker0:flags= 4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.18. 92.1netmask 255.255. 255.0broadcast 172.18. 92.255
inet6 fe80:: 42:cff:fe75:d72prefixlen 64scopeid 0x20<link>
ether 02:42:0 c:75:0 d:72txqueuelen 0(Ethernet)
RX packets 4010425bytes 230843638( 220.1MiB)
RX errors 0dropped 0overruns 0frame 0
TX packets 3057671bytes 995135672( 949.0MiB)
TX errors 0dropped 0overruns 0carrier 0collisions 0
如上docker0处于flannel0的网段内,说明配置已经成功 。
3.2.5、验证宿主机间容器是否通信
如果以上步骤都已配置成功,此时就需要验证不通宿主机间容器是否通信了,验证方法就是在每个宿主机创建个容器,然后在容器中ping其他宿主机中容器的Ip,如果能够ping通,则说明已经完成 。如果Ping不通也不要惊慌,因为可能是底层的iptables造成的,所以解决办法是在各宿主机上执行下面操作:
[root@master ~] # iptables -P INPUT ACCEPT
[root@master ~] # iptables -P FORWARD ACCEPT
[root@master ~] # iptables -F
[root@master ~] # iptables -L -n
以上只完成后再次测试容器间是否能够相互ping通,还是不可以的话就需要排查是否那个环节疏忽出现问题了 。docker通过Flannel可以实现各容器间的相互通信,即宿主机和容器,容器和容器之间都能相互通信 。
制作centos系统版本容器
1、拉取centos:7.6.1810系统版本的镜像
[root@master ~] # docker pull centos:7.6.1810
2、创建容器
[root@master ~] # docker run -itd --name pre-centos --privileged=true -p 10022:22 centos:7.6.1810 init
我对该命令中的参数具体讲解下:
-i:以交互模式运行容器,通常与 -t 同时使用 。
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用 。
-d:后台运行容器,并返回容器ID,如果不加这个参数,当退出容器时,这个容器也就停止了 。
–privileged:默认是false,我们这里改成了true,使用该参数容器中的root拥有真正的root权限,否则容器的root用户只是宿主机的一个普通用户权限,有些命令如:systemctl、service是使用不了的 。
-p:就是映射端口的作用
还有一个问题需要注意,就是该命令后的init,加上它赋值给容器真正的root权限才会生效,如果使用/bin/bash是不会生效的 。
3、进入创建好的容器
[root@master ~] # docker exec -it 1fc31e49daxc bash
1fc31e49daxc 参数为新创建容器的CONTAINER ID 。
4、安装启动ssh
[ root@1fc31e49daxc ~] # yum -y install openssh-server
[ root@1fc31e49daxc ~] # systemctl start sshd
容器中安装配置ssh,就是希望外部工具能够通过容器映射宿主机的10022端口直接访问到容器里 。


推荐阅读