在上一篇文章中,我們介紹了docker三劍客中的Swarm,對使用docker集羣方式管理容器有了一定的瞭解,如果忘記了該內容,可以先去複習一下Docker三劍客——Swarm。
今天我們開始介紹docker三劍客中的另一個——Machine。接下來的內容,我們還是從四個方面來講解,主要包括如下:
- Machine簡介
- Machine安裝
- Machine命令
- Machine實戰
我們知道在多個集羣服務環境下,安裝管理Docker的容器,要使用的是Docker Swarm,而使用Docker Swarm的情況是在多個集羣的服務器已經搭建好Docker環境的情況下進行。如果在多臺服務環境下,並沒有安裝好Docker環境,想要快速搭建一套Docker主機集羣,這裏就要使用到Docker Machine。
一、Machine簡介
1、簡介
通過上面的基本簡介,我們知道了Docker Machine是用來幹啥的。即Docker Machine是負責使用Docker的第一步,讓我們可以在多種平臺上快速安裝Docker環境,同時也支持多種平臺,讓用戶可以在短時間內搭建一套Docker主機集羣。
Docker Machine是Docker官方的開源項目,負責實現對Docker主機本身進行管理,由Go語言編寫,開源地址爲https://github.com/docker/machine。
通過Machine用戶可以在本地任意指定被Machine管理的Docker主機,並對其進行操作。Docker Machine 的定位主要是“在本地或者雲環境中創建Docker”。其基本功能爲:
- 在指定的節點上安裝Docker引擎,配置其爲Docker主機
- 集中管理所有Docker主機
總之Docker Machine 是一個工具,它允許你在虛擬宿主機上安裝 Docker Engine ,並使用 docker-machine 命令管理這些宿主機。你可以使用 Machine 在你本地的 Mac 或 Windows box、公司網絡、數據中心、或像 AWS 或 Digital Ocean 這樣的雲提供商上創建 Docker 宿主機。
使用 docker-machine 命令,你可以啓動、審查、停止和重新啓動託管的宿主機、升級 Docker 客戶端和守護程序、並配置 Docker 客戶端與你的宿主機通信。
在上面的內容中我們提到了Docker Engine(引擎),這裏既然提及到了,那麼我們就來介紹一下Docker Engine。
2、Docker Engine
當人們說“Docker”時,這裏通常指的就是Docker Engine。Docker Engine其實就是一個Client-Server架構的應用。主要如下圖所示:
從上圖中我們可以看出Docker Engine主要包括以下幾個部分:
- Docker Daemon — docker的守護進程,屬於C/S中的server
- Docker REST API — docker daemon向外暴露的REST接口
- Docker CLI — docker向外暴露的命令行接口(Command Line API)
docker engine接受docker從CLI命令,例如 docker run 運行一個容器,docker ps可以列出運行容器,docker image ls 列出鏡像,等等。
3、Docker Engine與Docker Machine
Docker Machine是一個供應和管理Docker化主機的工具(Docker Engine上的主機)。
通常,在本地系統上安裝Docker Machine,Docker Machine就會擁有自己的命令行客戶端 docker-machine和Docker Engine客戶端docker。
你可以使用Machine在一個或多個虛擬系統上安裝Docker Engine。
這些虛擬系統可以是本地的(例如當您使用Machine在Mac或Windows上的VirtualBox中安裝和運行Docker引擎)或遠程(如當您使用Machine在雲提供者上配置Docker化主機時)。這些通過Machine被Docker化的主機本身,有時也稱爲被管理的宿主機(“machines”)。
二、Machine安裝
Docker Machine可以在多種操作系統平臺上安裝,包括Linux、Mac os已經Windows。
在使用Machine前,首先要先安裝好Docker,如果沒有安裝,需要提前進行安裝。
1、Linux平臺的安裝
我們在官方的文檔中,可以查看到文檔是推薦從官方Release庫(https://github.com/docker/machine/releases)直接下載編譯好的二進制文件即可。
例如,在Linux 64位系統上直接下載對應的二進制包,以最新的0.14.0爲例。
curl -L https://github.com/docker/machine/releases/download/v0.14.0/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine &&
chmod +x /tmp/docker-machine &&
sudo cp /tmp/docker-machine /usr/local/bin/docker-machine
查看實際上安裝的二進制命令:
2、Mac OS系統上的安裝
在Mac OS系統與在Linux上非常的相似,只是下載的二進制不同。安裝命令如下:
curl -L https://github.com/docker/machine/releases/download/v0.14.0/docker-machine-`uname -s`-`uname -m` >/usr/local/bin/docker-machine && \
chmod +x /usr/local/bin/docker-machine
3、Windows系統上的安裝
在Windows上的安裝也是通過命令,首先要安裝了git-bash。這是一個Git for Windows 提供了一個仿真環境,可以從windows命令行執行git命令. *NIX 用戶 應該會覺得很順手, 在這個仿真環境下,使用git命令跟linux 和 UNIX 一樣一樣的。
git-bash可以去git-scm下載進行安裝。
當安裝好git-bash後,啓動一個git-bash命令窗口,然後就可以通過下載二進制包的方式進行安裝Docker Machine,命令如下:
if [[ ! -d "$HOME/bin" ]]; then mkdir -p "$HOME/bin"; fi && \
curl -L https://github.com/docker/machine/releases/download/v0.14.0/docker-machine-Windows-x86_64.exe > "$HOME/bin/docker-machine.exe" && \
chmod +x "$HOME/bin/docker-machine.exe"
這裏下載二進制包可能速度非常慢,如果下載失敗,可以單獨去https://github.com/docker/machine/releases下載對應的二進制包。然後根據上面的命令放到對應的目錄下同時賦予相應的權限。這裏下載最好是開代理,不然真的很慢。
三、Machine命令
Docker Machine中每個命令都有一系列的參數,可以通過下面的命令來查看具體用法:
docker-machine <COMMAND> -h
比如這裏以active命令爲例,可以得到如下提示:
Docker Machine命令列表如下:
命令 | 說明 |
---|---|
active | 查看當前激活狀態的Docker主機 |
config | 查看到激活Docker主機的連接信息 |
create | 創建一個Docker主機 |
env | 顯示連接到某個主機需要的環境變量 |
inspect | 以json格式輸出指定Docker主機的詳細信息 |
ip | 獲取指定的Docker主機地址 |
kill | 直接殺死指定的Docker主機 |
ls | 列出所有管理的主機 |
regenerate-certs | 爲某個主機重新生成TLS認證信息 |
restart | 重啓指定Docker主機 |
rm | 刪除某臺Docker主機。對應虛擬機會被刪除 |
scp | 在Docker主機之間以及Docker主機和本地之間通過scp命令來遠程複製文件 |
ssh | 通過SSH連接到主機上,執行命令 |
start | 啓動一個指定的Docker主機。如果對象是虛擬機,該虛擬機將被啓動 |
status | 獲取指定Docker主機的狀態,包括Running、Paused、Saved、Stopped、Stopping、Starting、Error等 |
stop | 停止一個Docker主機 |
upgrade | 將指定主機的Docker版本更新爲最新 |
url | 獲取指定Docker主機的監聽URL |
help,h | 輸出幫助信息 |
下面具體介紹一下部分命令的用法:
1、active
格式: docker-machine active [OPTIONS] [arg…]
查看當前激活狀態的Docker主機。激活狀態意味着當前的DOCKER_HOST環境變量指向該主機。
2、config
格式: docker-machine config [OPTIONS] [arg…]
查看到激活Docker主機的連接信息。
3、create
格式: docker-machine create [OPTIONS] [arg…]
創建一個Docker主機。
選項包括:
- –dirve,-d “none”指定驅動類型;
- –engine-install-url “https://get.docker.com” 配置Docker主機時候的安裝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集羣服務。
比如創建一個命名爲think的主機,ip地址爲39.108.119.87,指定代理鏡像地址和驅動類型,如下:
docker-machine create --driver generic --generic-ip-address=39.108.119.87 --engine-registry-mirror=https://registry.docker-cn.com think
4、env
格式: docker-machine env [OPTIONS] [arg…]
顯示連接到某個主機需要的環境變量。
比如查看think主機的環境變量,docker-machine env think
。
5、inspect
格式: docker-machine inspect [OPTIONS] [arg…]
以json格式輸出指定Docker主機的詳細信息。
使用如下命令查看think主機的詳細信息。
docker-machine insepct think
6、ip
獲取指定Docker主機地址。
查看think主機的ip地址。
docker-machine ip think
7、kill
直接殺死指定的Docker主機。
指定Docker主機會強行停止。
8、ls
格式: docker-machine ls [OPTIONS] [arg…]
列出所有管理的主機。
例如:
可以通過–fileter來輸入某些Docker主機,支持過濾器包括名稱正則表達式、驅動類型、Swarm管理節點名稱、狀態等。
還支持–quiet,-q減少無關輸出信息。
四、Machine實戰
接下來我們就進入Docker Machine的實戰部分,我們知道Docker Machine通過多種後端驅動來管理不同的資源,包括虛擬機、本地主機和雲平臺等,通過–driver可以選擇支持的驅動類型。在這裏我們主要分兩種情況來實際應用。
1、本地主機
這種情況驅動適合主機操作系統和SSH服務都已經安裝好,需要部署Docker環境的要求。
在實驗環境中,我們有三個運行Ubuntu系統的主機,其中有一個安裝好了Docker環境,同時安裝了Docker Machine。如下圖所示:
我們知道對於 Docker Machine 來說,術語 Machine 就是運行 docker daemon 的主機。“創建 Machine” 指的就是在主機上安裝和部署 docker。
首先我們使用docker-machine ls
查看一下當前的machine:
可以看到這裏並沒有machine。接下來我們創建第一個 machine:think - 39.108.119.87。
創建 machine 要求能夠無密碼登錄遠程主機,所以需要先通過如下命令將 ssh key 拷貝到 39.108.119.87:
ssh-copy-id 39.108.119.87
如果在執行過程中報錯沒有.pub的文件的ID,則可能是沒有公共的id_rsa.pub文件。執行如下命令,然後一路回車。
ssh-keygen
然後就會在~/.ssh目錄下就會出現id_rsa.pub文件,接着重新執行上面的命令,輸入服務器登錄密碼,就可以完成key添加的配置。結果如下:
在上面的準備工作完成後,就可以創建我們的machine,創建一個命名爲think的machine。執行命令如下:
docker-machine create --driver generic --generic-ip-address=39.108.119.87 --engine-registry-mirror=https://registry.docker-cn.com think
這裏是在Linux環境中部署,直接使用Generic驅動,如果在其他環境中部署docker環境,可以使用其他驅動,詳情文檔參考https://docs.docker.com/machine/drivers/。
–driver generic 爲指定驅動類型,–generic-ip-address 爲指定目標系統的IP,–engine-registry-mirror 爲指定鏡像源地址(這裏更改爲國內鏡像源,不然後面安裝容器可能無法pull鏡像下來),並命名爲 think。命令執行過程如下:
在上圖中的5個標註中,分別代表着Docker Machine執行操作的步驟:
- 通過SSH登錄到遠程主機上。
- 負責在遠處主機上執行安裝docker步驟。
- 拷貝證書。
- 配置 docker daemon。
- 啓動 docker 服務。
再次執行 docker-machine ls
,可以查看到具體的相關服務:
我們可以發現創建的machine。
同時登陸到39.108.x.x服務器,我們可以查看到docker的運行環境以及安裝完畢。
在/etc/systemd/system/docker.service.d目錄下我們可以查看到具體的daemon配置文件,編輯配置文件,如下圖所示:
在配置信息中:
- -H tcp://0.0.0.0:2376 是使 docker daemon 接受遠程連接的地址。
- –tls* 對遠程連接啓用安全認證和加密的配置。
同時我們也可以查看到hostname也已經設置爲think。
使用同樣的方法,我們給120.79.x.x服務器進行安裝machine。執行如下命令:
docker-machine create --driver generic --generic-ip-address=120.79.x.x --engine-registry-mirror=https://registry.docker-cn.com dev
在使用時,需要將ip地址更換爲自己實踐的服務主機地址即可。
創建成功後使用docker-machine ls
可以查看已經部署好的環境,可以看到think、dev主機已經準備就緒了。
到目前,集羣環境變爲如下所示:
目前爲止兩臺服務器都已經部署好了Docker的環境。
在上面我們通過machine部署好了Docker環境,接下來我們就使用docker-machine的命令對集羣的docker環境進行管理。
我們知道docker連接指定目標主機服務器,可以通過-H或者指定DOCKER_HOST來實現。比如連接39.108.119.87服務器,可以通過指DOCKER_HOST=tcp://39.108.119.87:2376,也可以-H tcp://39.108.119.87:2376 來實現訪問。
在machine中就比較方便了,使用docker-machine env think
,就可以查看到think服務的配置環境。
然後我們要切換到think服務器進行操作,根據上面的提示,執行eval $(docker-machine env think)
。
我們再次執行docker-machine ls
,可以發現think主機active被激活了,同時使用docker ps -a
可以看到think主機上暫時並沒有容器的。
然後我們所有的操作就可以像在think主機上進行操作是一樣的,比如我們要運行一個nginx容器。
docker run --name think-nginx -d -p 8080:80 nginx
可以看到我們在think主機上運行了一個nginx容器。接着同樣我們可以切換主機環境進入dev主機環境操作。
可以看到dev主機上並沒有運行什麼容器。
除此之外Docker Machine還有很多其他方便管理集羣使用的命令,這裏大致介紹一下。
查看某個docker daemon的配置信息:
docker-machine config think
還可以通過ssh命令進行連接,進入具體的主機中。比如進入think主機服務器當中,就可以使用docker-machine ssh think
命令來連接。
可以查看到我們在think主機上運行的nginx容器。
使用docker-machine scp
我們還可以在不同 machine 之間拷貝文件,比如:
docker-machine scp [machine1:][path] [machine2:][path]
比如我們將think主機下tmp目錄下的a.txt文件拷貝到dev主機下的tmp目錄下。
docker-machine scp think:/tmp/a.txt dev:/tmp
可以看到我們執行了scp命令,再使用ssh連接dev主機,到tmp目錄下可以發現a.txt 文件。
docker-machine還有stop/start/restart 命令,通過stop/start/restart 我們可以控制docker主機的運行狀態。
Machine還支持更新操作,通過docker-machine upgrade
更新 machine 的 docker 到最新版本,同時支持批量執行。
docker-machine upgrade think dev
通過上面的一些列操作,在多主機環境下 Docker Machine 可以極大地提升我們的工作效率。接下來我們在講解一下虛擬化平臺使用Docker Machine。
2、虛擬化平臺
可以通過virtualbox驅動支持本地(需要已安裝virtualbox)啓動一個虛擬機並配置爲Docker主機:
docker-machine create --driver virtualbox --engine-registry-mirror=https://registry.docker-cn.com vbox
如果沒有安裝virtualbox會報錯的,先安裝virtualbox。本平臺是ubuntu,所以安裝時先添加鏡像源,編輯/etc/apt/sources.list文件,根據自己的版本選擇添加鏡像源。
For Ubuntu 17.04 ("Zesty")
deb http://download.virtualbox.org/virtualbox/debian zesty contrib
For Ubuntu 16.04 ("Xenial")
deb http://download.virtualbox.org/virtualbox/debian xenial contrib
For Ubuntu 14.04 ("Trusty")
deb http://download.virtualbox.org/virtualbox/debian trusty contrib
For Ubuntu 12.04 LTS ("Precise Pangolin")
deb http://download.virtualbox.org/virtualbox/debian precise contrib
For Debian 8 ("Jessie")
deb http://download.virtualbox.org/virtualbox/debian jessie contrib
For Debian 7 ("Wheezy")
deb http://download.virtualbox.org/virtualbox/debian wheezy contrib
也可以使用命令添加,本系統爲ubuntu 16.04 所以選擇版本後,添加命令如下:
sudo sh -c 'echo "deb http://download.virtualbox.org/virtualbox/debian xenial contrib" >> /etc/apt/sources.list.d/virtualbox.list'
然後添加racle public key,命令如下:
wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add -
最後執行更新源和安裝軟件:
sudo apt-get update
sudo apt-get install virtualbox-5.0
接着我們再重新執行創建Machine命令。不出意外,將啓動一個全新的虛擬機,並安裝Docker引擎。
由於服務器是阿里雲ESC不支持虛擬機裏虛擬機,所以作者這一步沒有執行驗證了。
除了virtualbox驅動外,docker也還支持其他的虛擬化平臺。
後面的管理操作就與前面本地主機一致,這裏就不再複述。
參考
- 《每天5分鐘玩轉Docker容器技術》
- 《Docker技術入門與實戰 第2版》
- https://docs.docker.com/machine/overview