Docker實踐(四):Docker Machine

環境說明:

主機名 操作系統版本 IP地址 docker-machine版本 VMware版本 說明
docker01 Ubuntu 16.04.5 172.27.9.71 0.13.0 12.5.2 machine管理主機
docker02 Ubuntu 16.04.5 172.27.9.72 / 12.5.2 machine主機

本文所有測試都在Vmware虛擬機上完成。
ubuntu安裝詳見:Ubuntu16.04.5以lvm方式安裝全記錄
docker安裝詳見:Ubuntu16.04安裝Docker

一、Machine簡介

1.Docker Machine概述

 Docker Machine是Docker官方三劍客項目之一,負責使用docker容器的第一步:在多種平臺上快速安裝和維護docker運行環境。它支持多種平臺,讓用戶可以在很短時間內在本地或雲環境中搭建一套docker主機集羣。
Docker Machine用途:

  • 在Mac或Windows上安裝並運行Docker
  • 配置和管理多個遠程Docker主機
  • 爲Docker Swarm提供支持

Docker實踐(四):Docker Machine
在Mac或Windows上運行Docker
Docker實踐(四):Docker Machine
管理遠程docker主機

2.Docker Engine與Docker Machine

Docker Engine

Docker實踐(四):Docker Machine
當人們說“docker”時,他們通常是指Docker Engine,包括Docker daemon、REST API 以及CLI命令行。Docker Engine接受來自cli的docker命令,例如docker run<image>、docker ps to list running containers、docker image ls to list images等等。

Docker Machine

Docker實踐(四):Docker Machine
Docker Machine是一個工具,用於配置和管理您的Dockerized主機(主機上有Docker Engine)。通常,您在本地系統上安裝Docker Machine。Docker Machine有自己的命令行客戶端docker-machine和Docker Engine客戶端docker。您可以使用machine在一個或多個虛擬系統上安裝Docker Engine。這些虛擬系統可以是本地的(如在Mac或Windows上使用machine在VirtualBox中安裝和運行Docker Engine)或遠程的(如在雲提供商上使用machine安裝和運行Docker Engine)。

二、安裝Machine

安裝Docker Machine前需先安裝Docker,詳見:Ubuntu16.04安裝Docker

1.安裝machine

root@docker01:~# base=https://mirrors.aliyun.com/docker-toolbox/linux/machine/0.13.0
root@docker01:~# curl -L $base/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 25.3M  100 25.3M    0     0   952k      0  0:00:27  0:00:27 --:--:--  989k
root@docker01:~# install /tmp/docker-machine /usr/local/bin/docker-machine

Docker實踐(四):Docker Machine

2.驗證Machine版本

root@docker01:~# docker-machine version
docker-machine version 0.13.0, build 9ba6da9

3.命令自動補全

下載bash completion

base=https://raw.githubusercontent.com/docker/machine/v0.16.0
for i in docker-machine-prompt.bash docker-machine-wrapper.bash docker-machine.bash
do
  wget "$base/contrib/completion/bash/${i}" -P /etc/bash_completion.d
done

Docker實踐(四):Docker Machine

編輯~/.bashrc

root@docker01:~# sed -i '$a 'PS1=\''[\\u@\\h \\W$(__docker_machine_ps1)]\\$ '\'''   ~/.bashrc

/root/.bashrc文件最後一行插入:PS1='[\u@\h \W$(__docker_machine_ps1)]\$ '

文件加載

root@docker01:~# source /etc/bash_completion.d/docker-machine.bash 
root@docker01:~# source /etc/bash_completion.d/docker-machine-prompt.bash 

加載docker-machine.bash和docker-machine-prompt.bash

驗證docker-machine命令補全

root@docker01:~# docker-machine 
active            env               ip                mount             restart           ssh               stop              version           
config            help              kill              provision         rm                start             upgrade           
create            inspect           ls                regenerate-certs  scp               status            url               
root@docker01:~# docker-machine 

輸入docker-machine,按tab鍵補全,會出現相關命令。

三、創建Machine和測試

 通過Docker Machine可以在多重平臺上快速安裝和維護Docker運行環境。
 Docker Machine通過多種後端驅動來管理不同的資源,包括虛擬機、本地主機和雲平臺等。通過--driver選項可以選擇支持的驅動類型。本文介紹虛擬機和本地主機兩種方式。
 對於Docker Machine來說,Machine就是運行docker daemon的主機,創建Machine即在host上安裝和部署docker。

虛擬機方式

1.設置cpu

Docker實踐(四):Docker Machine
由於是在Vmware上做的測試,需鉤選“虛擬化Intel VT-x/EPT 或AMD-V/RVI”以支持虛擬機嵌套。

2.安裝virtualbox

root@docker01:~# apt install virtualbox -y

3.創建Machine

[root@docker01 ~]# docker-machine create --driver=virtualbox test01

Docker實踐(四):Docker Machine
該命令將創建一個oracle virtualbox爲驅動的虛擬主機並安裝Docker引擎。

4.查看machine

[root@docker01 ~]# docker-machine ls
NAME     ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
test01   -        virtualbox   Running   tcp://192.168.99.100:2376           v18.09.4   
[root@docker01 ~]# docker-machine env test01
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/root/.docker/machine/machines/test01"
export DOCKER_MACHINE_NAME="test01"
# Run this command to configure your shell: 
# eval $(docker-machine env test01)

通過docker machine env可以知曉後續docker與machine交互的配置信息。

5.測試

進入machine

根據4中的提示,運行eval $(docker-machine env test01)進入machine。

[root@docker01 ~]# eval $(docker-machine env test01)
[root@docker01 ~ [test01]]# 

查看machine ip

[root@docker01 ~ [test01]]# docker-machine ip test01
192.168.99.100

ip地址爲:192.168.99.100

運行apache服務

[root@docker01 ~ [test01]]# docker run -d -p 8000:80 httpd

Docker實踐(四):Docker Machine
運行apache服務,端口映射爲8000

切回管理主機

[root@docker01 ~ [test01]]# eval $(docker-machine env -u)
[root@docker01 ~]# 

運行eval $(docker-machine env -u),切回管理主機。

訪問web

[root@docker01 ~]# curl $(docker-machine ip test01):8000
<html><body><h1>It works!</h1></body></html>

訪問正常

本地主機方式

該種方式使用generic類型的驅動,適合目標主機操作系統完成安裝且machine主機可以免密訪問目標主機。

1.免密訪問

machine上生成祕鑰

[root@docker01 ~]# ssh-keygen  -t rsa

Docker實踐(四):Docker Machine

將祕鑰拷貝至docker02

[root@docker01 ~]# ssh-copy-id  -i /root/.ssh/id_rsa.pub [email protected]

Docker實踐(四):Docker Machine

免密登陸測試

Docker實踐(四):Docker Machine

2.創建Machine

[root@docker01 ~]# docker-machine create --driver generic --generic-ip-address=172.27.9.72 --engine-registry-mirror https://v16stybc.mirror.aliyuncs.com test02

Docker實踐(四):Docker Machine
參數說明

  • --driver generic #驅動爲generic。
  • --generic-ip-address #指定要安裝machine的目標主機IP,前提是SSH root用戶免交互登錄或私鑰認證。
  • --engine-registry-mirror #使用阿里加速器。

3.查看machine

[root@docker01 ~]# docker-machine ls
NAME     ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
test01   -        virtualbox   Running   tcp://192.168.99.100:2376           v18.09.4   
test02   -        generic      Running   tcp://172.27.9.72:2376              v18.09.4 

創建的machine爲test01和test02.

4.測試

進入machine

[root@docker01 ~]# docker-machine ssh test02

除了eval $(docker-machine env test02)方式外,也可以通過ssh方式進入machine。

運行busybox

root@test02:~# docker run --name busybox01 busybox echo hello world

Docker實踐(四):Docker Machine
像普通容器一樣,test02正常運行busybox。同時也看到docker02的主機名也變爲test02。

四、Docker Machine命令

Docker Machine提供了很多子命令,可通過docker-machine <COMMAND> -h查看詳情

[root@docker01 ~]# docker-machine 
active            env               ip                mount             restart           ssh               stop              use               
config            help              kill              provision         rm                start             upgrade           version           
create            inspect           ls                regenerate-certs  scp               status            url               
[root@docker01 ~]# docker-machine ls -h
Usage: docker-machine ls [OPTIONS] [arg...]

List machines

Options:

   --quiet, -q                                  Enable quiet mode
   --filter [--filter option --filter option]   Filter output based on conditions provided
   --timeout, -t "10"                           Timeout in seconds, default to 10s
   --format, -f                                 Pretty-print machines using a Go template

1.config

查看連接信息

[root@docker01 ~]# docker-machine config test02
--tlsverify
--tlscacert="/root/.docker/machine/machines/test02/ca.pem"
--tlscert="/root/.docker/machine/machines/test02/cert.pem"
--tlskey="/root/.docker/machine/machines/test02/key.pem"
-H=tcp://172.27.9.72:2376

2.scp

在Docker主機之間複製文件

[root@docker01 ~]# ls foo.txt
ls: cannot access 'foo.txt': No such file or directory
[root@docker01 ~]# docker-machine ssh test01 pwd
/home/docker
[root@docker01 ~]# docker-machine ssh test01 'echo A file created remotely! >foo.txt'
[root@docker01 ~]# docker-machine scp test01:/home/docker/foo.txt ./
foo.txt                                                                                                                           100%   25     0.0KB/s   00:00    
[root@docker01 ~]# ls
foo.txt
[root@docker01 ~]# 
[root@docker01 ~]# more foo.txt 
A file created remotely!

在test01中新建文件foo.txt並將其scp至管理主機。

3.mount

使用sshfs將machine主機的目錄掛載至管理主機的本地目錄。

安裝sshfs

[root@docker01 ~]# apt install  fuse-sshfs

掛載test01的目錄至管理主機

Docker實踐(四):Docker Machine
在管理主機新建目錄foo,test01中也新建foo並將/home/docker/foo掛載至管理主機的/root/foo目錄,管理主機本地新建bar文件,test01對應目錄也能看見,至此實現了兩個foo目錄的共享。

在machine的容器中使用目錄

Docker實踐(四):Docker Machine
至此foo目錄在“管理主機目錄/root/foo”、“test01主機的/home/docker/foo目錄”和“test01中容器目錄/tmp/foo”實現了共享。

unmount

[root@docker01 ~]# docker-machine mount -u test01:/home/docker/foo foo

unmount命令和mount一樣,只是新增參數-u

4.inspect

以json格式輸出指定machine主機的詳細信息。
Docker實踐(四):Docker Machine

5.upgrade

更新machine的docker版本
Docker實踐(四):Docker Machine
執行upgrade操作會將machine中的docker升級至最新版。

6.start/stop

啓動/停止machine主機系統(針對的是操作系統不是docker daemon)
Docker實踐(四):Docker Machine
stop操作不支持driver爲generic類型的machine。
 
 
 
本文參考:
https://docs.docker.com/machine/overview/
https://docs.docker.com/machine/get-started/
https://docs.docker.com/machine/reference/

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