赞
踩
点击链接安装Docker
Docker官方在https://hub.docker.com/中提供了很多镜像,你可以根据自己的需要选择并下载,也可以自行安装Docker镜像仓库,此处我就直接下载使用docker hub中提供的ubuntu官方镜像进行后续演示;
[root@docker-host-01 ~]# docker pull ubuntu
镜像在两台Docker主机中都下载,当然如果网速慢的话,可以下载一个,然后使用docker save 打包镜像,将镜像传到第二台机器上,在用docker load导入镜像。方法很多,适合你的才是最好的。
镜像下载完成,使用docker images命令查看。
[root@docker-host-01 ~]# docker images
直接路由这种方式操作起来比较简单,对Docker原生网络改变最小,只需要互相指定对方的路由即可完成跨主机Docker容器之间的互通;
基础环境需要准备两台主机(可以是两台工控机安装原生ubuntu或者是两台运行在windows下面的虚拟机),系统可以是CentOS,Ubuntu;需要能支持安装Docker,本实战文档中使用的主机信息如下;
主机名 | IP | 配置 | 容器网段 |
---|---|---|---|
docker-host-01 | 192.168.61.132 | 16核32G内存,50G硬盘 | 172.16.200.0/24 |
docker-host-02 | 192.168.61.135 | 16核32G内存,50G硬盘 | 172.16.201.0/24 |
Docker安装完之后,默认会创建一个docker0的网桥,启动的Docker容器网段是172.17.0.1/16,如果不做调整,两台Docker主机上的容器,就可能出现IP地址冲突,所以我们先将默认docker0网桥的地址按【主机配置及IP信息】中规划的进行调整。
在docker-host-01中创建/etc/docker/daemon.json文件(一般来说主机里面会有这个文件,没有的话就自己创建,用root权限创建),内容如下
[root@docker-host-01 ~]# cat /etc/docker/daemon.json
{
"bip": "172.16.200.1/24"
}
重启docker服务
[root@docker-host-01 ~]# systemctl restart docker
完成重启后,再看docker0的IP,已经调整完成了
[root@docker-host-01 ~]# ifconfig docker0
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.16.200.1 netmask 255.255.255.0 broadcast 172.16.200.255
inet6 fe80::42:b3ff:fef9:1cc1 prefixlen 64 scopeid 0x20<link>
ether 02:42:b3:f9:1c:c1 txqueuelen 0 (Ethernet)
RX packets 2916 bytes 121276 (118.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3115 bytes 10870567 (10.3 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
使用同样的方法,调整docker-host-02主机上的的docker网络。
[root@docker-host-01 ~]# docker run --name host-01-docker -it ubuntu /bin/bash [root@6cb01044fda8 /]# apt update #更新 [root@6cb01044fda8 /]# apt install -y net-tools #安装工具查看ip和网关 [root@6cb01044fda8 /]# ifconfig eth0 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.16.200.2 netmask 255.255.255.0 broadcast 172.16.200.255 ether 02:42:ac:10:c8:02 txqueuelen 0 (Ethernet) RX packets 3168 bytes 10876332 (10.3 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 2970 bytes 165058 (161.1 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@6cb01044fda8 /]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 172.16.200.1 0.0.0.0 UG 0 0 0 eth0 172.16.200.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
如上,创建了一个名为host-01-docker 的容器,容器的ip是172.16.200.2/24,网关是172.16.200.1;同理在docker-host-02中也执行上述命令;
[root@docker-host-02 ~]# docker run --name host-02-docker -it ubuntu /bin/bash [root@f52ed4088844 /]# apt update [root@f52ed4088844 /]# apt install -y net-tools [root@f52ed4088844 /]# ifconfig eth0 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.16.201.2 netmask 255.255.255.0 broadcast 172.16.201.255 ether 02:42:ac:10:c9:02 txqueuelen 0 (Ethernet) RX packets 3436 bytes 10890638 (10.3 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 3159 bytes 175122 (171.0 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@f52ed4088844 /]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 172.16.201.1 0.0.0.0 UG 0 0 0 eth0 172.16.201.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
host-02-docker容器的ip是172.16.201.2/24,网关是172.16.201.1;此时我们直接在host-01-docker容器里面去ping host-02-docker容器的IP 172.16.201.2 肯定是不通的。
原理非常简单,就是通过互相指定到达对方容器的路由;
同时需要提醒的是,需要把本机的路由转发打开
ubuntu的话:
修改 /etc/sysctl.conf,把ip_forward = 1 的注释去掉即可(把ip_forward = 1前面的#
去掉)
centos的话:
修改 /etc/sysctl.d/99-sysctl.conf
添加net.ipv4.ip_forward = 1,然后试试sysctl -p
很简单的方式,其实很像flannel网络的Host-Gateway的原理
在docker-host-01主机添加到172.16.201.0/24网段的路由,指向docker-host-02的IP:192.168.61.135;
在docker-host-02主机添加到172.16.200.0/24网段的路由,指向docker-host-01的IP:192.168.61.132;
docker-host-01主机上的操作如下
[root@docker-host-01 ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.61.2 0.0.0.0 UG 0 0 0 ens33 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 ens33 172.16.200.0 0.0.0.0 255.255.255.0 U 0 0 0 docker0 192.168.61.0 0.0.0.0 255.255.255.0 U 0 0 0 ens33 [root@docker-host-01 ~]# ip route add 172.16.201.0/24 via 192.168.61.135 [root@docker-host-01 ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.61.2 0.0.0.0 UG 0 0 0 ens33 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 ens33 172.16.200.0 0.0.0.0 255.255.255.0 U 0 0 0 docker0 172.16.201.0 192.168.61.135 255.255.255.0 UG 0 0 0 ens33 192.168.61.0 0.0.0.0 255.255.255.0 U 0 0 0 ens33
docker-host-02主机上的操作如下
[root@docker-host-02 ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.61.2 0.0.0.0 UG 0 0 0 ens33 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 ens33 172.16.201.0 0.0.0.0 255.255.255.0 U 0 0 0 docker0 192.168.61.0 0.0.0.0 255.255.255.0 U 0 0 0 ens33 [root@docker-host-02 ~]# ip route add 172.16.200.0/24 via 192.168.61.132 [root@docker-host-02 ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.61.2 0.0.0.0 UG 0 0 0 ens33 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 ens33 172.16.200.0 192.168.61.132 255.255.255.0 UG 0 0 0 ens33 172.16.201.0 0.0.0.0 255.255.255.0 U 0 0 0 docker0 192.168.61.0 0.0.0.0 255.255.255.0 U 0 0 0 ens33
验证在docker-host-01主机上的Docker容器中,ping docker-host-02中的Docker容器IP:172.16.201.2,发现能ping通
最后,需要注意一点,通过路由打通跨主机Docker容器之间的 网络,必须确保Docker宿主机是在相同的网段;
将Docker容器网络直接桥接到Docker宿主机网络里面,
容器通信过程中不在需要NAT的转换,优点是性能提升,容器及Docker宿主机IP统一管理;缺点是,容器及Docker宿主机IP统一管理之后带来的IP地址分配变复杂了;下面就来实战一下这种场景。
预告:在没进行这个实验之前,分别在电脑里面创建一个容器,创建好之后在两台主机的容器里面分别执行下面的命令
在容器里面执行下面的命令
apt update
apt install net-tools
apt install iputils-ping
之后可以把这两个容器通过命令关闭
docker stop 容器id或者容器名字
把两台工控机通过华为交换机进行连接
下面的实验是按照链接里面进行设置的,有不一样的地方会进行说明!
基础环境需要准备两台主机(可以是两台工控机安装原生ubuntu或者是两台运行在windows下面的虚拟机),系统可以是CentOS,Ubuntu;需要能支持安装Docker,本实战文档中使用的主机信息如下;
主机名 | IP | 配置 | 容器网段 |
---|---|---|---|
docker-host-01 | 192.168.3.100 | 16核32G内存,50G硬盘(工控机) | 192.168.3.50/24 |
docker-host-02 | 192.168.3.200 | 16核32G内存,50G硬盘(工控机) | 192.168.3.150/24 |
默认情况下docker0,是不与物理接口连接了,Docker宿主机的IP地址也是配置在物理接口上的,现在需要把物理接口添加到docker0网桥中,并把IP地址配置到docker0上;具体操作如下
在docker-host-01上,创建并编辑docker配置文件,bip表示网桥接口的地址,配置为Docker宿主机 IP,fixed-cidr配置的是分配给docker容器的IP地址,这个地方需要注意,每台宿主机上不能重复,否则会IP地址冲突。
[root@docker-host-01 ~]# cat /etc/docker/daemon.json
{
"bip": "192.168.3.100/24",
"fixed-cidr": "192.168.3.50/24",
"default-gateway": "192.168.3.1"
}
重启docker服务,重启完成后,192.168.3.100
已经被配置到docker0上了
[root@docker-host-01 ~]# systemctl restart docker
[root@docker-host-01 ~]# ifconfig docker0
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.3.100 netmask 255.255.255.0 broadcast 192.168.3.255
inet6 fe80::42:b3ff:fef9:1cc1 prefixlen 64 scopeid 0x20<link>
ether 02:42:b3:f9:1c:c1 txqueuelen 0 (Ethernet)
RX packets 6420 bytes 308080 (300.8 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 6373 bytes 21761327 (20.7 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
将物理接口添加到docker0网桥中,同时清空物理网卡上的IP ,注意必须两条命令一起执行,否则会断网。
# 这个ens33要根据自己的电脑实际的网络接口名称来设置,工控机上面的是ens3f0np0(工控机是双网卡,设置其中一个网卡就行了)
[root@docker-host-01 ~]# brctl addif docker0 ens3f0np0&&ifconfig ens3f0np0 0.0.0.0
**注意:**网桥配置,如果需要永久保存,需要通过配置文件的方式配置
检查网桥信息
[root@docker-host-01 ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.0242b3f91cc1 no ens3f0np0
在docker-host-02上配置与 docker-host-01上基本一样,只是docker配置文件略有不同,fixed-cidr分配给docker容器的ip段不能与docker-host-01中配置的相同。
[root@docker-host-02 ~]# cat /etc/docker/daemon.json
{
"bip": "192.168.3.200/24",
"fixed-cidr": "192.168.3.150/24",
"default-gateway": "192.168.3.1"
}
注意:
因为本实验要求容器和docker0的ip地址要在同一网段,所以设置起来就有点不一样,当按照上面的设置进行的时候
在docker-host-01主机里:
192.168.3.100
,创建好的容器ip是从192.168.3.2开始递增的,就是第一个容器的ip地址是192.168.3.2,第二个是192.168.3.3,,以此类推在docker-host-02主机里:
192.168.3.200
,创建好的容器ip是从192.168.3.2开始递增的,就是第一个容器的ip地址是192.168.3.2,第二个是192.168.3.3,,以此类推因此要保证两个主机里面的容器IP地址不一样
ifconfig
,ping
命令的容器来进行实验就行。(在实验刚开始时创建好了能进行联网的容器),如果在你的电脑里面进行下面的操作创建容器时,能进行联网,那就直接执行下面的操作。在docker-host-01中创建容器并查看容器ip是192.168.3.2
[root@docker-host-01 ~]# docker run -it --name docker_host1 ubuntu /bin/bash
[root@5a6402cc78cb /]# apt update
[root@5a6402cc78cb /]# apt install net-tools
[root@5a6402cc78cb /]# apt install iputils-ping
[root@5a6402cc78cb:/]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu 1500inet 192.168.3.2 netmask 255.255.255.0 broadcast 192.168.3.255ether 02:42:c0:a8:03:02 txqueuelen 0(Ethernet)
RX packets 42 bytes 6448 (6.4 KB)frame 0RX errors 日 dropped @ overruns 0TX packets 12 bytes 896 (896.0 B)TX errors 0 dropped overruns 0carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0loop txqueuelen 1000 (Local Loopback)RX packets 1 bytes 78 (78.0 B)
RX errors 0 dropped o overruns o frame 0
TX packets 1 bytes 78 (78.0 B)TX errors 日dropped 0 overruns o carrter 0collisions 0
在docker-host-02中创建容器并查看容器ip是192.168.3.2
,192.168.3.3
# 创建容器1 [root@docker-host-02 ~]# docker run -it --name docker_host1 ubuntu /bin/bash [root@docker-host-02 ~]# apt update [root@docker-host-02 ~]# apt install net-tools [root@docker-host-02 ~]# apt install iputils-ping # 创建容器2 [root@docker-host-02 ~]# docker run -it --name docker_host2 ubuntu /bin/bash [rootce8bb2sa2a13:/]# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.3.3 netmask 255.255.255.0 broadcast 192.168.3.255ether 02:42:c:a8:03:03 txqueuelen 日(Ethernet)RX packets 93 bytes 15655 (15.6 KB)RX errors 日 dropped 日 overruns 日frame 0TX packets 47 bytes 3150 (3.1 KB)TX errors 日 dropped overruns 日carrier e collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536tnet 127.0.0.1 netmask 255.0..0loop txqueuelen 100日 (Local Loopback)RX packets 13 bytes 1342 (1.3 KB)RX errors 0 dropped e overruns 日frame TX packets 13 bytes 1342 (1.3 KB) TX errors 0 dropped overruns 日carrler 0collisions 6 # 把容器1删除 [root@docker-host-02 ~]# docker stop docker_host1 [root@docker-host-02 ~]# docker rm docker_host1
此时在主机2里面只有一个容器,IP地址为,192.168.3.3
,这样就可以跟主机1进行ping
了
主机1ping主机2
[root@5a6402cc78cb /]# ping 192.168.3.3
主机2ping主机1
[root@C08bb25a2af3 /]# ping 192.168.3.2
可以看到主机1的容器MAC地址为:02:42:c0:a8:03:02
,主机2的容器MAC地址为:02:42:ce:a8:03:03
,
接下面看一下华为交换机学习到的MAC地址
能看到交换机已经学习到了主机1和主机2的容器MAC地址了。
验证在docker-node-01宿主机的容器IP 192.168.3.2
,ping docker-node-02宿主机上的容器IP 192.168.3.3
,可以ping通验证没问题。
直接桥接到Docker宿主机网络这种方式,打通不通宿主机上的Docker容器,在IP,网段划分上会比较麻烦,
路由方式和网桥方式,都可以使跨主机之间的Docker容器互通,操作起来也比较简单;再结合docker-compose,可以非常迅速的拉起一套环境;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。