介绍
Docker Machine 是一个工具,可以轻松从您的个人计算机远程提供和管理多个 Docker 主机. 这些服务器通常被称为 Dockerized 主机,当然可以用来运行 Docker 容器。
虽然 Docker Machine 可以安装在本地或远程系统上,但最常见的方法是将其安装在本地计算机上(本地安装或虚拟机),并使用它来提供 Dockerized 远程服务器。
虽然Docker Machine可以安装在大多数Linux发行版以及Mac OS X和Windows上,但在本教程中,我们将安装在运行Ubuntu 16.04的本地机器上,并使用它来提供Dockerized DigitalOcean Droplets。
前提条件
要遵循本教程,您将需要以下内容:
- 一个运行 Ubuntu 16.04 的本地机器安装了 Docker (请参见 如何在 Ubuntu 16.04 上安装和使用 Docker以获取说明)
- 一个DigitalOcean API 代币. 如果你没有一个,使用此指南(https://andsky.com/tech/tutorials/how-to-use-the-digitalocean-api-v2)生成它。当你生成代币时,请确保它具有读写范围。这是默认的,所以如果你在生成时不改变任何选项,它将具有读写功能。为了使它在命令行上更容易使用,请确保将代币分配给该文章中所述的变量。
步骤 1 — 在本地计算机上安装 Docker 机器
在此步骤中,我们将通过在运行 Ubuntu 16.04 的本地计算机上安装 Docker Machine 的过程进行工作。
要下载和安装 Docker Machine 二进制,键入:
1wget https://github.com/docker/machine/releases/download/v0.14.0/docker-machine-$(uname -s)-$(uname -m)
该文件的名称应该是「docker-machine-Linux-x86_64」。
1mv docker-machine-Linux-x86_64 docker-machine
使其可行:
1chmod +x docker-machine
将其移动或复制到usr/local/bin
目录,以便作为系统命令可用。
1sudo mv docker-machine /usr/local/bin
检查版本,这将表明它已正确安装:
1docker-machine version
产量应该类似于
1[secondary_label Output]
2docker-machine version 0.14.0, build 89b8332
步骤 2 — 安装额外的 Docker 机器脚本
Docker Machine GitHub 存储库中有三个 bash 脚本,旨在方便使用docker
和docker-machine
命令,它们提供命令完成和 bash-prompt 定制。
在此步骤中,我们将将这些三种脚本安装在您的本地机器上,它们将下载并安装到 /etc/bash_completion.d
目录中。
第一个脚本允许您从您的 bash 提示中查看活跃的机器。这在您在与多个 Dockerized 机器之间工作和切换时非常方便。该脚本称为 docker-machine-prompt.bash
。
1sudo wget https://raw.githubusercontent.com/docker/machine/master/contrib/completion/bash/docker-machine-prompt.bash -O /etc/bash_completion.d/docker-machine-prompt.bash
要完成上面的文件的安装,您需要在您的.bashrc 文件中为 PS1
变量设置自定义值. 要做到这一点,请使用 nano
打开它( PS1
是一个用于修改 bash 命令提示的特殊壳变量):
1nano ~/.bashrc
在该文件中,有三个开始于 PS1的行,它们应该是这样的:
1[label ~/.bashrc]
2PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
3
4PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
5
6PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
对于每个行,将$(__docker_machine_ps1
[%s])
插入到尽头,以便读取:
1[label ~/.bashrc]
2PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$(__docker_machine_ps1 " [%s]")\$ '
3
4PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w$(__docker_machine_ps1 " [%s]")\$ '
5
6PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$(__docker_machine_ps1 " [%s]")$PS1"
保存并关闭文件。
第二个脚本名为docker-machine-wrapper.bash
。它将一个使用
子命令添加到docker-machine
命令中,使其易于在 Docker 机器之间切换。
1sudo wget https://raw.githubusercontent.com/docker/machine/master/contrib/completion/bash/docker-machine-wrapper.bash -O /etc/bash_completion.d/docker-machine-wrapper.bash
第三个脚本叫docker-machine.bash
。它为docker-machine
命令添加了 bash completion。
1sudo wget https://raw.githubusercontent.com/docker/machine/master/contrib/completion/bash/docker-machine.bash -O /etc/bash_completion.d/docker-machine.bash
要应用到目前为止所做的更改,请关闭,然后重新打开终端。如果您已通过 SSH 登录到机器,请退出会话并再次登录。
步骤 3 — 使用 Docker 机器提供 Docker 主机
现在你已经在本地机器上运行了 Docker 和 Docker Machine,你现在可以使用 Docker Machine 的docker-machine create
命令在你的 DigitalOcean 帐户上提供 Dockerized Droplet。
1export DOTOKEN=your-api-token
<$>[注] **注:**本教程使用 DOTOKEN 作为 DO API 代币的 bash 变量。
要使变量永久,请将其放入您的 ~/.bashrc
文件中. 此步骤是可选的,但如果您希望该值在终端会话中继续存在,则是必要的。
打开nano
的文件:
1nano ~/.bashrc
在任何地方添加类似的行:
1[label ~/.bashrc]
2export DOTOKEN=your-api-token
要在当前终端会话中激活变量,键入:
1source ~/.bashrc
要成功调用docker-machine create
命令,您必须指定(至少)驱动程序、API代码(或对其进行评估的变量),以及机器的唯一名称。
1docker-machine create --driver digitalocean --digitalocean-access-token $DOTOKEN machine-name
在此输出中,机器的名称是 ubuntu1604-docker
:
1[secondary_label Output]
2 ...
3Installing Docker...
4Copying certs to the local machine directory...
5Copying certs to the remote machine...
6Setting Docker configuration on the remote daemon...
7Checking connection to Docker...
8Docker is up and running!
9To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env ubuntu1604-docker
SSH 密钥对为新主机创建,因此docker-machine
可以远程访问它。Droplet 配备了所需的操作系统,Docker 安装在系统上。
若要从命令行查看新创建的机器,请键入:
1docker-machine ls
结果应该是这样的:
1[secondary_label Output]
2NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
3ubuntu1604-docker - digitalocean Running tcp://203.0.113.71:2376 v18.05.0-ce
步骤 4 — 在创建 Dockerized 主机时指定 Base OS
默认情况下,在使用 Docker Machine 创建 Dockerized 主机时使用的基本操作系统是最新的 Ubuntu LTS. 但是,在这个发布时,docker-machine create
命令仍然使用 Ubuntu 16.04 LTS 作为基本操作系统,尽管 Ubuntu 18.04 是最新的 LTS 版本。
例如,要创建使用 Ubuntu 18.04 的机器,请键入:
1docker-machine create --driver digitalocean --digitalocean-image ubuntu-18-04-x64 --digitalocean-access-token $DOTOKEN machine-name
您不局限于 Ubuntu 的版本,您可以使用 DigitalOcean 支持的任何操作系统创建机器,例如,要使用 Debian 8 创建机器,请键入:
1docker-machine create --driver digitalocean --digitalocean-image debian-8-x64 --digitalocean-access-token $DOTOKEN machine-name
若要提供使用 CentOS 7 作为基本操作系统的 Dockerized 主机,请指定 centos-7-0-x86
作为图像名称,如下:
1docker-machine create --driver digitalocean --digitalocean-image centos-7-0-x64 --digitalocean-access-token $DOTOKEN centos7-docker
基本操作系统不是你唯一的选择,你也可以指定Droplet的大小,默认情况下,它是最小的Droplet,具有1GB的RAM,一个单一的CPU和25GB的SSD。
通过在 DigitalOcean API 文档中查找所要使用的 Droplet 的尺寸。
例如,要提供 2 GB 的 RAM、 2 个 CPU 和 60 GB 的 SSD,请使用 slug `s-2vcpu-2gb:
1docker-machine create --driver digitalocean --digitalocean-size s-2vcpu-2gb --digitalocean-access-token $DOTOKEN machine-name
若要查看使用 DigitalOcean 驱动程序创建 Docker 机器的所有标志,请键入:
1docker-machine create --driver digitalocean -h
<$>[注]
提示: 如果您更新您的DigitalOcean仪表板的Droplet页面,您将看到您使用docker-machine
命令创建的新机器。
步骤 5 — 执行额外的 Docker 机器命令
您已经看到如何使用创建
子命令提供一个 Dockerized 主机,您还看到如何使用ls
子命令列出可用于 Docker Machine 的主机,在此步骤中,您将学习更多docker-machine
子命令。
要获取有关 Dockerized 主机的详细信息,请使用inspect
子命令,如下:
1docker-machine inspect machine-name
输出应该包括这样的线条: Image 行显示了所使用的 Linux 发行版的版本,而 size 行表示了大小:
1[secondary_label Output]
2...
3{
4 "ConfigVersion": 3,
5 "Driver": {
6 "IPAddress": "203.0.113.71",
7 "MachineName": "ubuntu1604-docker",
8 "SSHUser": "root",
9 "SSHPort": 22,
10 ...
11 "Image": "ubuntu-16-04-x64",
12 "Size": "s-1vcpu-1gb",
13 ...
14 },
15
16---
要打印一个主机的连接配置,键入:
1docker-machine config machine-name
结果应该是这样的:
1[secondary_label Output]
2--tlsverify
3--tlscacert="/home/kamit/.docker/machine/certs/ca.pem"
4--tlscert="/home/kamit/.docker/machine/certs/cert.pem"
5--tlskey="/home/kamit/.docker/machine/certs/key.pem"
6-H=tcp://203.0.113.71:2376
docker-machine config
命令的最后一行显示了主机的 IP 地址,但您也可以通过键入获取此信息:
1docker-machine ip machine-name
如果您需要下载远程主机,您可以使用docker-machine
来阻止它:
1docker-machine stop machine-name
检查它是否被阻止。
1docker-machine ls
机器的状态发生了变化:
1[secondary_label Ouput]
2NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
3ubuntu1604-docker digitalocean Timeout
要重新开始:
1docker-machine start machine-name
检查是否已启动:
1docker-machine ls
您将看到状态
现在为主机设置为运行
:
1[secondary_label Ouput]
2NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
3
4ubuntu1604-docker - digitalocean Running tcp://203.0.113.71:2376 v18.05.0-ce
然后你可以使用它去除:
1docker-machine rm machine-name
Droplet
被删除,以及由docker-machine为其创建的SSH密钥。当你列出Dockerized主机时,你不应该看到你刚刚删除的主机:
1docker-machine ls
步骤 6 — 通过 SSH 在 Dockerized 主机上执行命令
例如,您可以在 Docker 主机上执行本地 Linux 命令,使用本地系统的「docker-machine」的「ssh」子命令。
假设您已经配置了 Ubuntu 作为操作系统的机器,请从本地系统执行以下命令,以更新 Docker 主机上的包数据库:
1docker-machine ssh machine-name apt-get update
您甚至可以使用可用的更新:
1docker-machine ssh machine-name apt-get upgrade
您不确定远程 Docker 主机正在使用哪个内核?请输入以下内容:
1docker-machine ssh machine-name uname -r
除了使用ssh
子命令在远程 Docker 主机上执行命令外,您还可以使用它来登录机器本身。
1docker-machine ssh machine-name
您的命令提示将更改以反映您已登录到远程主机的事实:
1[secondary_label Output]
2root@machine-name#
要离开远程主机,键入:
1exit
步骤 7 – 激活 Dockerized 主机
激活 Docker 主机将本地 Docker 客户端连接到该系统,从而在远程系统上运行正常的docker
命令。
1eval $(docker-machine env machine-name)
或者,您可以使用这个命令来激活它:
1docker-machine use machine-name
<$>[注]
**提示:**在使用多个Docker主机时,使用docker-machine use
命令是从一个到另一个最简单的切换方法。
在输入上述任何一个命令后,您的 bash 提示应更改,以表明您的 Docker 客户端指向远程 Docker 主机。
1username@localmachine:~ [machine-name]$
现在,您在这个命令提示中输入的任何docker
命令都会在该远程主机上执行。
如果主机在运行docker-machine ls
命令的终端上是活跃的,则 ACTIVE列下的星座显示它是活跃的。
1[secondary_label Output]
2NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
3ubuntu1604-docker * digitalocean Running tcp://203.0.113.71:2376 v18.05.0-ce
若要退出远程 Docker 主机,请键入以下内容:
1docker-machine use -u
您将被返回您的本地系统的提示。
现在让我们在远程机器上创建容器。
步骤 8 — 在远程 Docker 主机上创建 Docker 容器
到目前为止,您已在您的 DigitalOcean 帐户中配置了 Dockerized Droplet,并且已激活它,也就是说,您的 Docker 客户端正在指向它。
使用docker-machine use
来选择您的远程机器:
1docker-machine use machine-name
现在执行此命令在该机器上运行 Nginx 容器:
1docker run -d -p 8080:80 --name httpserver nginx
在这个命令中,我们将 Nginx 容器中的端口80
地图到 Dockerized 主机上的端口8080
,以便我们可以从任何地方访问默认的 Nginx 页面。
如果命令成功执行,您将能够通过指向您的 Web 浏览器到 http://docker_machine_ip:8080
来访问默认的 Nginx 页面。
虽然 Docker 主机仍然处于激活状态(如提示中的名称所示),您应该能够列出该主机上的图像:
1docker images
输出应该包括您刚刚使用的 Nginx 图像,以及您之前下载的其他图像:
1[secondary_label Output]
2REPOSITORY TAG IMAGE ID CREATED SIZE
3nginx latest ae513a47849c 3 weeks ago 109MB
您还可以列出主机上正在运行的或正在运行的容器:
1docker ps
如果您在这个步骤中运行的 Nginx 容器是唯一活跃的容器,则输出应该是这样的:
1[secondary_label Output]
2CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
34284f9d25548 nginx "nginx -g 'daemon of…" 20 minutes ago Up 20 minutes 0.0.0.0:8080->80/tcp httpserver
要退出远程主机的提示,键入. 这也会关闭终端:
1exit
<$>[注] 注: 如果您打算在远程机器上创建容器,您的Docker客户端必须指向它 - 也就是说,它必须是您正在使用的终端中的活跃机器。
步骤 9 – 禁用事故报告(可选)
默认情况下,每次尝试使用 Docker Machine 提供 Docker 主机失败或 Docker Machine 崩溃时,都会自动发送某些诊断信息到 Bugsnag 上的 Docker 帐户。
要创建文件,键入:
1touch ~/.docker/machine/no-error-report
检查文件的错误消息,如果提供失败或Docker Machine崩溃。
结论
这是安装和使用Docker Machine从一个本地系统远程提供多个Docker Droplets的介绍,现在您应该能够在您的DigitalOcean帐户上快速提供您需要的尽可能多的Dockerized主机。
有关 Docker 机器的更多信息,请访问 官方文档页面。本教程中下载的三个 Bash 脚本都在 GitHub 页面托管。