Docker三劍客——Machine

在上一篇文章中,我們介紹了docker三劍客中的Swarm,對使用docker集羣方式管理容器有了一定的瞭解,如果忘記了該內容,可以先去複習一下Docker三劍客——Swarm
今天我們開始介紹docker三劍客中的另一個——Machine。接下來的內容,我們還是從四個方面來講解,主要包括如下:

  • Machine簡介
  • Machine安裝
  • Machine命令
  • Machine實戰

我們知道在多個集羣服務環境下,安裝管理Docker的容器,要使用的是Docker Swarm,而使用Docker Swarm的情況是在多個集羣的服務器已經搭建好Docker環境的情況下進行。如果在多臺服務環境下,並沒有安裝好Docker環境,想要快速搭建一套Docker主機集羣,這裏就要使用到Docker Machine。

一、Machine簡介

1、簡介

Machine圖標
通過上面的基本簡介,我們知道了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 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上的主機)。

Machine

通常,在本地系統上安裝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命令爲例,可以得到如下提示:

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環境變量指向該主機。
active

2、config

格式: docker-machine config [OPTIONS] [arg…]

查看到激活Docker主機的連接信息。
config

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
env

5、inspect

格式: docker-machine inspect [OPTIONS] [arg…]

以json格式輸出指定Docker主機的詳細信息。

使用如下命令查看think主機的詳細信息。

docker-machine insepct think

inspect

6、ip

獲取指定Docker主機地址。

查看think主機的ip地址。

docker-machine ip think

ip

7、kill

直接殺死指定的Docker主機。
指定Docker主機會強行停止。

8、ls

格式: docker-machine ls [OPTIONS] [arg…]

列出所有管理的主機。

例如:
ls

可以通過–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:
docker-machine ls

可以看到這裏並沒有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添加的配置。結果如下:

添加ssh

在上面的準備工作完成後,就可以創建我們的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。命令執行過程如下:

crate machine

在上圖中的5個標註中,分別代表着Docker Machine執行操作的步驟:

  1. 通過SSH登錄到遠程主機上。
  2. 負責在遠處主機上執行安裝docker步驟。
  3. 拷貝證書。
  4. 配置 docker daemon。
  5. 啓動 docker 服務。

再次執行 docker-machine ls ,可以查看到具體的相關服務:
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。
hostname

使用同樣的方法,我們給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主機已經準備就緒了。

ls all

到目前,集羣環境變爲如下所示:
集羣環境

目前爲止兩臺服務器都已經部署好了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)
eval

我們再次執行docker-machine ls,可以發現think主機active被激活了,同時使用docker ps -a可以看到think主機上暫時並沒有容器的。

然後我們所有的操作就可以像在think主機上進行操作是一樣的,比如我們要運行一個nginx容器。

docker run --name think-nginx -d -p 8080:80 nginx

nginx

可以看到我們在think主機上運行了一個nginx容器。接着同樣我們可以切換主機環境進入dev主機環境操作。
dev

可以看到dev主機上並沒有運行什麼容器。

除此之外Docker Machine還有很多其他方便管理集羣使用的命令,這裏大致介紹一下。

查看某個docker daemon的配置信息:

docker-machine config think

config

還可以通過ssh命令進行連接,進入具體的主機中。比如進入think主機服務器當中,就可以使用docker-machine ssh think命令來連接。

ssh

可以查看到我們在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

可以看到我們執行了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

upgrade

通過上面的一些列操作,在多主機環境下 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也還支持其他的虛擬化平臺。

後面的管理操作就與前面本地主機一致,這裏就不再複述。

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章