docker跨主机通信方式四 docker-machine

通过docker-machine +consul +overlay实现跨主机通信

一、基础环境配置

三台服务器均执行以下操作

1. 配置固定IP

[root@localhost ~]#  vim  /etc/sysconfig/network-scripts/ifcfg-ens32

TYPE=Ethernet

PROXY_METHOD=none

BROWSER_ONLY=no

BOOTPROTO=static

DEFROUTE=yes

IPV4_FAILURE_FATAL=no

IPV6INIT=yes

IPV6_AUTOCONF=yes

IPV6_DEFROUTE=yes

IPV6_FAILURE_FATAL=no

IPV6_ADDR_GEN_MODE=stable-privacy

NAME=ens32

UUID=75963e3f-b289-4bbd-8489-44f6f2b8c7f0

DEVICE=ens32

ONBOOT=yes

IPADDR=192.168.0.10

PREFIX=24

GATEWAY=192.168.0.1

DNS1=114.114.114.114

[root@localhost ~]# systemctl restart network

2. 更改主机名

[root@localhost ~]#  hostnamectl set-hostname docker-ce

[root@localhost ~]#  exit    //重新登陆即可

[root@docker-ce ~]#

在20,30两台服务器上重复上面的操作,docker1是IPADDR=192.168.0.20,docker2是IPADDR=192.168.0.30

3.关闭防火墙

[root@docker-ce ~]# systemctl stop firewalld

[root@docker-ce ~]# systemctl disable firewalld

4. 同步系统时间

[root@docker-ce ~]# yum -y install ntp

[root@docker-ce ~]#  systemctl enable ntpd.service

[root@docker-ce ~]# ntpdate cn.pool.ntp.org

[root@docker-ce ~]# hwclock -w

[root@docker-ce ~]#  crontab -e

0 2 * * * ntpdate ntpdate cn.pool.ntp.org  && hwclock -w

5.关闭selinux

[root@dockerce ~]# vim /etc/sysconfig/selinux

SELINUX=disabled

[root@docker-ce ~]#  reboot


二、docker-ce配置

1. 安装docker-machine

方式一:

[root@docker-ce ~]# curl -L https://github.com/docker/machine/releases/download/v0.14.0/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine && chmod +x /tmp/docker-machine && cp /tmp/docker-machine /usr/local/bin/docker-machine

%Total    % Received % Xferd  Average Speed  Time  Time    Time  Current

                                Dload  Upload  Total  Spent    Left Speed

100  617    0  617  0    0    582    0 --:--:--  0:00:01 --:--:--  583

100 25.1M 100 25.1M    0    0  644k      0  0:00:40 0:00:40 --:--:-- 2801k

此连接安装时,有时会链接超时,多链接几次或是过会再链接应该会成功。

方式二:

直接下载安装包

[root@docker-ce ~]# yum -y install wget

[root@docker-ce ~]#  wgethttps://github.com/docker/machine/releases/download/v0.14.0/docker-machine-Linux-x86_64

[root@docker-ce ~]# mv docker-machine-Linux-x86_64 /usr/local/bin/docker-machine

[root@docker-ce ~]# chmod +x  /usr/local/bin/docker-machine

[root@docker-ce ~]# docker-machine version

docker-machine version 0.14.0, build 89b8332

//docker-machine软件包需要翻墙下载

2. docker1,docker2 配置免密钥登录

[root@docker-ce ~]# ssh-keygen    //(生成主机密钥对,一路回车即可

Generating public/private rsa key pair.

Enter file in which to save the key (/root/.ssh/id_rsa):

Created directory '/root/.ssh'.

Enter passphrase (empty for no passphrase):

Enter same passphrase again:

Your identification has been saved in /root/.ssh/id_rsa.

Your public key has been saved in /root/.ssh/id_rsa.pub.

The key fingerprint is:

SHA256:27whAu+mDPZzqj25FcbF47Z8nbIav14KbxGeCl6aZac root@docker-ce

The key's randomart image is:

+---[RSA 2048]----+

|                |

|      .        |

|        +        |

|    . o ..      |

|    . + S. o    |

|    +.++==. .  |

|  o  o+BB+*.+    |

| . =+o*.EB.B    |

|  ..BO. .+O.    |

+----[SHA256]-----+

[root@docker-ce ~]# ssh-copy-id 192.168.0.20    //(复制公钥到20服务器

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"

The authenticity of host '192.168.0.20 (192.168.0.20)' can't be established.

ECDSA key fingerprint is SHA256:eOpJf2pvOii5sgnKZS+Wb3G3hc/7deEqGzuPcb2Ymhs.

ECDSA key fingerprint is MD5:1f:20:29:32:84:1e:59:cd:47:a5:c9:c3:82:77:50:f6.

Are you sure you want to continue connecting (yes/no)? yes

/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed

/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys

root@192.168.0.20's password:    //输入远程主机20的root用户的密码

Number of key(s) added: 1

Now try logging into the machine, with:  "ssh '192.168.0.20'"

and check to make sure that only the key(s) you wanted were added.

[root@docker-ce ~]# ssh-copy-id 192.168.0.30  //(复制公钥到30服务器

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"

The authenticity of host '192.168.0.30 (192.168.0.30)' can't be established.

ECDSA key fingerprint is SHA256:eOpJf2pvOii5sgnKZS+Wb3G3hc/7deEqGzuPcb2Ymhs.

ECDSA key fingerprint is MD5:1f:20:29:32:84:1e:59:cd:47:a5:c9:c3:82:77:50:f6.

Are you sure you want to continue connecting (yes/no)? yes

/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed

/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys

root@192.168.0.30's password:    //输入远程主机30的root用户的密码

Number of key(s) added: 1

Now try logging into the machine, with:  "ssh '192.168.0.30'"

and check to make sure that only the key(s) you wanted were added.

3. 登陆验证

[root@docker-ce ~]# ssh 192.168.0.20

Last login: Fri May 18 10:42:53 2018 from 192.168.0.110

[root@docker02 ~]# exit

[root@docker-ce ~]# ssh 192.168.0.30

Last login: Fri May 18 10:43:11 2018 from 192.168.0.110

[root@docker03 ~]# exit

4. 批量安装docker环境并配置启动

[root@docker-ce ~]# docker-machine ls (查看安装docker的机器)

NAME  ACTIVE  DRIVER  STATE  URL  SWARM  DOCKER  ERRORS

在进行批量安装的时候,主要做以下几件事:

1> 使用ssh连接到远程主机上(配置无密码登录等原因)

2> 安装docker(从dockerhub上下载最新的安装包进行安装)

3> 将本机生成证书并将证书拷贝到远程主机上

4> 设置远程主机的启动程序并启动远程主机的docker进程

批量安装时花费的时间比较长

[root@docker-ce ~]# docker-machine create -d generic --generic-ip-address=192.168.0.20 docker1(使用generic驱动安装ip为192.168.0.20的主机,并且将其主机名设置为docker1)

Creating CA: /root/.docker/machine/certs/ca.pem

Creating client certificate: /root/.docker/machine/certs/cert.pem

Running pre-create checks...

Creating machine...

(docker1) No SSH key specified. Assuming an existing key at the default location.

Waiting for machine to be running, this may take a few minutes...

Detecting operating system of created instance...

Waiting for SSH to be available...

Detecting the provisioner...

Provisioning with centos...

Copying certs to the local machine directory...

Copying certs to the remote machine...

Setting Docker configuration on the remote daemon...

Checking connection to Docker...

Docker is up and running!

To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env docker1

[root@docker-ce ~]# docker-machine create -d generic --generic-ip-address=192.168.0.30 docker2

Running pre-create checks...

Creating machine...

(docker2) No SSH key specified. Assuming an existing key at the default location.

Waiting for machine to be running, this may take a few minutes...

Detecting operating system of created instance...

Waiting for SSH to be available...

Detecting the provisioner...

Provisioning with centos...

Copying certs to the local machine directory...

Copying certs to the remote machine...

Setting Docker configuration on the remote daemon...

Checking connection to Docker...

Docker is up and running!

To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env docker2

[root@docker-ce ~]# docker-machine ls (检查是否安装成功,查看远程主机上的版本)

NAME      ACTIVE  DRIVER    STATE    URL                      SWARM  DOCKER        ERRORS

docker1  -        generic  Running  tcp://192.168.0.20:2376          v18.05.0-ce 

docker2  -        generic  Running  tcp://192.168.0.30:2376          v18.05.0-ce

5. 其他情况说明

在生成证书的时候,在本机上和远程主机上都会保存相关的证书信息,而且docker-mahine的配置信息也是保存在此位置,相当于控制的主机,如下所示:

[root@docker-ce ~]# ls -l .docker/(在家目录的隐藏目录.docker目录下)

total 4

-rw-------. 1 root root 173 Jan 17 14:52 config.json(保存的是控制机的配置信息,例如docker客户端的版本)

drwx------. 4 root root  35 Jan 13 14:34 machine(保存本机和远程主机上证书信息及相关远程主机的配置信息)

远程主机运行的进程时候,已经做了相关的配置,进程也已经启动,查看启动的进程信息:

[root@docker2 ~]# ls -l /etc/docker/(证书保存的配置,使用https进行通信,保证安全性)

total 20

-rw-r--r--. 1 root root 1029 Jan 20 05:18 ca.pem

-rw-r--r--. 1 root root  56 Jan 19 03:12 daemon.json

-rw-------. 1 root root  245 Dec 12 21:40 key.json

-rw-r--r--. 1 root root 1679 Jan 20 05:18 server-key.pem

-rw-r--r--. 1 root root 1103 Jan 20 05:18 server.pem

[root@docker2 ~]# cat /etc/systemd/system/docker.service.d/10-machine.conf

(启动的配置文件,在单机host环境中不存在此目录,此文件会覆盖默认的启动的配置文件)

[Service]

ExecStart=

ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --storage-driver devicemapper--tlsverify --tlscacert/etc/docker/ca.pem --tlscert /etc/docker/server.pem --tlskey /etc/docker/server-key.pem --label provider=generic

Environment=

[root@docker2 ~]# ps -ef|grep docker(查看启动的docker进程)

root      21741      1  0 05:18 ?        00:00:11 /usr/bin/dockerd -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --storage-driver devicemapper --tlsverify --tlscacert /etc/docker/ca.pem --tlscert /etc/docker/server.pem --tlskey /etc/docker/server-key.pem --label provider=generic

root      21746  21741  0 05:19 ?        00:00:11 docker-containerd --config /var/run/docker/containerd/containerd.toml

root      21950  17184  0 05:39 pts/0    00:00:00 grep --color=auto docker

[root@docker2 ~]# netstat -tunlpx |grep dockerd(查看docker监听的端口)

tcp6      0      0 :::2376:::*                    LISTEN      21741/dockerd

unix  2      [ ACC ]    STREAM    LISTENING    324400  21741/dockerd        /var/run/docker.sock

unix  2      [ ACC ]    STREAM    LISTENING    323509  21741/dockerd        /var/run/docker/metrics.sock

unix  2      [ ACC ]    STREAM    LISTENING    324567  21741/dockerd        /run/docker/libnetwork/fc7eb55d830a15800059dcf61156a80314b2ba7354834170cf198702e586f22e.sock

在使用多机环境的时候需要注意的是,启动的配置文件已经被覆盖了,如果去修改单机环境中的启动的配置文件是不能生效的,必须要修改新创建的目录下的文件内容。


三、跨主机通信

使用overlay驱动进行跨主机通信,在使用此驱动的时候,是通过udp的4789端口进行通信。

1. 创建数据库来保存网络信息

docker-ce配置

直接使用容器consul来进行运行,如下所示:

[root@docker-ce]# docker run -d -p 8500:8500 -h consul --name consul progrium/consul --server -bootstrap

Unable to find image 'progrium/consul:latest' locally

latest: Pulling from progrium/consul

c862d82a67a2: Pull complete

0e7f3c08384e: Pull complete

0e221e32327a: Pull complete

09a952464e47: Pull complete

60a1b927414d: Pull complete

4c9f46b5ccce: Pull complete

417d86672aa4: Pull complete

b0d47ad24447: Pull complete

fd5300bd53f0: Pull complete

a3ed95caeb02: Pull complete

d023b445076e: Pull complete

ba8851f89e33: Pull complete

5d1cefca2a28: Pull complete

Digest: sha256:8cc8023462905929df9a79ff67ee435a36848ce7a10f18d6d0faba9306b97274

Status: Downloaded newer image for progrium/consul:latest

6ac42624732d189e0e8913c69632b266e0fe67103c4f1403ffd8b155cffc1e61

[root@docker-ce]# docker ps

CONTAINER ID        IMAGE              COMMAND                  CREATED            STATUS              PORTS                                                                            NAMES

6ac42624732d        progrium/consul    "/bin/start --server…"  18 seconds ago      Up 14 seconds      53/tcp, 53/udp, 8300-8302/tcp, 8400/tcp, 8301-8302/udp, 0.0.0.0:8500->8500/tcp  consul

使用ip加端口直接进行访问,此处是http://192.168.0.10:8500

2. 远程主机配置

在远程主机上要在这个数据库上注册,从而需要修改配置文件,如下所示:

[root@docker1 ~]# vim  /etc/systemd/system/docker.service.d/10-machine.conf (加粗内容是需要添加的)

[Service]

ExecStart=

ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --storage-driver devicemapper --tlsverify --tlscacert /etc/docker/ca.pem --tlscert /etc/docker/server.pem --tlskey /etc/docker/server-key.pem --label provider=generic --cluster-store=consul://192.168.0.10:8500 --cluster-advertise=ens32:2376

Environment=

参数说明:

--cluster-store主要表示为需要连接的kv存储的地址,--cluster-advertise表示使用哪个网卡和端口来进行通信。ens32表示为网卡的名称或者使用主机的ip地址。

[root@docker1 ~]# systemctl daemon-reload(重新加载配置文件)

[root@docker1 ~]# systemctl restart docker(重新启动服务)

docker2上同样进行上述操作

再次查看kv存储,发现已经注册,注意在点击的时候,需要先点击key/value,然后再点击docker,最后点击nodes才能看到注册的主机


3. 创建overlay网络

[root@docker1 ~]# docker network ls

NETWORK ID          NAME                DRIVER              SCOPE

ef17c0c56159        bridge              bridge              local

34963f83928c        host                host                local

a79f72191b90        none                null                local

[root@docker1 ~]#  docker network create -d overlay kel    //(创建overlay网络

8675d048411335e1738996b62fb9e505e270379a3efd1a4af2a9f7b96c03dd1f

[root@docker1 ~]# docker network ls

NETWORK ID          NAME                DRIVER              SCOPE

ef17c0c56159        bridge              bridge              local

34963f83928c        host                host                local

8675d0484113        kel                overlay            global

a79f72191b90        none                null                local

[root@docker2 ~]# docker network ls       //(在主机docker1上也能看到此网络

NETWORK ID          NAME                DRIVER              SCOPE

d78fa5f31c2a        bridge              bridge              local

34963f83928c        host                host                local

8675d0484113        kel                overlay            global

a79f72191b90        none                null                local

4. 创建容器测试网络连通性

[root@docker1 ~]# docker pull cirros

Using default tag: latest

latest: Pulling from library/cirros

480d57c7bf4d: Pull complete

0f45bfe9a805: Pull complete

5aa6c26e64dc: Pull complete

Digest: sha256:e67f6f4a0521e326ba2dd697950046aba5ce836edda79cb818d45a56841c7ca2

Status: Downloaded newer image for cirros:latest

[root@docker1 ~]# docker run -itd --name b1 --network=kel cirros  //(运行一个网络在kel网络中的容器

/ # ifconfig

eth0      Link encap:Ethernet  HWaddr 02:42:0A:00:00:04 

          inet addr:10.0.0.2  Bcast:10.0.0.255  Mask:255.255.255.0

          UP BROADCAST RUNNING MULTICAST  MTU:1450  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

[root@docker2 ~]# docker run -itd --name b2 --network=kel cirros    //(在另一台主机上运行一个kel网段中的容器

/ # ifconfig

eth0      Link encap:Ethernet  HWaddr 02:42:0A:00:00:03 

          inet addr:10.0.0.3  Bcast:10.0.0.255  Mask:255.255.255.0

          UP BROADCAST RUNNING MULTICAST  MTU:1450  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

/# ip r   //(查看路由

default via 172.18.0.1 dev eth1

10.0.0.0/24 dev eth0 scope link  src 10.0.0.2

172.18.0.0/16 dev eth1 scope link  src 172.18.0.2

/ # cat /etc/resolv.conf    //(自带的DNS解析

nameserver 127.0.0.11

options ndots:0

/ # ip addr show    //(有两个网络接口

1: lo: mtu 65536 qdisc noqueue qlen 1

    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

7: eth0@if8: mtu 1450 qdisc noqueue

    link/ether 02:42:0a:00:00:02 brd ff:ff:ff:ff:ff:ff

    inet 10.0.0.2/24 brd 10.0.0.255 scope global eth0

      valid_lft forever preferred_lft forever

10: eth1@if11: mtu 1500 qdisc noqueue

    link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff

    inet 172.18.0.2/16 brd 172.18.255.255 scope global eth1

      valid_lft forever preferred_lft forever

5. 不同宿主机内容器互通测试

docker1内容器

/ # ping b2 (跨主机ping)

PING b2 (10.0.0.3): 56 data bytes

64 bytes from 10.0.0.3: seq=0 ttl=64 time=19.570 ms

64 bytes from 10.0.0.3: seq=1 ttl=64 time=3.206 ms

--- b2 ping statistics ---

2 packets transmitted, 2 packets received, 0% packet loss

round-trip min/avg/max = 3.206/11.388/19.570 ms

docker2内容器

/# ping b1

PING 10.0.0.2 (10.0.0.2): 56 data bytes

64 bytes from 10.0.0.2: seq=0 ttl=64 time=37.227 ms

64 bytes from 10.0.0.2: seq=1 ttl=64 time=0.448 ms

--- 10.0.0.2 ping statistics ---

2 packets transmitted, 2 packets received, 0% packet loss

round-trip min/avg/max = 0.448/18.837/37.227 ms


原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容