如何在 Ubuntu 16.04 上使用 Docker Machine 提供和管理远程 Docker 主机
介绍
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 令牌。如果您没有,请使用本指南生成它。生成令牌时,请确保它具有读写范围。这是默认设置,因此如果您在生成它时不更改任何选项,它将具有读写功能。为了更易于在命令行上使用,请务必将令牌分配给该文章中给出的变量。
第 1 步 — 在本地计算机上安装 Docker Machine
在此步骤中,我们将完成在运行 Ubuntu 16.04 的本地计算机上安装 Docker Machine 的过程。
要下载并安装 Docker Machine 二进制文件,请键入:
- wget https://github.com/docker/machine/releases/download/v0.14.0/docker-machine-$(uname -s)-$(uname -m)
该文件的名称应为 docker-machine-Linux-x86_64
。将其重命名为 docker-machine
以使其更易于使用:
- mv docker-machine-Linux-x86_64 docker-machine
使其可执行:
- chmod +x docker-machine
将它移动或复制到 usr/local/bin
目录,以便它可以作为系统命令使用。
- sudo mv docker-machine /usr/local/bin
检查版本,这将表明它已正确安装:
- docker-machine version
输出应该类似于
Outputdocker-machine version 0.14.0, build 89b8332
第 2 步 — 安装额外的 Docker 机器脚本
Docker Machine GitHub 存储库中有三个 bash 脚本,旨在促进 docker
和 docker-machine
命令的使用。它们提供命令完成和 bash 提示定制。
在此步骤中,我们将在您的本地计算机上安装这三个脚本。它们将被下载并安装到 /etc/bash_completion.d
目录中。
第一个脚本允许您从 bash 提示符中查看活动机器。当您使用多个 Dockerized 机器并在它们之间切换时,这会派上用场。该脚本名为 docker-machine-prompt.bash
。要下载它,请键入:
- sudo 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
是一个特殊的 shell 变量,用于修改 bash 命令提示符):
- nano ~/.bashrc
在该文件中,有三行以 PS1 开头。他们应该是这样的:
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
对于每一行,在末尾附近插入 $ (__docker_machine_ps1 [%s])
以便它们读取:
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$(__docker_machine_ps1 " [%s]")\$ '
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w$(__docker_machine_ps1 " [%s]")\$ '
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$(__docker_machine_ps1 " [%s]")$PS1"
保存并关闭文件。
第二个脚本称为 docker-machine-wrapper.bash
。它将 use
子命令添加到 docker-machine
命令,使得在 Docker Machine 之间切换变得容易。要下载它,请键入:
- sudo 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 完成。使用以下方式下载:
- sudo wget https://raw.githubusercontent.com/docker/machine/master/contrib/completion/bash/docker-machine.bash -O /etc/bash_completion.d/docker-machine.bash
要应用您到目前为止所做的更改,请关闭,然后重新打开您的终端。如果您通过 SSH 登录到计算机,请退出会话并再次登录。 docker
和 docker-machine
命令的命令完成现在应该可以正常工作了。
第 3 步 — 使用 Docker Machine 提供一个 Dockerized 主机
现在您已经在本地计算机上运行了 Docker 和 Docker Machine,您现在可以使用 Docker Machine 的 docker-machine create
命令在您的 DigitalOcean 帐户上配置一个 Dockerized Droplet。如果您还没有这样做,请使用以下方法将您的 DigitalOcean API 令牌分配给 bash 变量:
- export DOTOKEN=your-api-token
注意:本教程使用 DOTOKEN 作为 DO API 令牌的 bash 变量。变量名不必是 DOTOKEN,也不必全部大写。
要使变量永久化,请将其放入 ~/.bashrc
文件中。此步骤是可选的,但如果您希望该值在终端会话中保持不变,则此步骤是必需的。
使用 nano
打开该文件:
- nano ~/.bashrc
在任何地方添加类似于此的行:
export DOTOKEN=your-api-token
要在当前终端会话中激活变量,请键入:
- source ~/.bashrc
要成功调用 docker-machine create
命令,您必须(至少)指定驱动程序、API 令牌(或对其求值的变量)以及机器的唯一名称。要创建您的第一台机器,请键入:
- docker-machine create --driver digitalocean --digitalocean-access-token $DOTOKEN machine-name
创建机器时的部分输出如下。在此输出中,机器的名称是 ubuntu1604-docker
:
Output ...
Installing Docker...
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 ubuntu1604-docker
为新主机创建 SSH 密钥对,以便 docker-machine
可以远程访问它。 Droplet 配备了所需的操作系统,并且 Docker 安装在系统上。命令完成后,您的 Docker Droplet 将启动并运行。
要从命令行查看新创建的机器,请键入:
- docker-machine ls
输出应与此类似:
OutputNAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
ubuntu1604-docker - digitalocean Running tcp://203.0.113.71:2376 v18.05.0-ce
第 4 步 — 在创建 Dockerized 主机时指定基本操作系统
默认情况下,使用 Docker Machine 创建 Dockerized 主机时使用的基本操作系统应该是最新的 Ubuntu LTS。然而,在本文发布时,docker-machine create
命令仍在使用 Ubuntu 16.04 LTS 作为基本操作系统,尽管 Ubuntu 18.04 是最新的 LTS 版本。因此,如果您需要在最近配置的机器上运行 Ubuntu 18.04,则必须通过将 --digitalocean-image
标志传递给 docker- 来指定 Ubuntu 以及所需的版本机器创建
命令。
例如,要使用 Ubuntu 18.04 创建一台机器,请键入:
- docker-machine create --driver digitalocean --digitalocean-image ubuntu-18-04-x64 --digitalocean-access-token $DOTOKEN machine-name
您不限于某个版本的 Ubuntu。您可以使用 DigitalOcean 支持的任何操作系统创建机器。例如,要使用 Debian 8 创建一台机器,请键入:
- docker-machine create --driver digitalocean --digitalocean-image debian-8-x64 --digitalocean-access-token $DOTOKEN machine-name
要使用 CentOS 7 作为基本操作系统来配置 Dockerized 主机,请指定 centos-7-0-x86
作为映像名称,如下所示:
- docker-machine create --driver digitalocean --digitalocean-image centos-7-0-x64 --digitalocean-access-token $DOTOKEN centos7-docker
基本操作系统不是您唯一的选择。您还可以指定 Droplet 的大小。默认情况下,它是最小的 Droplet,具有 1 GB RAM、单个 CPU 和 25 GB SSD。
通过在 DigitalOcean API 文档中查找相应的 slug,找到您要使用的 Droplet 的大小。
例如,要为一台机器配置 2 GB RAM、两个 CPU 和一个 60 GB SSD,请使用 slug s-2vcpu-2gb
:
- docker-machine create --driver digitalocean --digitalocean-size s-2vcpu-2gb --digitalocean-access-token $DOTOKEN machine-name
要查看使用 DigitalOcean 驱动程序创建 Docker Machine 的所有特定标志,请键入:
- docker-machine create --driver digitalocean -h
提示:如果您刷新 DigitalOcean 仪表板的 Droplet 页面,您将看到您使用 docker-machine
命令创建的新机器。
第 5 步 — 执行额外的 Docker 机器命令
您已经了解了如何使用 create
子命令配置 Dockerized 主机。您还了解了如何使用 ls
子命令列出 Docker Machine 可用的主机。在这一步中,您将学习更多的 docker-machine
子命令。
要获取有关 Dockerized 主机的详细信息,请使用 inspect
子命令,如下所示:
- docker-machine inspect machine-name
输出应该包括像这样的行。 Image 行显示了所用 Linux 发行版的版本,而 size 行表示大小 slug:
Output...
{
"ConfigVersion": 3,
"Driver": {
"IPAddress": "203.0.113.71",
"MachineName": "ubuntu1604-docker",
"SSHUser": "root",
"SSHPort": 22,
...
"Image": "ubuntu-16-04-x64",
"Size": "s-1vcpu-1gb",
...
},
---
要打印主机的连接配置,请键入:
- docker-machine config machine-name
输出应与此类似:
Output--tlsverify
--tlscacert="/home/kamit/.docker/machine/certs/ca.pem"
--tlscert="/home/kamit/.docker/machine/certs/cert.pem"
--tlskey="/home/kamit/.docker/machine/certs/key.pem"
-H=tcp://203.0.113.71:2376
docker-machine config
命令输出的最后一行显示了主机的 IP 地址,但您也可以通过键入以下内容来获取该信息:
- docker-machine ip machine-name
如果你需要关闭远程主机,你可以使用 docker-machine
来停止它:
- docker-machine stop machine-name
确认它已停止。
- docker-machine ls
机器的状态发生了变化:
OuputNAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
ubuntu1604-docker digitalocean Timeout
重新启动它:
- docker-machine start machine-name
验证它是否已启动:
- docker-machine ls
您将看到主机的 STATE
现在设置为 Running
:
OuputNAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
ubuntu1604-docker - digitalocean Running tcp://203.0.113.71:2376 v18.05.0-ce
然后你可以使用以下方法删除它:
- docker-machine rm machine-name
Droplet 连同 docker-machine 为它创建的 SSH 密钥一起被删除。
现在,当您列出 Dockerized 主机时,您不应该看到刚刚删除的主机:
- docker-machine ls
第 6 步 — 通过 SSH 在 Dockerized 主机上执行命令
此时,您已经获得了有关您的机器的信息,但您可以做更多的事情。例如,您可以在本地系统中使用 docker-machine
的 ssh
子命令在 Docker 主机上执行本机 Linux 命令。本节介绍如何通过 docker-machine
执行 ssh
命令,以及如何打开与 Dockerized 主机的 SSH 会话。
假设您已经配置了一台使用 Ubuntu 作为操作系统的机器,从您的本地系统执行以下命令来更新 Docker 主机上的包数据库:
- docker-machine ssh machine-name apt-get update
您甚至可以使用以下方法应用可用更新:
- docker-machine ssh machine-name apt-get upgrade
不确定您的远程 Docker 主机使用的是什么内核?输入以下内容:
- docker-machine ssh machine-name uname -r
除了使用 ssh
子命令在远程 Docker 主机上执行命令外,您还可以使用它登录机器本身。就像打字一样简单:
- docker-machine ssh machine-name
您的命令提示符将更改以反映您已登录到远程主机的事实:
Outputroot@machine-name#
要退出远程主机,请键入:
exit
第 7 步 — 激活 Dockerized 主机
激活 Docker 主机会将本地 Docker 客户端连接到该系统,这样就可以在远程系统上运行正常的 docker
命令。要激活 Docker 主机,请键入以下命令:
- eval $(docker-machine env machine-name)
或者,您可以使用以下命令激活它:
- docker-machine use machine-name
提示:使用多个 Docker 主机时,docker-machine use
命令是从一个主机切换到另一个主机的最简单方法。
输入上述任何命令后,您的 bash 提示符应更改为指示您的 Docker 客户端指向远程 Docker 主机。它将采用这种形式。主机的名称将在提示的末尾:
username@localmachine:~ [machine-name]$
现在,您在此命令提示符下键入的任何 docker
命令都将在该远程主机上执行。
如果主机在运行 docker-machine ls
命令的终端上处于活动状态,则 ACTIVE 列下的星号表示它是活动主机。
OutputNAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
ubuntu1604-docker * digitalocean Running tcp://203.0.113.71:2376 v18.05.0-ce
要从远程 Docker 主机退出,请键入以下内容:
docker-machine use -u
您将返回到本地系统的提示符。
现在让我们在远程机器上创建容器。
第 8 步 — 在远程 Dockerized 主机上创建 Docker 容器
到目前为止,您已经在您的 DigitalOcean 帐户上配置了一个 Dockerized Droplet 并激活了它——也就是说,您的 Docker 客户端指向它。下一个合乎逻辑的步骤是在其上启动容器。例如,让我们尝试运行官方 Nginx 容器。
使用 docker-machine use
选择您的远程机器:
- docker-machine use machine-name
现在执行此命令以在该机器上运行 Nginx 容器:
- docker run -d -p 8080:80 --name httpserver nginx
在此命令中,我们将 Nginx 容器中的端口 80
映射到 Dockerized 主机上的端口 8080
,以便我们可以从任何地方访问默认的 Nginx 页面。
如果命令成功执行,您将能够通过将 Web 浏览器指向 http://docker_machine_ip:8080
来访问默认的 Nginx 页面。
虽然 Docker 主机仍处于激活状态(如提示中的名称所示),但您应该能够列出该主机上的图像:
docker images
输出应该包括您刚刚使用的 Nginx 图像,以及您之前下载的其他图像:
OutputREPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest ae513a47849c 3 weeks ago 109MB
您还可以列出主机上活动或正在运行的容器:
- docker ps
如果您在此步骤中运行的 Nginx 容器是唯一活动的容器,则输出应如下所示:
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4284f9d25548 nginx "nginx -g 'daemon of…" 20 minutes ago Up 20 minutes 0.0.0.0:8080->80/tcp httpserver
要退出远程主机的提示,请键入。这也将关闭终端:
- exit
注意:如果你打算在远程机器上创建容器,你的 Docker 客户端必须指向它——也就是说,它必须是你正在使用的终端中的活动机器。否则,您将在本地计算机上创建容器。同样,让您的命令提示符成为您的向导。
第 9 步 — 禁用崩溃报告(可选)
默认情况下,每当尝试使用 Docker Machine 提供 Dockerized 主机失败或 Docker Machine 崩溃时,一些诊断信息会自动发送到 Bugsnag 上的 Docker 帐户。如果您对此不满意,可以通过在安装 .docker/machine
目录中创建一个名为 no-error-report
的空文件来禁用报告。
要创建文件,请键入:
- touch ~/.docker/machine/no-error-report
如果配置失败或 Docker Machine 崩溃,请检查文件中的错误消息。
结论
这是对安装和使用 Docker Machine 从一个本地系统远程配置多个 Docker Droplets 的介绍。现在,您应该能够根据需要在您的 DigitalOcean 帐户上快速配置尽可能多的 Dockerized 主机。
有关 Docker 机器的更多信息,请访问此 GitHub 页面。