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驅動的時候,能夠進行跨主機通訊。