? ? ? ? ? ? ? ?



容器技术|Docker三剑客之docker-machine_Java

上一篇:容器技术|Docker三剑客之Compose

Docker-machine是什么?

ocker-machine就是docker公司官方提出的,用于在各种平台上快速创建具有docker服务的虚拟机的技术,甚至可以通过指定driver来定制虚拟机的实现原理(一般是virtualbox)。

Docker 与 Docker Machine 的区别

Docker 是一个 Client-Server 架构的应用,Docker是大家对Docker Engine简称。

Docker包括以下三个部分:

1、Docker daemon
2、一套与 Docker daemon 交互的 REST API
3、一个命令行客户端
下图很清晰的展示了它们之间的关系:

容器技术|Docker三剑客之docker-machine_Java_02

Docker Machine 是安装和管理 Docker 的工具。它有命令行工具:docker-machine。

docker-machine安装

[root@master?~]#?curl?-L?https://github.com/docker/machine/releases/download/v0.14.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????390??????0?--:--:--??0:00:01?--:--:--???390
100?26.7M??100?26.7M????0?????0??1618k??????0??0:00:16??0:00:16?--:--:--?3622k
[root@master?~]#?chmod?+x?/tmp/docker-machine?
[root@master?~]#?cp?/tmp/docker-machine?/usr/local/bin/docker-machine
[root@master?~]#?ll?/usr/local/bin/docker-machine?
-rwxr-xr-x?1?root?root?28034848?6月??12?15:24?/usr/local/bin/docker-machine
[root@master?~]#?docker-machine?-v
docker-machine?version?0.14.0,?build?89b8332

docker-machine命令

[root@master?~]#?docker-machine?--help
Usage:?docker-machine?[OPTIONS]?COMMAND?[arg...]

Create?and?manage?machines?running?Docker.

Version:?0.14.0,?build?89b8332

Author:
??Docker?Machine?Contributors?-?<https://github.com/docker/machine>

Options:
??--debug,?-D????????????????????Enable?debug?mode
??--storage-path,?-s?"/root/.docker/machine"????Configures?storage?path?[$MACHINE_STORAGE_PATH]
??--tls-ca-cert?????????????????CA?to?verify?remotes?against?[$MACHINE_TLS_CA_CERT]
??--tls-ca-key?????????????????????Private?key?to?generate?certificates?[$MACHINE_TLS_CA_KEY]
??--tls-client-cert?????????????????Client?cert?to?use?for?TLS?[$MACHINE_TLS_CLIENT_CERT]
??--tls-client-key?????????????????Private?key?used?in?client?TLS?auth?[$MACHINE_TLS_CLIENT_KEY]
??--github-api-token?????????????????Token?to?use?for?requests?to?the?Github?API?[$MACHINE_GITHUB_API_TOKEN]
??--native-ssh????????????????????Use?the?native?(Go-based)?SSH?implementation.?[$MACHINE_NATIVE_SSH]
??--bugsnag-api-token?????????????????BugSnag?API?token?for?crash?reporting?[$MACHINE_BUGSNAG_API_TOKEN]
??--help,?-h????????????????????show?help
??--version,?-v????????????????????print?the?version

Commands:
??active????????Print?which?machine?is?active
??config????????Print?the?connection?config?for?machine
??create????????Create?a?machine
??env????????????Display?the?commands?to?set?up?the?environment?for?the?Docker?client
??inspect????????Inspect?information?about?a?machine
??ip????????????Get?the?IP?address?of?a?machine
??kill????????????Kill?a?machine
??ls????????????List?machines
??provision????????Re-provision?existing?machines
??regenerate-certs????Regenerate?TLS?Certificates?for?a?machine
??restart????????Restart?a?machine
??rm????????????Remove?a?machine
??ssh????????????Log?into?or?run?a?command?on?a?machine?with?SSH.
??scp????????????Copy?files?between?machines
??mount????????????Mount?or?unmount?a?directory?from?a?machine?with?SSHFS.
??start????????????Start?a?machine
??status????????Get?the?status?of?a?machine
??stop????????????Stop?a?machine
??upgrade????????Upgrade?a?machine?to?the?latest?version?of?Docker
??url????????????Get?the?URL?of?a?machine
??version????????Show?the?Docker?Machine?version?or?a?machine?docker?version
??help????????????Shows?a?list?of?commands?or?help?for?one?command

docker-machine?active
#显示当前的活动主机

docker-machine?config
#显示连接主机的配置

docker-machine?create
#创建一个主机

docker-machine?env
#设置当前的环境与哪个主机通信

docker-machine?inspect
#查看主机的详细信息

docker-machine?ip
#查看主机的IP?

docker-machine?kill
#强制关闭一个主机

docker-machine?ls?
#查看所有的主机信息

docker-machine?provision
#重新配置现在主机

docker-machine?regenerate-certs
#为主机重新生成证书

docker-machine?restart
#重启主机

docker-machine?rm
#删除主机

docker-machine?ssh
#以SSH的方式连接到主机上

docker-machine?scp
#远程复制

docker-machine?status
#查看主机的状态

docker-machine?stop
#停止一个正在运行的主机

docker-machine?upgrade
#升级主机的docker服务到最新版本

docker-machine?version
#查看docker-machine版本

常用实例操作

[root@master?~]#?docker-machine?create?-d?virtualbox?testhost
[root@master?~]#?docker-machine?create?--driver?virtualbox?testhost
#两个命令的作用相同,创建一个名为testhost的主机,驱动方式是virtualbox

[root@master?~]#?docker-machine?create?-d?virtualbox?testhost
Creating?CA:?/root/.docker/machine/certs/ca.pem
Creating?client?certificate:?/root/.docker/machine/certs/cert.pem
Running?pre-create?checks...
Error?with?pre-create?check:?"VBoxManage?not?found.?Make?sure?VirtualBox?is?installed?and?VBoxManage?is?in?the?path"
#报错提示没有发现VBoxManage。因此,需要手工安装,具体安装操作如下。

安装Virtualbox驱动

1、配置Yum源
[root@master?~]#?vim??/etc/yum.repos.d/virtualbox.repo?
[virtualbox]
name=Oracle?Linux?/?RHEL?/?CentOS-$releasever?/?$basearch?-?VirtualBox
baseurl=http://download.virtualbox.org/virtualbox/rpm/el/$releasever/$basearch
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://www.virtualbox.org/download/oracle_vbox.asc

2、查看可安装的版本
[root@master?~]#?yum?search?VirtualBox???#查找具体安装版本
已加载插件:fastestmirror
Loading?mirror?speeds?from?cached?hostfile
?*?base:?mirrors.163.com
?*?epel:?mirrors.ustc.edu.cn
?*?extras:?centos.ustc.edu.cn
?*?updates:?centos.ustc.edu.cn
==============?N/S?matched:?VirtualBox?===================================
VirtualBox-4.3.x86_64?:?Oracle?VM?VirtualBox
VirtualBox-5.0.x86_64?:?Oracle?VM?VirtualBox
VirtualBox-5.1.x86_64?:?Oracle?VM?VirtualBox
VirtualBox-5.2.x86_64?:?Oracle?VM?VirtualBox
[root@master?~]#?yum?install?-y?VirtualBox-5.2??#安装

3、加载virtualbox
[root@master?~]#?/sbin/vboxconfig???#重新加载virtualbox服务
vboxdrv.sh:?Stopping?VirtualBox?services.
vboxdrv.sh:?Building?VirtualBox?kernel?modules.
This?system?is?currently?not?set?up?to?build?kernel?modules.
Please?install?the?Linux?kernel?"header"?files?matching?the?current?kernel
for?adding?new?hardware?support?to?the?system.
The?distribution?packages?containing?the?headers?are?probably:
????kernel-devel?kernel-devel-3.10.0-693.el7.x86_64
This?system?is?currently?not?set?up?to?build?kernel?modules.
Please?install?the?Linux?kernel?"header"?files?matching?the?current?kernel
for?adding?new?hardware?support?to?the?system.
The?distribution?packages?containing?the?headers?are?probably:
????kernel-devel?kernel-devel-3.10.0-693.el7.x86_64

There?were?problems?setting?up?VirtualBox.??To?re-start?the?set-up?process,?run
??/sbin/vboxconfig
as?root.
#如果内核版本不一致,会出现上面的报错,需要安装相同的内核版本

4、安装对应的内核版本
[root@master?~]#?rpm?-ivh?kernel-devel-3.10.0-693.el7.x86_64.rpm?
准备中...??????????????????????????#################################?[100%]
正在升级/安装...
???1:kernel-devel-3.10.0-693.el7???#################################?[100%]
[root@slave1?~]#?yum?install?gcc?make?perl?-y
[root@slave1?~]#?rpm?-qa?kernel\*
kernel-tools-3.10.0-693.el7.x86_64
kernel-devel-3.10.0-693.el7.x86_64
kernel-tools-libs-3.10.0-693.el7.x86_64
kernel-3.10.0-693.el7.x86_64
kernel-headers-3.10.0-862.3.2.el7.x86_64
[root@slave1?~]#?/sbin/vboxconfig?
vboxdrv.sh:?Stopping?VirtualBox?services.
vboxdrv.sh:?Building?VirtualBox?kernel?modules.
vboxdrv.sh:?Starting?VirtualBox?services.

重新安装

[root@centos7?~]#?docker-machine?create?--driver?virtualbox?testhost
Running?pre-create?checks...
Error?with?pre-create?check:?"This?computer?doesn't?have?VT-X/AMD-v?enabled.?Enabling?it?in?the?BIOS?is?mandatory"
#这个报错不用解释了吧,没有开启虚拟化功能,直接打开
[root@centos7?~]#?docker-machine?create?--driver?virtualbox?default
Running?pre-create?checks...
(default)?No?default?Boot2Docker?ISO?found?locally,?downloading?the?latest?release...
(default)?Latest?release?for?github.com/boot2docker/boot2docker?is?v18.05.0-ce
(default)?Downloading?/root/.docker/machine/cache/boot2docker.iso?from?https://github.com/boot2docker/boot2docker/releases/download/v18.05.0-ce/boot2docker.iso...
(default)?0%....10%....20%....30%....40%....50%....60%....70%....80%....90%....100%
Creating?machine...
(default)?Copying?/root/.docker/machine/cache/boot2docker.iso?to?/root/.docker/machine/machines/default/boot2docker.iso...
(default)?Creating?VirtualBox?VM...
(default)?Creating?SSH?key...
(default)?Starting?the?VM...
(default)?Check?network?to?re-create?if?needed...
(default)?Found?a?new?host-only?adapter:?"vboxnet0"
(default)?Waiting?for?an?IP...
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?boot2docker...
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?default
#可以先安装个默认的虚拟机
[root@centos7?~]#?docker-machine?ls
NAME??????ACTIVE???DRIVER???????STATE?????URL?????????????????????????SWARM???DOCKER????????ERRORS
default???-????????virtualbox???Running???tcp://192.168.99.100:2376???????????v18.05.0-ce???
[root@centos7?~]#?docker-machine?status
Running

接下来配置环境变量,方便后面直接操作主机

[root@centos7?~]#?docker-machine?env?default
export?DOCKER_TLS_VERIFY="1"
export?DOCKER_HOST="tcp://192.168.99.100:2376"
export?DOCKER_CERT_PATH="/root/.docker/machine/machines/default"
export?DOCKER_MACHINE_NAME="default"
#?Run?this?command?to?configure?your?shell:?
#?eval?$(docker-machine?env?default)
[root@centos7?~]#??eval?$(docker-machine?env?default)
#连接虚拟主机
[root@centos7?~]#?docker-machine?ssh?default
????????????????????????##?????????.
??????????????????##?##?##????????==
???????????????##?##?##?##?##????===
???????????/"""""""""""""""""\___/?===
??????~~~?{~~?~~~~?~~~?~~~~?~~~?~?/??===-?~~~
???????????\______?o???????????__/
?????????????\????\?????????__/
??????????????\____\_______/
?_?????????????????_???____?????_????????????_
|?|__???___???___?|?|_|___?\?__|?|?___???___|?|?_____?_?__
|?'_?\?/?_?\?/?_?\|?__|?__)?/?_`?|/?_?\?/?__|?|/?/?_?\?'__|
|?|_)?|?(_)?|?(_)?|?|_?/?__/?(_|?|?(_)?|?(__|???<??__/?|
|_.__/?\___/?\___/?\__|_____\__,_|\___/?\___|_|\_\___|_|
Boot2Docker?version?18.05.0-ce,?build?HEAD?:?b5d6989?-?Thu?May?10?16:35:28?UTC?2018
Docker?version?18.05.0-ce,?build?f150324
docker@default:~$?docker?--version
Docker?version?18.05.0-ce,?build?f150324
#正常进入虚拟机

实例

两台服务器
本地主机:192.168.22.177
远程主机:192.168.22.175
可能大家还是不太明白,这个docker-machine到底有什么用?docker容器的好处都知道了。而docker-machine可以在本地布署相应环境的同时完成远程docker主机相同环境的布署,减少重复的操作。

1、配置免密登录
[root@test001?~]#?ssh-keygen?-t?rsa
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:7Ue0bc08pEs+PonJqy7/hyxUhNO4uEegVizX4EJC8J8?root@centos7.3
The?key's?randomart?image?is:
+---[RSA?2048]----+
|?.oo?...o?+??????|
|??.?o..=?=?o?????|
|???.?.=.o?+?.??.?|
|????.oo.?+?o?oo+?|
|????.E??S?o?ooo.+|
|???????.?+?.o..?.|
|????????o?+?=+.??|
|???????.?.?B.+.??|
|????????+++oo..??|
+----[SHA256]-----+
[root@centos7?~]#?ssh-copy-id?192.168.22.175
/usr/bin/ssh-copy-id:?INFO:?Source?of?key(s)?to?be?installed:?"/root/.ssh/id_rsa.pub"
The?authenticity?of?host?'
192.168.22.175?(192.168.22.175)'?can't?be?established.
ECDSA?key?fingerprint?is?SHA256:p6+FPeTxTUx37cwJWJP8cUE9NhcUHSvAppVPyj4aj8c.
ECDSA?key?fingerprint?is?MD5:89:6d:f7:46:11:45:2e:fd:21:87:42:bd:62:06:fe:fd.
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.22.175's?password:?

Number?of?key(s)?added:?1

Now?try?logging?into?the?machine,?with:???"ssh?'
192.168.22.175'"
and?check?to?make?sure?that?only?the?key(s)?you?wanted?were?added.

[root@test001?~]#?ssh?192.168.22.175
Last?login:?Tue?Apr?24?06:51:06?2018?from?192.168.22.170
[root@test002?~]#?ip?add?|grep?192.168.22
????inet?192.168.22.175/24?brd?192.168.22.255?scope?global?ens32

2、创建远程主机

远程主机需要安装有docker环境

[root@test001?~]#?docker-machine?create?-d?generic?--generic-ip-address=192.168.22.175?--generic-ssh-user=root?--engine-registry-mirror?http://sb138.99sbgw.com???dockerhost
Running?pre-create?checks...
Creating?machine...
(dockerhost)?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?dockerhost
[root@test001?~]#?docker-machine?ls
NAME?????????ACTIVE???DRIVER???????STATE?????URL?????????????????????????SWARM???DOCKER????ERRORS
dockerhost???-????????generic??????Running???tcp://192.168.22.175:2376???????????v1.13.1???
3、配置环境变量
[root@centos7?~]#?docker-machine?env?dockerhost
export?DOCKER_TLS_VERIFY="1"
export?DOCKER_HOST="tcp://192.168.22.175:2376"
export?DOCKER_CERT_PATH="/root/.docker/machine/machines/dockerhost"
export?DOCKER_MACHINE_NAME="dockerhost"
#?Run?this?command?to?configure?your?shell:?
#?eval?$(docker-machine?env?dockerhost)
[root@test001?~]#?eval?$(docker-machine?env?dockerhost)
[root@test001?~]#?docker-machine?ssh?dockerhost
Last?login:?Thu?Jun?14?02:32:42?2018?from?192.168.22.177
[root@dockerhost?~]#?docker?--version
Docker?version?1.13.1,?build?94f4240/1.13.1
4、运行一个容器
[root@test001?~]#?docker?run?-d?nginx:1.13
Unable?to?find?image?'nginx:1.13'?locally
Trying?to?pull?repository?docker.io/library/nginx?...?
sha256:b1d09e9718890e6ebbbd2bc319ef1611559e30ce1b6f56b2e3b479d9da51dc35:?Pulling?from?docker.io/library/nginx
f2aa67a397c4:?Pull?complete?
3c091c23e29d:?Pull?complete?
4a99993b8636:?Pull?complete?
Digest:?sha256:b1d09e9718890e6ebbbd2bc319ef1611559e30ce1b6f56b2e3b479d9da51dc35
Status:?Downloaded?newer?image?for?docker.io/nginx:1.13
72efb659ec38d263519c894bf0b5eb3d5ca35af1e3d0e9522abbcc19d8739403
[root@test001?~]#?docker?image?ls
REPOSITORY??????????TAG?????IMAGE?ID???????CREATED???????SIZE
docker.io/nginx?????1.13????ae513a47849c???6?weeks?ago???109?MB
[root@test001?~]#?docker-machine?ssh?dockerhost
Last?login:?Thu?Jun?14?02:58:51?2018?from?192.168.22.177
[root@dockerhost?~]#?docker?image?ls
REPOSITORY??????????TAG??????IMAGE?ID??????CREATED???????SIZE
docker.io/nginx?????1.13?????ae513a47849c??6?weeks?ago???109?MB
#由此可以发现,利用docker-machine可以减少重复操作,便于环境的创建


关于Docker容器技术的基础知识点,可以阅读下面的文章 :

Docker容器技术入门(一)

Docker容器技术入门(二)

推荐阅读

[强烈推荐]?精心整理|公众号文章目录大全

一个草根程序员如何逆袭,成功进入BAT!

企业面试题|最常问的MySQL面试题集合(二)

北大高材生被华为辞退:用不用你,与能力无关

二季度平均工资出炉,网友:一如既往拖后腿!

架构设计:负载均衡层设计方案之负载场景和解决方式篇

深入理解消息中间件技术之RabbitMQ服务

民工哥的十年故事续集:杭漂十年,今撤霸都!

·end·