Docker三劍客之Docker-Machine
批量化在主機上安裝docker可以使用docker-machine
Docker Machine可以支援在不同的環境下安裝配置docker host
- 常規的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將所有機器加入控制主機。