一、什么是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
[root@operation ~]# 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 [root@operation ~]# chmod +x /tmp/docker-machine [root@operation ~]# cp /tmp/docker-machine /usr/local/bin/docker-machine # 查看版本確認是否安裝成功 [root@operation ~]# docker-machine -v docker-machine version 0.15.0, build b48dc28d # 安裝自動補全功能 [root@operation ~]# yum -y install bash-completion [root@operation ~]# 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 # 添加以下 [root@operation ~]# 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='[\u@\h \W$(__docker_machine_ps1)]\$ ' # 使之生效 [root@operation ~]# 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.常規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上面創建)
# 生成keys並配置可以免密登錄主機(這個是必須要做的) [root@operation ~]# 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 root@operation The key's randomart image is: +---[RSA 2048]----+ | ...o..o | | oo o= . | | . .*.=* + | |. o .+ *++O | |.= + +.SBo. | |oo= E .=o | |+.. . + | |.ooo . | |oo.o. | +----[SHA256]-----+ # 將keys拷貝到client1上去 [root@operation ~]# ssh-copy-id root@192.168.31.188 /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 root@192.168.31.188's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'root@192.168.31.188'" and check to make sure that only the key(s) you wanted were added. # 測試是否可以免密登錄 [root@operation ~]# ssh root@192.168.31.188 Last login: Fri Oct 12 15:27:45 2018 from 192.168.31.104 [root@client1 ~]# exit
2. 使用docker machine創建docker host
# 使用docker machine 創建 # 對於docker machine來將,術語Machine就是運行docker daemon的主機,創建machine就是在host上安裝docker # 執行docker-macine ls查看當前的machine [root@operation ~]# docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS # 當前還沒有一個machine,接下來我們創建第一個machine:docker188-192.168.31.188 [root@operation ~]# 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查看 [root@operation ~]# 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查看配置項 [root@operation ~]# ssh root@192.168.31.188 Last login: Fri Oct 12 16:19:10 2018 from 192.168.31.43 [root@docker188 ~]# 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的環境變量 [root@operation ~]# 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) # 根據提示執行 [root@operation ~]# eval $(docker-machine env docker188) [root@operation ~ [docker188]]# 可以看到,命令提示符變成了docker188,其原因是我們之前在/root/.bashrc里面配置了 PS1='[\u@\h \W$(__docker_machine_ps1)]\$ ',用於顯示當前的docker host 注:如果我們輸入eval $(docker-machine env docker1)沒有顯示出docker188的命令提示符,我們可以重新輸入一遍 PS1='[\u@\h \W$(__docker_machine_ps1)]\$ ' 在此狀態下執行的docker命令其效果都相當於在docker188上執行 [root@operation ~ [docker188]]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@operation ~ [docker188]]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE
3. 其他命令操作
# 其他命令 # 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命令 [root@operation ~]# docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS docker188 - generic Running tcp://192.168.31.188:2376 v18.06.1-ce # 這里的狀態是沒有被激活 [root@operation ~]# 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) [root@operation ~]# export DOCKER_HOST="tcp://192.168.31.188:2376" [root@operation ~]# docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS docker188 * generic Running tcp://192.168.31.188:2376 v18.06.1-ce [root@operation ~]# docker-machine active docker188 # config命令 [root@operation ~]# 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命令 [root@operation ~]# 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", "CaCertPath": "/root/.docker/machine/certs/ca.pem", "CaPrivateKeyPath": "/root/.docker/machine/certs/ca-key.pem", "CaCertRemotePath": "", "ServerCertPath": "/root/.docker/machine/machines/docker188/server.pem", "ServerKeyPath": "/root/.docker/machine/machines/docker188/server-key.pem", "ClientKeyPath": "/root/.docker/machine/certs/key.pem", "ServerCertRemotePath": "", "ServerKeyRemotePath": "", "ClientCertPath": "/root/.docker/machine/certs/cert.pem", "ServerCertSANs": [], "StorePath": "/root/.docker/machine/machines/docker188" } }, "Name": "docker188" } # ssh命令 [root@operation ~]# docker-machine ssh docker188 docker images REPOSITORY TAG IMAGE ID CREATED SIZE alpine latest 196d12cf6ab1 4 weeks ago 4.41MB [root@operation ~]# docker-machine ssh docker188 Last login: Fri Oct 12 16:36:49 2018 from 192.168.31.43 [root@docker188 ~]# # url命令 [root@operation ~]# docker-machine url docker188 tcp://192.168.31.188:2376 # status命令 [root@operation ~]# docker-machine status docker188 Running # version命令 [root@operation ~]# docker-machine version docker188 18.06.1-ce
注:還有一些命令就不一一列出了,可以查看上面的參數命令表,具體命令的使用方法可以通過--help查看
注:Machine安裝docker環境中會因網絡或其他情況造成安裝失敗,使用中發現,這種安裝失敗頻率很高,感覺沒有使用的價值,說白了,一個公司操作系統一般不會超過兩個發行版,寫個腳本一鍵安裝也許會更方便!
七、總結
Docker Machine 最主要有兩個作用:
- 使用 Docker Machine 方便在不同的環境中使用 Docker ,比如:Win/Mac
- 使用 Docker Machine 方便在雲環境下批量部署 Docker環境,比如:私有雲,公有雲批量安裝Docker環境
八、參考鏈接
官方地址:https://docs.docker.com/machine/
官方驅動詳細使用方法:https://docs.docker.com/machine/drivers/
參考文檔:https://www.cnblogs.com/lkun/p/7781157.html