環境說明:
主機名 | 操作系統版本 | 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提供支持
在Mac或Windows上運行Docker
管理遠程docker主機
2.Docker Engine與Docker Machine
Docker Engine
當人們說“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 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
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
編輯~/.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
由於是在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
該命令將創建一個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
運行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
將祕鑰拷貝至docker02
[root@docker01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
免密登陸測試
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
參數說明
- --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
像普通容器一樣,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的目錄至管理主機
在管理主機新建目錄foo,test01中也新建foo並將/home/docker/foo掛載至管理主機的/root/foo目錄,管理主機本地新建bar文件,test01對應目錄也能看見,至此實現了兩個foo目錄的共享。
在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主機的詳細信息。
5.upgrade
更新machine的docker版本
執行upgrade操作會將machine中的docker升級至最新版。
6.start/stop
啓動/停止machine主機系統(針對的是操作系統不是docker daemon)
stop操作不支持driver爲generic類型的machine。
本文參考:
https://docs.docker.com/machine/overview/
https://docs.docker.com/machine/get-started/
https://docs.docker.com/machine/reference/