Docker Machine
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 使你能夠在各種 Linux 上配置多個遠端 Docker 宿主機。
此外,Machine 允許你在較早的 Mac 或 Windows 系統上執行 Docker,如上一主題所述。
Docker Machine 有這兩個廣泛的用例。
- 我有一個較舊的桌面系統,並希望在 Mac 或 Windows 上執行 Docker
如果你主要在不符合新的 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 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 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 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上去 [[email protected] ~]
# ssh-copy-id [email protected] /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. # 測試是否可以免密登入 [[email protected] ~]
# ssh [email protected] 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檢視配置項 [[email protected] ~]
# ssh [email protected] 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"
,
|