现在说到容器,大家可能很容易想到Kubernetes。确实很流行,也很强大,但是对于规模很小,容器很少的小环境,Kubernetes比较笨重,直接用DockerCompose拉一个小环境。这种使用方法也被很多用户使用;本文通过实战介绍两种类型。Docker容器间跨主机互通的实现方法;基础环境准备好安装Docker。在公网可以访问,DNS正常的情况下,直接复制以下代码,分别在docker-host-01和docker-host-02上执行,完成Docker安装。#卸载原有的docker环境和依赖,并安装必要的包yumremovedocker-latest-logrotateddocker-logrotateddocker-selinuxdocker-engineyuminstall-yyum-utilsdevice-mapper-persistent-datalvm2#使用阿里云安装源码yum-config-manager--add-repohttp://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.reporpm--导入http://mirrors.aliyun.com/docker-ce/linux/centos/gpgyummakecachefastyum-yinstalldocker-ce#安装完成启动Dockersystemctlstartdockersystemctlenabledockersystemctlstatusdocker下载demo镜像Docker官方在https://hub.docker.com/提供了很多镜像,大家可以根据自己的需要选择下载,也可以自己安装Docker镜像仓库,这里我来下载并直接使用dockerhub中提供的centos官方镜像进行后续演示;[root@docker-host-01~]#dockerpullcentos镜像分别下载到两台Docker主机上,当然如果网速慢,可以下载一个,然后使用dockersave打包镜像,将镜像传输到第二台机器,并使用dockerload导入图像。方法有很多种,适合自己的才是最好的。镜像下载完成后,使用dockerimages命令查看。[root@docker-host-01~]#dockerimagesREPOSITORYTAGIMAGEIDCREATEDSIZEcentoslatest470671670cac3daysago237MB通过直接路由实现跨主机Docker容器通信直接路由。这种方式操作起来比较简单,对原有Docker网络的改动也很小。只需要指定彼此的路由即可完成宿主机Docker容器之间的跨宿主互通;主机配置和IP信息基础环境需要准备两台主机,系统可以是CentOS、Ubuntu;需要能够支持Docker的安装,本实用文档中使用的主机信息如下;主机名IP配置容器网段主机名IP配置容器网段docker-host-01192.168.61.1322核心4G内存,50G硬盘172.16.200.0/24docker-host-02192.168.61.1352核心4G内存,50G硬盘172.16.201.0/24调整Docker网络配置Docker安装完成后会默认创建docker0网桥,要启动的docker容器网段为172.17.0.1/16。如果不做任何调整,两台Docker主机上的容器可能IP地址冲突,所以我们先设置默认的docker0网桥地址,根据【主机配置及IP信息】中的规划进行调整。在docker-host-01中创建/etc/docker/daemon.json文件,内容如下[root@docker-host-01~]#cat/etc/docker/daemon.json{"bip":"172.16.200.1/24"}重启docker服务[root@docker-host-01~]#systemctlrestartdocker重启后,查看docker0的IP,已经调整完成;[root@docker-host-01~]#ifconfigdocker0docker0:flags=4099mtu1500inet172.16.200.1netmask255.255.255.0broadcast172.16.200.255inet6fe80::42:b3ff:fef9:1cc1prefixlen64scopeid0x20:<4:xbueclent0x20:<4:xbueclent1:1ether02:b3ff:fef9:1cc1prefixlen64scopeid0x20:<链接>1ether0x20:(Ethernet)RXpackets2916bytes121276(118.4KiB)RXerrors0dropped0overruns0frame0TXpackets3115bytes10870567(10.3MiB)TXerrors0dropped0overruns0carrier0collisions0在docker-host-02主机上用同样的方法调整docker网络。创建并进入Docker容器在docker-host-01中执行如下命令创建容器并查看IP和网关信息。[root@docker-host-01~]#dockerrun--namehost-01-docker-itcentos/bin/bash[root@6cb01044fda8/]#yuminstall-ynet-tools#安装查看ip和网关的工具[root@6cb01044fda8/]#ifconfigeth0eth0:flags=4163mtu1500inet172.16.200.2netmask255.255.255.0broadcast172.16.200.255ether02:42:ac:10:c8:02txqueuelen0(Ethernet)RXpackets3168bytes10876332(10.3MiB)RXerrors0dropped0overruns0frame0TXpackets2970bytes165058(161.1KiB)TXerrors0dropped0overruns0carrier0collisions0[root@6cb01044fda8/]#route-nKernelIProutingtableDestinationGatewayGenmaskFlagsMetricRefUseIface0.0.0.0172.16.200.10.0.0.0UG000eth0172.16.200.00.0.0.0255.255.255.0U000eth0如上,创建了一个名为host-01-docker的容器,容器的ip是172.16.200.2/24,网关是172.16.200.1;同样,在docker-host-02中执行上述命令;[root@docker-host-02~]#dockerrun--namehost-02-docker-itcentos/bin/bash[root@f52ed4088844/]#yuminstall-ynet-tools[root@f52ed4088844/]#ifconfigeth0eth0:flags=4163<向上、广播、运行、多播>mtu1500inet172.16.201.2netmask255.255.255.0broadcast172.16.201.255ether02:42:ac:10:c9:02txqueuelen0(Ethernet)RXpackets3436bytes10890638(10.3MiB)RXerrors0dropped0overruns0frame0TXpackets3159bytes175122(171.0KiB)TXerrors0dropped0overruns0carrier0collisions0[root@f52ed4088844/]#route-nKernelIProutingtableDestinationGatewayGenmaskFlagsMetricRefUseIface0.0.0.0172.16.201.10.0.0.0UG000eth0172.16.201.00.0.0.0255.255.255.0U000eth0host-02-docker容器的ip为172.16.201.2/24,网关为172.16.201.1;这个时候我们直接在host-01-docker容器中pinghost-02-docker容器的IP172.16.201.2肯定是不可达的添加互通路由的原理很简单,就是指定到对方容器的路由;在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-nKernelIProutingtableDestinationGatewayGenmaskFlagsMetricRefUseIface0.0.0.0192.168.61.20.0.0.0UG000ens33169.254.0.00.0.0.0255.255.0270.0U169.0U16900.0.0.0255.255.255.0U000docker0192.168.61.00.0.0.0255.255.255.0U000ens33[root@docker-host-01~]#routeadd-net172.16.201.0/24gw192.168.61~135[root@docker-host-01]#route-nKernelIProutingtableDestinationGatewayGenmaskFlagsMetricRefUseIface0.0.0.0192.168.61.20.0.0.0UG0090.041.041255.0.0U100200ens33172.16.200.00.0.0.0255.255.255.0U000docker0172.16.201.0192.168.61.135255.255.255.0UG000ens33192.168.61.00.0.0.0255.255.255.0U000ens33docker-host-02主机上的操作如下[root@docker-host-02~]#route-nKernelIProutingtableDestinationGatewayGenmaskFlagsMetricRefUseIface0.0.0.0192.168.61.20.0.0.0UG000ens33169.254.0.00.0.0.0255.255.0.0U100200ens33172.16.201.00.0.0.0255.255.255.0U000docker0192.168.61.00.0.0.0255.255.255.0U000ens33[root@docker-host-02~]#routeadd-net172.16.200.0/24gw192.168.61.132[root@docker-host-02~]#route-nKernelIProutingtableDestinationGatewayGenmaskFlagsMetricRefUseIface0.0.0.0192.168.61.20.0.0.0UG000ens33169.254.0.00.0.0.0255.255.0.0U100200ens33172.16.200.0192.168.61.132255.255.255.0UG000ENS33172.16.201.0.0.0.0.0.0.0.0.0.255.255.255.255.0u000docker0192.168.61.61.0.0.0.0.0.0255.255.255.255.255.255.000000usyyouyouyouyouyouyouyou2dockerny2tocker-nodkern.2需要注意的是,通过路由打通跨主机Docker容器之间的网络,必须保证Docker主机在同一网段;通过桥接到Docker主机网络实现跨主机Docker容器通信将Docker容器网络直接桥接到Docker主机网络,容器通信过程中不再需要进行NAT转换。优点是性能提升,容器IP和Docker宿主机IP统一管理;IP地址分配变得复杂;让我们来看看这个场景主机配置和IP信息基础环境需要准备两台主机,系统可以是CentOS、Ubuntu;需要支持安装Docker,本实用文档中使用的主机信息如下;主机名IP配置容器网段docker-host-01192.168.61.1322核心4G内存,50G硬盘192.168.61.64/27docker-host-02192.168.61.1352核心4G内存,50G硬盘192.168.61.96/27调整DockerhostbridgeBy默认情况下,docker0没有连接到物理接口,Docker主机的IP地址也配置在物理接口上,现在需要将物理接口添加到docker0网桥,并将IP地址配置为docker0;具体操作如下在docker-host-01上创建并编辑docker配置文件,bip表示桥接口地址,配置为Docker主机的IP地址,fixed-cidr配置为IP分配给docker容器的地址。注意不能在每台主机上重复,否则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服务,重启完成后docker0上已经配置好192.168.61.132[root@docker-host-01~]#systemctlrestartdocker[root@docker-host-01~]#ifconfigdocker0docker0:flags=4163mtu1500inet192.168.61.132netmask255.255.255.0broadcast192.168.61.255inet6fe80::42:b3ff:fef9:1cc1prefixlen64scopeidedetherx22:1fb:4:4<链接>c1txqueuelen0(Ethernet)RXpackets6420bytes308080(300.8KiB)RXerrors0dropped0overruns0frame0TXpackets6373bytes21761327(20.7MiB)TXerrors0dropped0overruns0carrier0collisions0将物理接口添加到docker0网桥,同时执行两条命令清除物理网卡必须断开网络。[root@docker-host-01~]#brctladdifdocker0ens33&&ifconfigens330.0.0.0注意:如果网桥配置需要永久保存,需要通过配置文件配置查看网桥信息[root@docker-host-01~]#brctlshowbridgenamebridgeidSTPenabledinterfacesdocker08000.0242b3f91cc1noens33创建并进入Docker容器在docker-host-01创建一个容器,查看容器ip为192.168.61.64[root@docker-host-01~]#dockerrun-itcentos/bin/bash[root@811f01405906/]#ipa1:lo:mtu65536qdiscnoqueuestateUNKNOWNgroupdefaultqlen1000link/loopback00:00:00:00:00:00brd00:00:00:00:00:00inet127.0.0.1/8scopehostlovalid_lftforever1ifethforredRO,8scopehostlovalid_lftforever1ifethforred3RO,@8scopehostlovalid_lftforever1ifethforred3RO,MULTICAST,UP,LOWER_UP>mtu1500qdiscnoqueuestateUPgroupdefaultlink/ether02:42:c0:a8:3d:40brdff:ff:ff:ff:ff:fflink-netnsid0inet192.168.61.64/24brd192.168.61.61globalthostforrefereverthostforlferteverthost2055scope红色incontainer-forever0preferred2并检查容器ip是192.168.61.96[root@docker-host-02~]#dockerrun-itcentos/bin/bash[root@7940a9efcf6a/]#ipa1:lo:mtu65536qdiscno队列状态UNKNOWNgroupdefaultqlen1000link/loopback00:00:00:00:00:00brd00:00:00:00:00:00inet127.0.0.1/8scopehostlovalid_lftforeverpreferred_lftforever4:eth0@if5:<广播、组播、UP、LOWER_UP>mtu1500qdiscnoqueueetherstate000inet127.0.0.1/8scopehostlovalid_lftforeverpreferred_lftforever4:eth0@if5::a8:3d:60brdff:ff:ff:ff:ff:fflink-netnsid0inet192.168.61.96/24brd192.168.61.255scopeglobaleth0valid_lftforeverpreferred_lftforever验证在docker-node-01主机的容器中pingdocker-node-02主机的IPcontainer为192.168.61.96,可以ping通确认没有问题。直接桥接到Docker主机网络。这样就无法打开宿主机上的Docker容器。在IP和网段划分上会比较麻烦。总结一下路由方式和桥接方式,可以让Docker容器可以跨主机互操作,操作比较简单;结合docker-compose,可以非常快速的拉起一套环境;