現(xiàn)在提到容器,可能很容易想到的就是Kubernates,確實(shí)它很火,也很強(qiáng)大,但是對(duì)于規(guī)模非常小,容器不多的小環(huán)境,Kubernetes 就顯得比較累贅了,直接使用Docker Compose拉取一個(gè)小環(huán)境,這種使用方式,也有不少用戶在使用;本篇通過實(shí)戰(zhàn),來介紹兩種,在不使用類似Kubernetes容器管理平臺(tái)的下,實(shí)現(xiàn)跨主機(jī)Docker容器之間互通的方法;基礎(chǔ)環(huán)境準(zhǔn)備安裝Docker在能訪問公網(wǎng)且DNS正常的情況下,將下面的代碼,直接復(fù)制并在docker-host-01,docker-host-02上執(zhí)行,即可完成Docker安裝。 #卸載原有docker環(huán)境及依賴,并安裝必要的包 yum remove docker-latest-logrotate docker-logrotate docker-selinux docker-engine yum install -y yum-utils device-mapper-persistent-data lvm2 #使用阿里云安裝源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo rpm --import http://mirrors.aliyun.com/docker-ce/linux/centos/gpg yum makecache fast yum -y install docker-ce #安裝完成啟動(dòng)Docker systemctl start docker systemctl enable docker systemctl status docker 下載演示鏡像Docker官方在https://hub./中提供了很多鏡像,你可以根據(jù)自己的需要選擇并下載,也可以自行安裝Docker鏡像倉庫,此處我就直接下載使用docker hub中提供的centos官方鏡像進(jìn)行后續(xù)演示; [root@docker-host-01 ~]# docker pull centos 鏡像在兩臺(tái)Docker主機(jī)中都下載,當(dāng)然如果網(wǎng)速慢的話,可以下載一個(gè),然后使用docker save 打包鏡像,將鏡像傳到第二臺(tái)機(jī)器上,在用docker load導(dǎo)入鏡像。方法很多,適合你的才是最好的。 鏡像下載完成,使用docker images命令查看。 [root@docker-host-01 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 470671670cac 3 days ago 237MB 通過直接路由方式實(shí)現(xiàn)跨主機(jī)Docker容器通信直接路由這種方式操作起來比較簡(jiǎn)單,對(duì)Docker原生網(wǎng)絡(luò)改變最小,只需要互相指定對(duì)方的路由即可完成跨主機(jī)Docker容器之間的互通; 主機(jī)配置及IP信息基礎(chǔ)環(huán)境需要準(zhǔn)備兩臺(tái)主機(jī),系統(tǒng)可以是CentOS,Ubuntu;需要能支持安裝Docker,本實(shí)戰(zhàn)文檔中使用的主機(jī)信息如下;
調(diào)整Docker網(wǎng)絡(luò)配置Docker安裝完之后,默認(rèn)會(huì)創(chuàng)建一個(gè)docker0的網(wǎng)橋,啟動(dòng)的Docker容器網(wǎng)段是172.17.0.1/16,如果不做調(diào)整,兩臺(tái)Docker主機(jī)上的容器,就可能出現(xiàn)IP地址沖突,所以我們先將默認(rèn)docker0網(wǎng)橋的地址按【主機(jī)配置及IP信息】中規(guī)劃的進(jìn)行調(diào)整。 在docker-host-01中創(chuàng)建/etc/docker/daemon.json文件,內(nèi)容如下 [root@docker-host-01 ~]# cat /etc/docker/daemon.json { "bip": "172.16.200.1/24" } 重啟docker服務(wù) [root@docker-host-01 ~]# systemctl restart docker 完成重啟后,再看docker0的IP,已經(jīng)調(diào)整完成了; [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 使用同樣的方法,調(diào)整docker-host-02主機(jī)上的的docker網(wǎng)絡(luò)。 創(chuàng)建并進(jìn)入Docker容器在docker-host-01中執(zhí)行下面命令創(chuàng)建容器并查看IP和網(wǎng)關(guān)信息。 [root@docker-host-01 ~]# docker run --name host-01-docker -it centos /bin/bash [root@6cb01044fda8 /]# yum install -y net-tools #安裝工具查看ip和網(wǎng)關(guān) [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 如上,創(chuàng)建了一個(gè)名為host-01-docker 的容器,容器的ip是172.16.200.2/24,網(wǎng)關(guān)是172.16.200.1;同理在docker-host-02中也執(zhí)行上述命令; [root@docker-host-02 ~]# docker run --name host-02-docker -it centos /bin/bash [root@f52ed4088844 /]# yum 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,網(wǎng)關(guān)是172.16.201.1;此時(shí)我們直接在host-01-docker容器里面去ping host-02-docker容器的IP 172.16.201.2 肯定是不通的。 添加互通路由(宿主機(jī)操作)原理非常簡(jiǎn)單,就是通過互相指定到達(dá)對(duì)方容器的路由; 在docker-host-01主機(jī)添加到172.16.201.0/24網(wǎng)段的路由,指向docker-host-02的IP:192.168.61.135; 在docker-host-02主機(jī)添加到172.16.200.0/24網(wǎng)段的路由,指向docker-host-01的IP:192.168.61.132; docker-host-01(宿主機(jī))主機(jī)上的操作如下 [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 ~]# route add -net 172.16.201.0/24 gw 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(宿主機(jī))主機(jī)上的操作如下 [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 ~]# route add -net 172.16.200.0/24 gw 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 驗(yàn)證在docker-host-01主機(jī)上的Docker容器中,ping docker-host-02中的Docker容器IP:172.16.201.2 最后,需要注意一點(diǎn),通過路由打通跨主機(jī)Docker容器之間的 網(wǎng)絡(luò),必須確保Docker宿主機(jī)是在相同的網(wǎng)段; 通過橋接到Docker宿主機(jī)網(wǎng)絡(luò)實(shí)現(xiàn)跨主機(jī)Docker容器通信將Docker容器網(wǎng)絡(luò)直接橋接到Docker宿主機(jī)網(wǎng)絡(luò)里面, 容器通信過程中不在需要NAT的轉(zhuǎn)換,優(yōu)點(diǎn)是性能提升,容器及Docker宿主機(jī)IP統(tǒng)一管理;缺點(diǎn)是,容器及Docker宿主機(jī)IP統(tǒng)一管理之后帶來的IP地址分配變復(fù)雜了;下面就來實(shí)戰(zhàn)一下這種場(chǎng)景。 主機(jī)配置及IP信息基礎(chǔ)環(huán)境需要準(zhǔn)備兩臺(tái)主機(jī),系統(tǒng)可以是CentOS,Ubuntu;需要能支持安裝Docker,本實(shí)戰(zhàn)文檔中使用的主機(jī)信息如下;
調(diào)整Docker宿主機(jī)網(wǎng)橋默認(rèn)情況下docker0,是不與物理接口連接了,Docker宿主機(jī)的IP地址也是配置在物理接口上的,現(xiàn)在需要把物理接口添加到docker0網(wǎng)橋中,并把IP地址配置到docker0上;具體操作如下 在docker-host-01上,創(chuàng)建并編輯docker配置文件,bip表示網(wǎng)橋接口的地址,配置為Docker宿主機(jī) IP,fixed-cidr配置的是分配給docker容器的IP地址,這個(gè)地方需要注意,每臺(tái)宿主機(jī)上不能重復(fù),否則會(huì)IP地址沖突。 [root@docker-host-01 ~]# cat /etc/docker/daemon.json { "bip": "192.168.61.132/24", "fixed-cidr": "192.168.61.64/27", "default-gateway": "192.168.61.1" } 重啟docker服務(wù),重啟完成后,192.168.61.132已經(jīng)被配置到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.61.132 netmask 255.255.255.0 broadcast 192.168.61.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網(wǎng)橋中,同時(shí)清空物理網(wǎng)卡上的IP ,注意必須兩條命令一起執(zhí)行,否則會(huì)斷網(wǎng)。 [root@docker-host-01 ~]# brctl addif docker0 ens33&&ifconfig ens33 0.0.0.0 注意:網(wǎng)橋配置,如果需要永久保存,需要通過配置文件的方式配置 檢查網(wǎng)橋信息 [root@docker-host-01 ~]# brctl show bridge name bridge id STP enabled interfaces docker0 8000.0242b3f91cc1 no ens33 在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.61.135/24", "fixed-cidr": "192.168.61.96/27", "default-gateway": "192.168.61.1" } 創(chuàng)建并進(jìn)入Docker容器在docker-host-01中創(chuàng)建容器并查看容器ip是192.168.61.64 [root@docker-host-01 ~]# docker run -it centos /bin/bash [root@811f01405906 /]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 12: eth0@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:c0:a8:3d:40 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 192.168.61.64/24 brd 192.168.61.255 scope global eth0 valid_lft forever preferred_lft forever 在docker-host-02中創(chuàng)建容器并查看容器ip是192.168.61.96 [root@docker-host-02 ~]# docker run -it centos /bin/bash [root@7940a9efcf6a /]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 4: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:c0:a8:3d:60 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 192.168.61.96/24 brd 192.168.61.255 scope global eth0 valid_lft forever preferred_lft forever 驗(yàn)證在docker-node-01宿主機(jī)的容器中ping docker-node-02宿主機(jī)上的容器IP 192.168.61.96,可以ping通驗(yàn)證沒問題。 直接橋接到Docker宿主機(jī)網(wǎng)絡(luò)這種方式,打通不通宿主機(jī)上的Docker容器,在IP,網(wǎng)段劃分上會(huì)比較麻煩, 總結(jié)路由方式和網(wǎng)橋方式,都可以使跨主機(jī)之間的Docker容器互通,操作起來也比較簡(jiǎn)單;再結(jié)合docker-compose,可以非常迅速的拉起一套環(huán)境; |
|