1. 程式人生 > 實用技巧 >Docker三劍客之Docker-Machine

Docker三劍客之Docker-Machine

批量化在主機上安裝docker可以使用docker-machine

Docker Machine可以支援在不同的環境下安裝配置docker host

  1. 常規的Linux作業系統

2)虛擬化平臺VirtualBox、Vmware等

3)公有云Amazon Web Services、Microsoft Azure、Google Compute Engine等

實驗環境描述

作業系統版本 ip 配置 角色
Ubuntu 18.04.4 LTS 172.16.89.101 4核8G machine
Ubuntu 18.04.4 LTS 172.16.89.100 4核8G node1
Ubuntu 18.04.4 LTS 172.16.89.99 4核8G node2

官方專案地址位於 https://github.com/docker/machine/releases 目前最新版本是v0.16.2

安裝的方法也很簡單,只需要執行:

curl -L https://github.com/docker/machine/releases/download/v0.16.2/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine &&
chmod +x /tmp/docker-machine &&
sudo cp /tmp/docker-machine /usr/local/bin/docker-machine

執行完成執行docker-machine有正常輸出即完成安裝

root@docker-machine:~# docker-machine ls
NAME   ACTIVE   DRIVER   STATE   URL   SWARM   DOCKER   ERRORS
root@docker-machine:~# 

由於docker-machine再安裝host時需要免密登入到遠端主機上,所以在machine節點上建立ssh祕鑰,併發送到node1節點和node2節點上

root@docker-machine:~# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
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:xafvCmF4xRwbNLLI8eOnXZECMYWtqkCBCqPE7Zjj7d0 root@docker-machine
The key's randomart image is:
+---[RSA 2048]----+
|...   . =**      |
|+o.. . +.O.= .   |
|=.+.  o +.O +    |
|o+..   o.+ + .   |
|..o   ..S o .    |
| ...  .o = o     |
|  ..... o . .    |
|   ... E . .     |
|          ...    |
+----[SHA256]-----+
root@docker-machine:~# ssh-copy-id 172.16.89.100
...
[email protected]'s password: 
...

root@docker-machine:~# ssh-copy-id 172.16.89.99
...
[email protected]'s password: 
...

開始安裝

上述操作完成後就可以開始安裝了執行docker-machine create子命令在node1上部署docker了

root@docker-machine:~# docker-machine create --driver generic --generic-ip-address=172.16.89.100 node1
Running pre-create checks...
Creating machine...
(node1) 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 ubuntu(systemd)...
Installing Docker...

同樣的可以執行docker-machine create --driver generic --generic-ip-address=172.16.89.99 node2在node2上部署docker

在實際執行中發現由於docker-machine預設使用了官方的映象站下載docker-ce,造成執行過程會一直卡在"Installing Docker...",如果機器數量較少推薦先在node節點上使用阿里雲映象安裝dock-ce,在到machine節點上建立就行了。安裝步驟如下

# step 1: 安裝必要的一些系統工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安裝GPG證書
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 寫入軟體源資訊
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新並安裝Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce

在node1和node2節點上完成docker-ce安裝後即可以繼續回到machine節點操作了,這種方法僅適用於機器較少的情況,如果機器多安裝慢,使用Ansible安裝後再執行docker-machine create。

root@docker-machine:~# docker-machine ls
NAME    ACTIVE   DRIVER    STATE     URL                        SWARM   DOCKER     ERRORS
node1   -        generic   Running   tcp://172.16.89.100:2376           v19.03.8   
node2   -        generic   Running   tcp://172.16.89.99:2376            v19.03.8   

正常輸出即表示docker-machine已經把docker在所有node部署好了

登入到任意的node節點檢視docker.service配置

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 overlay2 --tlsverify --tlscacert /etc/docker/ca.pem --tlscert /etc/docker/server.pem --tlskey /etc/docker/server-key.pem --label provider=generic
Environment=

-H tcp://0.0.0.0:2376:使Docker Daemon接收遠端連線,非docker-machie安裝方式是沒有這個選項的

--tls*:對來自遠端主機的連線請求啟用安全認證和加密措施

更好的體驗

為了得到更好的體驗,可以安裝bash completion script,從而在bash中使用tab補全命令。專案地址位於

https://github.com/docker/machine/tree/master/contrib/completion/bash

將頁面上的三個指令碼放到machine上/etc/bash_completion.d目錄下,同時新增如下程式碼到$HOME/.bashrc中

source /etc/bash_completion.d/docker-machine-prompt.bash 
source /etc/bash_completion.d/docker-machine.bash 
source /etc/bash_completion.d/docker-machine-wrapper.bash
PS1='[\u@\h \W$(__docker_machine_ps1 " [%s]")]\$'

docker-machine env子命令可以提示操作node節點所需的環境變數

[root@docker-machine ~]# docker-machine env node1
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://172.16.89.100:2376"
export DOCKER_CERT_PATH="/root/.docker/machine/machines/node1"
export DOCKER_MACHINE_NAME="node1"
# Run this command to configure your shell: 
# eval $(docker-machine env node1)

執行eval $(docker-machine env node1)就可以切換到node1上執行指令同時提示符也會變成node1

[root@docker-machine ~]# eval $(docker-machine env node1)
[root@docker-machine ~ [node1]]# 

在其上執行的所有docker命令搜相當於node1上執行

[root@docker-machine ~ [node1]]# docker pull nginx:alpine
alpine: Pulling from library/nginx
cbdbe7a5bc2a: Pull complete 
c554c602ff32: Pull complete 
Digest: sha256:763e7f0188e378fef0c761854552c70bbd817555dc4de029681a2e972e25e30e
Status: Downloaded newer image for nginx:alpine
docker.io/library/nginx:alpine

回到node1終端上,發現nginx:alpine映象已下載,而且machine節點上是沒有這個映象的

root@node1:~# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               alpine              89ec9da68213        2 weeks ago         19.9MB

其他的docker命令都可以通過eval $(docker-machine env nodeX)上切換到相應的node節點執行docker子命令

docker-machine子命令

子命令 效果
active 輸出處於active狀態的node節點
config 檢視machine的damon配置
create 建立machine
env 顯示node節點的環境變數
ls 顯示node節點的狀態資訊
stop/start/restart 對node所在的作業系統執行開關重啟操作
scp 在node節點中複製資料
upgrade 將node節點上的docker升級到最新版本
docker-machine scp node1:/tmp/a.txt node2:/tmp/

總結

在多主機環境上使用docker-machine部署docker將大大提高效率。當然由於預設使用的國外的映象源,安裝docker會很慢,介意的話最好先用Ansible批量化安裝docker再執行docker-machine將所有機器加入控制主機。