Docker(三)Docker Machine简要说明(创建DockerVM主机、VM存储说明等)

针对DockerMachine的简要使用和说明补充

1. Docker Machine概述

Docker Machine是一个工具,可让在虚拟主机上(比如VirtualBox上)安装Docker Engine,并使用docker-machine命令管理主机。

另外还可以使用Docker Machine在本地Mac或Windows机器上,连接和管理数据中心或Azure,AWS或DigitalOcean等云提供商上创建Docker主机。

使用docker-machine命令,可以启动,检查,停止和重新启动托管主机,升级Docker客户端和守护程序,并配置Docker客户端以与主机通信。

使用Machine CLI指向正在运行的Docker主机,然后通过docker直接在该主机上运行命令(例如,运行docker-machine env default以指向被调用的主机default)

1.1. 主要用途 - 旧系统安装和使用Docker主机、管理远程Docker主机

  1. 在操作系统上面安装Docker主机(DockerEngine),需要依赖VirtualBox或相关的虚拟软件驱动(docker-machine create --driver)
  2. 配置和管理多个远程Docker主机,就像本地使用Docker for mac一样
  3. 提供Swarm集群(单Mac机器上面就支持了多个虚拟IP,有VirtualBox虚拟出来的,支持Docker主机的IP连通性,为Mac上面支持网络复杂部署提供了一套额外的解决方案;在使用Docker for mac过程中,在测试不同应用时候的端口冲突问题,比如多个应用都依赖80端口,可以基于同一Nginx容器内做域名解析&请求代理转发,需要该代理机器与其他应用容器的网络互连

1.2. 和Docker for Mac的差别

  1. Docker for Mac是Mac上面DockerEngine的套件(有DockerEngine、DockerCLI、DockerMachine),更确切一点实际上是一个Docker主机
  2. Docker Machine是一个用于配置和管理Dockerized主机(带有Docker Engine的主机)的工具(实际上主要是RestAPI以及CLI组成,作为一个Client)
  • Docker主机(DockerEngine)
  • DockerMachine(管理Docker主机)

2. 安装

如果安装了Docker for Mac,则Machine会与其他Docker产品一起安装

  1. 支持Git Bash的自动提示
  2. BashShell提示当前正在操作的DockerEngine主机
  3. 支持DockerEngine活动主机切换

参见:https://docs.docker.com/machine/install-machine/

3. 简易使用

3.1. 版本查看

$ docker-machine version
docker-machine version 0.16.0, build 9371605

3.2. 创建Docker VM主机

可以基于不同的驱动来创建不同的Docker主机,比如基于virtualbox或者hyperv,参见1

另外在创建过程中,可以指定Docker镜像代理、指定VitualBox的内存,CPU容量、Docker主机IP、Docker主机集群情况等

// 创建Docker主机
$ docker-machine create --driver virtualbox default
// 查看
$ docker-machine ls
// 环境配置
$ docker-machine env default
// 使用环境配置
eval "$(docker-machine env default)"
// docker相关操作,此时docker命令是与default docker主机进行交互
docker run busybox echo hello world
// ssh进入
$ docker-machine ssh default

3.3. 创建Docker VM主机 - dkhost01

// 创建Docker虚拟主机 - dkhost01
$ docker-machine create --driver virtualbox dkhost01
Running pre-create checks...
Creating machine...
(dkhost01) Copying /Users/Terry/.docker/machine/cache/boot2docker.iso to /Users/Terry/.docker/machine/machines/dkhost01/boot2docker.iso...
(dkhost01) Creating VirtualBox VM...
(dkhost01) Creating SSH key...
(dkhost01) Starting the VM...
(dkhost01) Check network to re-create if needed...
(dkhost01) 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 dkhost01

3.4. 查看Docker主机

$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
default   *        virtualbox   Running   tcp://192.168.99.100:2376           v19.03.1

3.5. 更改Docker服务配置

之前由于没有设定镜像代理,从DockerHub官网拉镜像可能有些慢,可以通过修改镜像配置后,通过docker-machine provision重启Docker主机的Dockerd服务

docker-machine管控docker主机的相关配置,包括虚拟机相关的证书和其他数据docker-machine都放在~/.docker/machine/machines/下,Docker主机配置放在config.json

$ tree ~/.docker/machine/machines
└── default
    ├── boot2docker.iso
    ├── ca.pem
    ├── cert.pem
    ├── config.json
    ├── default
    │   ├── Logs
    │   │   ├── VBox.log
    │   │   ├── VBox.log.1
    │   │   └── VBox.log.2
    │   ├── default.vbox
    │   └── default.vbox-prev
    ├── disk.vmdk
    ├── id_rsa
    ├── id_rsa.pub
    ├── key.pem
    ├── server-key.pem
    └── server.pem

~/.docker/machine/machines/

3.6. 使Docker服务配置生效

仅Docker主机服务重启,Virtual主机没有重启

$ docker-machine provision default
Waiting for SSH to be available...
Detecting the provisioner...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...

3.7. 在Docker主机上运行服务

// 运行nginx服务
$ docker run -d -p 80:80 nginx
// 在Mac主机测试
$ curl -I $(docker-machine ip)
HTTP/1.1 200 OK
Server: nginx/1.17.2
Date: Fri, 02 Aug 2019 04:48:57 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 23 Jul 2019 11:45:37 GMT
Connection: keep-alive
ETag: "5d36f361-264"
Accept-Ranges: bytes

3.8. 进入Docker主机查看容器和镜像

$ docker-machine ssh
   ( '>')
  /) TC (\   Core is distributed with ABSOLUTELY NO WARRANTY.
 (/-_--_-\)           www.tinycorelinux.net

docker@default:~$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              e445ab08b2be        9 days ago          126MB
busybox             latest              db8ee88ad75f        2 weeks ago         1.22MB
docker@default:~$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
f85fb78da195        nginx               "nginx -g 'daemon of…"   About an hour ago   Up 2 seconds        0.0.0.0:80->80/tcp   distracted_kirch

3.9. Docker主机存储说明

// VM虚拟主机存储位置(MAC上)
$ ll -h .docker/machine/machines/default/disk.vmdk
-rw-------  1 Terry  staff   184M  8  2 14:04 .docker/machine/machines/default/disk.vmdk

Tips,如果docker-machine rm default后,对应的Vhost的磁盘存储文件也会被删除!!

容器<=>Docker主机<=>VirtualBox Vhost<=> Mac

4. 附加说明

由于DockerMachine是基于VM形式使用的,相当于在Mac上面利用VirtualBox跑了一个Boot2Docker系统,整体内存开销多了一层VM主机(Boot2Docker),默认情况下下是1G的VM内存(可调整),如果资源富余可以开启起来,在测试Swarm或集群方面,比Docker For Mac稍微好方便一些,Mac网络与DockerVM主机是互通的!

Docker For Mac默认情况下,Mac主机无法与容器直接通讯,需要通过端口映射方式将容器内运行的服务暴露给Mac运行(需要通过一个公用代理容器,且这个容器与其他服务网络互连才可以解决)。通过DockerMachine这点可以通过开多个VM通过不同的虚拟IP加相同的端口(比如80或443)就可以一部分解决。

5. 参考

  1. https://docs.docker.com/machine/get-started/

  1. https://docs.docker.com/machine/get-started/ ↩︎