docker跨主機通訊

序言

Love You Like a Love SongSelena Gomez;The Scene - For Younode

    腦子裏不知道想啥,感受都是漿糊。。。都是水。。。
git


    腦子裏老是飄着奇怪的數字,2379,2376,6379。。。各類各樣的端口,長的都差很少,寫着寫着就忘記了哪一個數字是哪一個服務了。。。。錯了一個端口,浪費8個小時。。。大寫的FUCK
github


    在跨主機通訊的時候,可使用各類各樣的驅動,然而老是在須要通訊的那一刻終止。。。。究竟是什麼阻擋了腳步?是由於愛嗎?仍是由於責任呢。。。。是什麼擋住了那無窮的想象力。。。
docker


    在通訊不暢的時候,抓包。。。請求都收不到。。。防火牆。。。開放一個端口,不夠。。。再來一個。。。FUCK。。。都沒有想到是這個端口號記錯了。。。
數據庫


    在一臺機器上操做的時候,可以流暢無比,可是,在集羣環境下,那就只能just fuck了。。。。各類各樣的環境依賴,服務依賴。。。錯了一小步,就會致使沒法回頭的錯誤。。。
json

使用docker-machine批量安裝docker環境bootstrap

    在一個集羣環境中,想批量安裝docker環境並配置服務,有不少種方式,在這裏選擇的是使用docker-machine進行安裝,架構以下:
centos

圖片

一、 安裝docker-machine安全

    在使用docker-machine進行批量安裝docker的時候,首先安裝docker-machine,以下:
網絡

[root@docker-ce ~]# curl -L https://github.com/docker/machine/releases/download/v0.13.0/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine && \

chmod +x /tmp/docker-machine && \

sudo cp /tmp/docker-machine /usr/local/bin/docker-machine

    其實就是下載編譯二進制包,而後修改執行權限,而且將此文件拷貝到環境變量的路徑中。

[root@docker-ce ~]# docker-machine version(檢查docker-machine是否安裝成功

docker-machine version 0.13.0, build 9ba6da9

二、 配置無密碼登陸

    在使用docker-machine進行批量安裝的時候,因爲須要登陸到遠程主機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.1.33(複製公鑰

[root@docker-ce ~]# ssh-copy-id 192.168.1.32(複製公鑰

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

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

ECDSA key fingerprint is SHA256:40BPIYtUfwlxArndNoor49Uf6pSOIsSG4vH6U8AUHtA.

ECDSA key fingerprint is MD5:18:73:90:9f:60:c5:a2:6f:37:e1:11:35:13:79:fe:cc.

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.1.32's password: 輸入遠程主機root用戶的密碼

Number of key(s) added: 1

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

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

[root@docker-ce ~]# ssh 192.168.1.32 (登陸驗證

Last login: Fri Jan 19 05:13:46 2018 from 192.168.1.222

[root@docker1 ~]# exit

logout

Connection to 192.168.1.32 closed.

三、批量安裝docker環境並配置啓動

[root@docker-ce ~]# docker-machine ls(查看使用安裝docker的機器

NAME   ACTIVE   DRIVER   STATE   URL   SWARM   DOCKER   ERRORS

[root@docker-ce ~]# docker-machine create -d generic --generic-ip-address=192.168.1.33 docker2(使用generic的驅動安裝ip爲192.168.1.33的主機,而且將主機名設置爲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

    在進行批量安裝的時候,主要作幾件事,使用ssh鏈接到遠程主機上(配置無密碼登陸等緣由),安裝docker(從dockerhub上下載最新的安裝包進行安裝),本機生成證書並將證書拷貝到遠程主機上,設置遠程主機的啓動程序,啓動遠程主機的docker進程。

    這個可能花費的時間比較長,可使用-D選項進行調試,而後就能夠看到詳細的執行步驟,而且能夠查看遠程主機的messages日誌文件,會發現更新了不少包,也能看到相關的執行步驟。

[root@docker-ce ~]# docker-machine ls(檢查是否安裝成功,查看遠程主機上的版本

NAME      ACTIVE   DRIVER    STATE     URL                       SWARM   DOCKER        ERRORS

docker1   -        generic   Running   tcp://192.168.1.32:2376           v18.01.0-ce   

docker2   -        generic   Running   tcp://192.168.1.33:2376           v18.01.0-ce 

4 、安裝可能出現的問題
    在安裝的時候,可能錯誤,沒法獲取到遠程主機上的docker版本,顯示爲沒有路由到遠程的主機:  

[root@docker-ce ~]# docker-machine ls(查看遠程主機上的安裝狀況

NAME          ACTIVE   DRIVER    STATE     URL                       SWARM   DOCKER        ERRORS

docker2   -        generic   Running   tcp://192.168.1.33:2376           Unknown       Unable to query docker version: Get https://192.168.1.33:2376/v1.15/version: dial tcp 192.168.1.33:2376: getsockopt: no route to host

dokcer1       -        generic   Running   tcp://192.168.1.32:2376           v18.01.0-ce 

[root@docker2 system]# firewall-cmd --zone=public --add-port=2376/tcp --permanent(添加防火牆規則

success

[root@docker2 ~]# systemctl restart firewalld(重啓firewalld防火牆服務

    在獲取遠程主機上版本的時候,主要是經過端口2376來進行通訊,而防火牆阻擋了這一切,從而須要修改防火牆配置,放行2376端口而且重啓防火牆。

五、 其餘狀況說明

    在生成證書的時候,在本機上和遠程主機上都會保存相關的證書信息,並且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

    在使用多機環境的時候須要注意的是,啓動的配置文件已經被覆蓋了,若是去修改單機環境中的啓動的配置文件是不能生效的,必需要修改新建立的目錄下的文件內容纔可。

docker跨主機通訊

    docker在跨主機通訊的時候,能夠有不少種選擇,在這裏使用的是overlay驅動,在使用此驅動的時候,是經過udp的4789端口進行通訊。

一、 建立數據庫來保存網絡信息

    直接使用容器consul來進行運行,以下所示:

[root@docker-ce ~]# docker run -d -p 8400:8400 -p 8500:8500 -p 8600:53/udp -h consul progrium/consul -server -bootstrap

7c698169901a167949ebc048e297d998c90aaa3449d8b2bbf48fa1f7ff72083e

    使用ip加端口直接進行訪問,此處是http://192.168.1.222:8500,注意修改爲你本身的ip地址

圖片

二、 遠程主機配置

    在遠程主機上要在這個數據庫上註冊,從而須要修改配置文件,以下所示:

[root@docker2 ~]# cat  /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.1.222:8500 --cluster-advertise=ens33:2376 

Environment=

[root@docker2 ~]# systemctl daemon-reload(從新加載配置文件

[root@docker2 ~]# systemctl restart docker(從新啓動服務

    修改的參數中,--cluster-store主要表示爲須要鏈接的kv存儲的地址,--cluster-advertise表示使用哪一個網卡和端口來進行通訊。ens33表示爲網卡的名稱或者使用主機的ip地址。

    再次查看kv存儲,發現已經註冊,注意在點擊的時候,須要點擊docker,而後點擊nodes才能看到註冊的主機。

圖片


三、 建立overlay網絡

     只要驅動選擇爲overlay便可。

[root@docker2 ~]# docker network create -d overlay kel(建立overlay的網絡

b13122ee6b6598d430b6ad0a194b65b27c7c6ff2484be102c12f932ad00de342

[root@docker2 ~]# docker network ls(在docker2上能看到建立的overlay的網絡,顯示的scope爲global

NETWORK ID          NAME                DRIVER              SCOPE

7385aa8c4e8c        bridge              bridge              local

91fb3cd46340        host                host                local

b13122ee6b65        kel                 overlay             global

dfd733e10a05        none                null                local

[root@docker1 ~]# docker network ls(在主機docker1上也能看到此網絡

NETWORK ID          NAME                DRIVER              SCOPE

eebdc9cef2ad        bridge              bridge              local

09cfc3e66278        host                host                local

b13122ee6b65        kel                 overlay             global

2743c354366c        none                null                local

四、建立容器測試網絡連通性

[root@docker1 ~]# docker run -itd --name b1 --network=kel busybox(運行一個網絡在kel的容器

026427057b484d5e64dbfd8a3d732469ae5a001cfb00f4f4cdd8059799a4cc34

[root@docker2 ~]# docker run -itd --name b2 --network=kel busybox(在另外一臺主機上運行一個容器

03f3f96e42eebd70ece2a655dae10c035c512502d68ac48e7cd14d8938e18066

[root@docker1 ~]# docker exec -it b1 sh(跨主機能夠ping通

/ # ping -c 2 b2

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

/ # 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: <LOOPBACK,UP,LOWER_UP> 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

93: eth0@if94: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> 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

96: eth1@if97: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> 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

五、 問題

    可能出現沒法ping通的狀況,主要就是查看防火牆的設置,此處主要使用4789的udp進行通訊,從而須要開通:

/ # ping -c 2 b1(未開通防火牆

PING b1 (10.0.0.2): 56 data bytes

--- b1 ping statistics ---

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

[root@docker1 ~]# firewall-cmd --zone=public --add-port=4789/udp --permanent(放行4789的udp端口

success

[root@docker1 ~]# systemctl restart firewalld

/ # ping -c 2 b1(開通了防火牆

PING b1 (10.0.0.2): 56 data bytes

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

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


--- b1 ping statistics ---

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

round-trip min/avg/max = 3.788/5.434/7.081 ms

    日誌中可能出現以下錯誤:

[ERR] memberlist: Push/Pull with docker2 failed: dial tcp 192.168.1.33:7946: getsockopt: no route to host\n

    也要開啓7946的tcp端口,各個主機是要進行通訊的。

總結

    一、 在各類各樣的環境中,可使用docker-machine進行統一管理docker。

    二、使用overlay驅動的時候,能夠進行跨主機通訊。

相關文章
相關標籤/搜索