Docker Machine

JIAN2 發表於 2022-11-28
Docker

Docker Machine


https://docs.docker.com/machine/overview/


# 安裝 Docker Machine
-- https://github.com/docker/machine
-- https://github.com/docker/machine/releases/
-- Docker Machine官網地址:https://docs.docker.com/machine/install-machine/
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
wget https://github.com/docker/machine/releases/download/v0.16.2/docker-machine-Linux-x86_64
docker-machine version
base=https://raw.githubusercontent.com/docker/machine/v0.16.2
for i in docker-machine-prompt.bash docker-machine-wrapper.bash docker-machine.bash
do
  sudo wget "$base/contrib/completion/bash/${i}" -P /etc/bash_completion.d
done
wget https://raw.githubusercontent.com/docker/machine/v0.16.2/contrib/completion/bash/docker-machine-prompt.bash -P /etc/bash_completion.d
wget https://raw.githubusercontent.com/docker/machine/v0.16.2/contrib/completion/bash/docker-machine-wrapper.bash -P /etc/bash_completion.d
wget https://raw.githubusercontent.com/docker/machine/v0.16.2/contrib/completion/bash/docker-machine.bash -P /etc/bash_completion.d
cat >> ~/.bashrc << "EOF"
source /etc/bash_completion.d/docker-machine-wrapper.bash
source /etc/bash_completion.d/docker-machine-prompt.bash
source /etc/bash_completion.d/docker-machine.bash
 
PS1='[\[email protected]\h \W$(__docker_machine_ps1)]\$ '
EOF
source ~/.bashrc
ssh-keygen
ssh-copy-id [email protected]
ssh-copy-id [email protected]
ssh-copy-id [email protected]
docker-machine ls
docker-machine create --driver generic --generic-ip-address=192.168.1.35 docker35
docker-machine create --driver generic --generic-ip-address=192.168.1.36 docker36
docker-machine create --driver generic --generic-ip-address=192.168.1.37 docker37
docker-machine env docker35
# docker-machine rm lhrdm12 -f


一、什麼是Docker Machine

  Docker Machine 是Docker官方編排專案之一,使用go語言編寫的,使用不同引擎在多種平臺上快速的安裝Docker環境,開源地址: https://github.com/docker/machine

  Docker Machine 是一個工具,它允許你在虛擬宿主機上安裝Docker,並使用docker-machine命令管理這個宿主機,可以使用Docker Machine在本地的MAC或者windows box、公司網路,資料中心或者AWS這樣的雲提供商上建立docker。

  使用docker-machine命令,可以啟動、審查、停止、重啟託管的docker 也可以升級Docker客戶端和守護程式並配置docker客戶端和宿主機通訊。

  Docker Machine 也可以集中管理所以得docker主機。

Docker Machine

 

二、為什麼要使用Docker Machine

Docker Machine 使你能夠在各種 Linux 上配置多個遠端 Docker 宿主機。
此外,Machine 允許你在較早的 Mac 或 Windows 系統上執行 Docker,如上一主題所述。
Docker Machine 有這兩個廣泛的用例。

  • 我有一個較舊的桌面系統,並希望在 Mac 或 Windows 上執行 Docker

Docker(五):Docker 三劍客之 Docker Machine

如果你主要在不符合新的 Docker for Mac 和 Docker for Windows 應用程式的舊 Mac 或 Windows 膝上型電腦或桌上型電腦上工作,則需要 Docker Machine 來在本地“執行Docker”(即Docker Engine)。在 Mac 或 Windows box 中使用 Docker Toolbox 安裝程式安裝 Docker Machine 將為 Docker Engine 配置一個本地的虛擬機器,使你能夠連線它、並執行 docker 命令。

  • 我想在遠端系統上配置 Docker 宿主機

Docker(五):Docker 三劍客之 Docker Machine

Docker Engine Linux 系統上原生地執行。如果你有一個 Linux 作為你的主系統,並且想要執行 docker 命令,所有你需要做的就是下載並安裝 Docker Engine 。然而,如果你想要在網路上、雲中甚至本地配置多個 Docker 宿主機有一個有效的方式,你需要 Docker Machine。

無論你的主系統是 Mac、Windows 還是 Linux,你都可以在其上安裝 Docker Machine,並使用 docker-machine 命令來配置和管理大量的 Docker 宿主機。它會自動建立宿主機、在其上安裝 Docker Engine 、然後配置 docker 客戶端。每個被管理的宿主機(“machine”)是 Docker 宿主機和配置好的客戶端的結合。

三、Docker和Docker Machine之間的區別

當人們說“Docker”時,他們通常是指 Docker Engine,它是一個客戶端 - 伺服器應用程式,由 Docker 守護程式、一個REST API指定與守護程式互動的介面、和一個命令列介面(CLI)與守護程式通訊(通過封裝REST API)。Docker Engine 從 CLI 中接受docker 命令,例如 docker run <image>、docker ps 來列出正在執行的容器、docker images 來列出映象,等等。

Docker(五):Docker 三劍客之 Docker Machine

Docker Machine 是一個用於配置和管理你的宿主機(上面具有 Docker Engine 的主機)的工具。通常,你在你的本地系統上安裝 Docker Machine。Docker Machine有自己的命令列客戶端 docker-machine 和 Docker Engine 客戶端 docker。你可以使用 Machine 在一個或多個虛擬系統上安裝 Docker Engine。

這些虛擬系統可以是本地的(就像你在 Mac 或 Windows 上使用 Machine 在 VirtualBox 中安裝和執行 Docker Engine 一樣)或遠端的(就像你使用 Machine 在雲提供商上 provision Dockerized 宿主機一樣)。Dockerized 宿主機本身可以認為是,且有時就稱為,被管理的“machines”。

Docker(五):Docker 三劍客之 Docker Machine

四、安裝

  Docker Mechine 可以在多種平臺上安裝使用,包括Linux 、MacOS已經windows

  Docker Mechine 安裝非常的簡單:GitHub地址: https://github.com/docker/machine/releases/ 裡面有安裝教程(在寫這篇文章的時候最新版本是v0.15.0)

  安裝 Docker Mechine

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
[[email protected] ~] # curl -L https://github.com/docker/machine/releases/download/v0.15.0/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine
   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                  Dload  Upload   Total   Spent    Left  Speed
100   617    0   617    0     0    462      0 --:--:--  0:00:01 --:--:--   463
100 26.8M  100 26.8M    0     0  1000k      0  0:00:27  0:00:27 --:--:-- 1373k
[[email protected] ~] # chmod +x /tmp/docker-machine
[[email protected] ~] # cp /tmp/docker-machine /usr/local/bin/docker-machine
 
# 檢視版本確認是否安裝成功
[[email protected] ~] # docker-machine -v
docker-machine version 0.15.0, build b48dc28d
 
# 安裝自動補全功能
[[email protected] ~] # yum -y install bash-completion
[[email protected] ~] # scripts=( docker-machine-prompt.bash docker-machine-wrapper.bash docker-machine.bash ); for i in "${scripts[@]}"; do wget https://raw.githubusercontent.com/docker/machine/v0.15.0/contrib/completion/bash/${i} -P /etc/bash_completion.d; done
 
# 新增以下
[[email protected] ~] # cat ~/.bashrc
# .bashrc
 
# User specific aliases and functions
 
alias  rm = 'rm -i'
alias  cp = 'cp -i'
alias  mv = 'mv -i'
 
# Source global definitions
if  [ -f  /etc/bashrc  ];  then
         /etc/bashrc
fi
 
source  /etc/bash_completion .d /docker-machine-wrapper . bash
source  /etc/bash_completion .d /docker-machine-prompt . bash
source  /etc/bash_completion .d /docker-machine . bash
 
PS1= '[\[email protected]\h \W$(__docker_machine_ps1)]\$ '
 
# 使之生效
[[email protected] ~] # source ~/.bashrc

  到此位置docker-machine就安裝完成了!

五、引數

  支援命令

命令 說明
active 檢視當前啟用狀態的Docker主機
config 檢視當前啟用狀態Docker主機的連線資訊
creat  建立Docker主機
env 顯示連線到某個主機需要的環境變數
inspect 以json格式輸出指定Docker的詳細資訊
ip 獲取指定Docker主機的地址
kill 直接殺死指定的Docker主機
ls 列出所有的管理主機
provision 重新配置指定主機
regenerate-certs 為某個主機重新生成TLS資訊
restart 重啟指定的主機
rm 刪除某臺Docker主機,對應的虛擬機器也會被刪除
ssh 通過SSH連線到主機上,執行命令
scp 在Docker主機之間以及Docker主機和本地主機之間通過scp遠端複製資料
mount 使用SSHFS從計算機裝載或解除安裝目錄
start 啟動一個指定的Docker主機,如果物件是個虛擬機器,該虛擬機器將被啟動
status 獲取指定Docker主機的狀態(包括:Running、Paused、Saved、Stopped、Stopping、Starting、Error)等
stop 停止一個指定的Docker主機
upgrade 將一個指定主機的Docker版本更新為最新
url 獲取指定Docker主機的監聽URL
version 顯示Docker Machine的版本或者主機Docker版本
help 顯示幫助資訊

  支援的平臺及驅動引擎

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 平臺
1.常規Linux作業系統;
 
2.虛擬化平臺-VirtualBox,VMware,Hyper-V
 
3.Openstack
 
4.公有云-Amazon Web Services,Microsoft Azure,Google Compute Engine,Digital Ocean等
 
Docker Machine為這些環境起了一個統一的名字:provider
 
對於特定的某個provider,Docker Machine使用相應的driver安裝配置docker host
 
# 驅動引擎
amazonec2
azure
digitalocean
exoscale
generic
google
hyperv
none
openstack
rackspace
softlayer
virtualbox
vmwarevcloudair
vmwarefusion
vmwarevsphere
 
# 指定方式
使用引數 -d 或者 --driver 驅動引擎名稱

  說白了都是虛擬化平臺和雲平臺的驅動檔案

六、使用

  通過Docker Machine 建立docker(我用了兩臺機器)

  • 192.168.31.43  安裝docker machine的機器  主機名:operation
  • 192.168.31.188  被管理的機器       主機名:client1

  建立步驟:

  1. 配置主機間的SSH免密(在192.168.31.43上面建立)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# 生成keys並配置可以免密登入主機(這個是必須要做的)
[[email protected] ~] # 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:0Fq7VlowSsDqSStOn4veIoTxFbW2RB059qXMSzLblKg [email protected]
The key's randomart image is:
+---[RSA 2048]----+
|   ...o..o       |
|    oo o=   .    |
|   . .*.=* +     |
|. o .+ *++O      |
|.= +  +.SBo.     |
|oo=   E .=o      |
|+.. .   +        |
|.ooo   .         |
|oo.o.            |
+----[SHA256]-----+
 
# 將keys拷貝到client1上去
/usr/bin/ssh-copy-id : INFO: Source of key(s) to be installed:  "/root/.ssh/id_rsa.pub"
The authenticity of host  '192.168.31.188 (192.168.31.188)'  can't be established.
ECDSA key fingerprint is SHA256:6MKhx743bCMD3Ay+ELNpKnq1+3 /wltcrPhbuyEclZj8 .
ECDSA key fingerprint is MD5:e8:6d:14:7e:41:da:96:4b:2c:92:f8:61:cc:f4:7b:14.
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
[email protected]'s password:
 
Number of key(s) added: 1
 
Now try logging into the machine, with:    "ssh '[email protected]'"
and check to  make  sure that only the key(s) you wanted were added.
 
# 測試是否可以免密登入
Last login: Fri Oct 12 15:27:45 2018 from 192.168.31.104
[[email protected] ~] # exit

  2. 使用docker machine建立docker host

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# 使用docker machine 建立
# 對於docker machine來將,術語Machine就是執行docker daemon的主機,建立machine就是在host上安裝docker
# 執行docker-macine ls檢視當前的machine
[[email protected] ~] # docker-machine ls
NAME   ACTIVE   DRIVER   STATE   URL   SWARM   DOCKER   ERRORS
 
# 當前還沒有一個machine,接下來我們建立第一個machine:docker188-192.168.31.188  
[[email protected] ~] # docker-machine create --driver generic --generic-ip-address=192.168.31.188 docker188
Running pre-create checks...
Creating machine...
(docker188) 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  docker188
 
注意:這裡會出現Error creating machine: Error running provisioning: error installing docker:  這樣的錯誤 原因就是因為網路的原因,沒有安裝docker
 
# 建立成功執行ls檢視
[[email protected] ~] # docker-machine  ls
NAME        ACTIVE   DRIVER    STATE     URL                         SWARM   DOCKER        ERRORS
docker188   -        generic   Running   tcp: //192 .168.31.188:2376           v18.06.1-ce  
 
# 登入到client檢視配置項
Last login: Fri Oct 12 16:19:10 2018 from 192.168.31.43
[[email protected] ~] # 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
Environment=
 
注:-H tcp: //0 .0.0.0:2376 使docker daemon接受遠端連線
 
       --tls*對遠端連線啟用安全認證和加密
 
注:大家可能會發現這裡的主機名變成了docker188 原因就是docker-machine建立的時候會把主機名也一起修改
  
# 檢視docker188的環境變數
[[email protected] ~] # docker-machine env docker188
export  DOCKER_TLS_VERIFY= "1"
export  DOCKER_HOST= "tcp://192.168.31.188:2376"
export  DOCKER_CERT_PATH= "/root/.docker/machine/machines/docker188"
export  DOCKER_MACHINE_NAME= "docker188"
# Run this command to configure your shell:
# eval $(docker-machine env docker188)
 
# 根據提示執行
[[email protected] ~] # eval $(docker-machine env docker188)
[[email protected] ~ [docker188]] #
 
可以看到,命令提示符變成了docker188,其原因是我們之前在 /root/ .bashrc裡面配置了 PS1= '[\[email protected]\h \W$(__docker_machine_ps1)]\$ ' ,用於顯示當前的docker host
注:如果我們輸入 eval  $(docker-machine  env  docker1)沒有顯示出docker188的命令提示符,我們可以重新輸入一遍 PS1= '[\[email protected]\h \W$(__docker_machine_ps1)]\$ '
在此狀態下執行的docker命令其效果都相當於在docker188上執行
 
[[email protected] ~ [docker188]] # docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[[email protected] ~ [docker188]] # docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

  3. 其他命令操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# 其他命令
# create 命令
選項包括:
·--driver,-d "none"                              指定驅動型別;
·--engine- install -url "https://get.docker.com"    配置Dokcer主機時候的安裝URL;
·--engine-opt option                            以鍵值對格式指定所建立Docker引擎的引數;
·--engine-insecure-registry option              以鍵值對格式指定所建立Docker引擎允許訪問的不支援認證的註冊倉庫服務;
·--engine-registry-mirror option                指定使用註冊倉庫映象;
·--engine-label option                          為所建立的Docker引擎新增標籤;
·--engine-storage-driver                        儲存後端驅動型別;
·--engine- env  option                            指定環境變數;
·--swarm                                        指定使用Swarm;
·--swarm-image "swarm:latest"                    使用Swarm時候採用的映象;
·--swarm-master                                 配置機器作為Swarm叢集的master節點;
·--swarm-discovery                              Swarm叢集的服務發現機制引數;
·--swarm-strategy "spread"                        Swarm預設排程策略;
·--swarm-opt option                             任意傳遞給Swarm的引數;
·--swarm-host "tcp://0.0.0.0:3376"               指定地址將監聽 Swarm master節點請求;
·--swarm-addr                                   從指定地址傳送廣播加入Swarm叢集服務。
 
例項:
docker-machine create -d virtualbox \
--engine-storage-driver overlay \
--engine-label name=testmachine \
--engine-label year=2018 \
--engine-opt dns=8.8.8.8 \
--engine- env  HTTP_PROXY=http: //proxy .com:3128 \
--engine-insecure-registry registry.private.com \
mydockermachine
  
# active命令
[[email protected] ~] # docker-machine ls
NAME        ACTIVE   DRIVER    STATE     URL                         SWARM   DOCKER        ERRORS
docker188   -        generic   Running   tcp: //192 .168.31.188:2376           v18.06.1-ce  
 
# 這裡的狀態是沒有被啟用
[[email protected] ~] # docker-machine env docker188
export  DOCKER_TLS_VERIFY= "1"
export  DOCKER_HOST= "tcp://192.168.31.188:2376"                            # 啟用主機
export  DOCKER_CERT_PATH= "/root/.docker/machine/machines/docker188"
export  DOCKER_MACHINE_NAME= "docker188"
# Run this command to configure your shell:
# eval $(docker-machine env docker188)
 
[[email protected] ~] # export DOCKER_HOST="tcp://192.168.31.188:2376"
[[email protected] ~] # docker-machine ls
NAME        ACTIVE   DRIVER    STATE     URL                         SWARM   DOCKER        ERRORS
docker188   *        generic   Running   tcp: //192 .168.31.188:2376           v18.06.1-ce  
[[email protected] ~] # docker-machine active
docker188
 
# config命令
[[email protected] ~] # docker-machine config docker188
--tlsverify
--tlscacert= "/root/.docker/machine/machines/docker188/ca.pem"
--tlscert= "/root/.docker/machine/machines/docker188/cert.pem"
--tlskey= "/root/.docker/machine/machines/docker188/key.pem"
-H=tcp: //192 .168.31.188:2376
 
# inspect命令
[[email protected] ~] # docker-machine inspect docker188
{
     "ConfigVersion" : 3,
     "Driver" : {
         "IPAddress" "192.168.31.188" ,
         "MachineName" "docker188" ,
         "SSHUser" "root" ,
         "SSHPort" : 22,
         "SSHKeyPath" "" ,
         "StorePath" "/root/.docker/machine" ,
         "SwarmMaster" false ,
         "SwarmHost" "" ,
         "SwarmDiscovery" "" ,
         "EnginePort" : 2376,
         "SSHKey" ""
     },
     "DriverName" "generic" ,
     "HostOptions" : {
         "Driver" "" ,
         "Memory" : 0,
         "Disk" : 0,
         "EngineOptions" : {
             "ArbitraryFlags" : [],
             "Dns" : null,
             "GraphDir" "" ,
             "Env" : [],
             "Ipv6" false ,
             "InsecureRegistry" : [],
             "Labels" : [],
             "LogLevel" "" ,
             "StorageDriver" "" ,
             "SelinuxEnabled" false ,
             "TlsVerify" true ,
             "RegistryMirror" : [],
             "InstallURL" "https://get.docker.com"
         },
         "SwarmOptions" : {
             "IsSwarm" false ,
             "Address" "" ,
             "Discovery" "" ,
             "Agent" false ,
             "Master" false ,
             "Host" "tcp://0.0.0.0:3376" ,
             "Image" "swarm:latest" ,
             "Strategy" "spread" ,
             "Heartbeat" : 0,
             "Overcommit" : 0,
             "ArbitraryFlags" : [],
             "ArbitraryJoinFlags" : [],
             "Env" : null,
             "IsExperimental" false
         },
         "AuthOptions" : {
             "CertDir" "/root/.docker/machine/certs" ,