介绍
Docker Machine 是一种工具,可以轻松地从您的个人计算机远程配置和管理多个 Docker 主机。 这样的服务器通常被称为 Dockerized 主机,当然可以用来运行 Docker 容器。
虽然 Docker Machine 可以安装在本地或远程系统上,但最常见的方法是将其安装在本地计算机(本机安装或虚拟机)上,并使用它来配置 Dockerized 远程服务器。
尽管 Docker Machine 可以安装在大多数 Linux 发行版以及 Mac OS X 和 Windows 上,但在本教程中,我们将把它安装在运行 CentOS 7 的本地计算机上,并使用它来配置 Dockerized DigitalOcean Droplets。
先决条件
要学习本教程,您将需要以下内容:
- 一台运行 CentOS 7 并安装了 Docker 的本地机器。 (请参阅 如何在 CentOS 7 上安装和使用 Docker 获取说明)
- DigitalOcean API 令牌。 如果您没有,请使用 this guide 生成它。 生成令牌时,请确保它具有读写范围。 这是默认设置,因此如果您在生成它时不更改任何选项,它将具有读写功能。 并且为了使其更易于在命令行上使用,请确保将令牌分配给该文章中给出的变量。
第 1 步 — 在本地计算机上安装 Docker 机器
在这一步中,我们将完成在运行 CentOS 7 的本地计算机上安装 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
将以下行复制并粘贴到该文件的末尾:
~/.bashrc
export PS1='[\u@\h \W$(__docker_machine_ps1 " [%s]")]\$ '
通过对您的 ~/.bashrc
文件进行此修改,当您激活一台机器时,它的名称将被插入到 shell 提示符中。
保存并关闭文件。
第二个脚本称为 docker-machine-wrapper.bash
。 它在 docker-machine
命令中添加了 use
子命令,可以轻松在 Dockerized Machines 之间切换。 要下载它,请键入
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
命令的命令完成现在应该可以工作了。 如果它不起作用,很可能是没有安装 bash-completion
包。 如果是这种情况,请使用以下命令安装它:
sudo yum install bash-completion
那应该解决它。
第 3 步 — 使用 Docker Machine 配置 Dockerized 主机
现在您已经在本地计算机上运行了 Docker 和 Docker Machine,您现在可以使用 Docker Machine 的 docker-machine create
命令在您的 DigitalOcean 帐户上配置 Dockerized Droplet。 如果您还没有这样做,请使用以下方法将您的 DigitalOcean API 令牌分配给 bash 变量:
export shell-variable=your-api-token
注意: 本教程使用 DOTOKEN 作为 DO API 令牌的 bash 变量。 变量名不必是 DOTOKEN,也不必全部大写。
要使变量永久化,请将其放入您的 ~/.bashrc
文件中。 此步骤是可选的,但如果您希望该值在终端会话中持续存在,则它是必需的。
nano ~/.bashrc
在任何地方添加与此类似的行:
~/.bashrcexport DOTOKEN=your-api-token
要在当前终端会话中激活变量,请键入:
source ~/.bashrc
要成功调用 docker-machine create
命令,您必须(至少)指定驱动程序、API 令牌(或对其求值的变量)和远程主机的唯一名称。 要创建您的第一个 Dockerized 主机,请键入:
docker-machine create --driver digitalocean --digitalocean-access-token $DOTOKEN machine-name
正在创建主机时的部分输出如下。 在此输出中,主机的名称是 centos-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 i up and running! To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env centos-docker
为新主机创建了一个 SSH 密钥对,以便 docker-machine
可以远程访问它。 Droplet 配备了所需的操作系统,并在系统上安装了 Docker。 命令完成后,您的 Docker Droplet 已启动并正在运行。
要从命令行查看新创建的主机,请键入:
docker-machine ls
输出应该与此类似:
OutputNAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS centos-docker - digitalocean Running tcp://203.0.113.71:2376 v18.05.0-ce
第 4 步 — 在创建 Dockerized 主机时指定基本操作系统
此步骤向您展示如何为使用 --digitalocean-image
标志创建的 Dockerized 主机指定基本操作系统和版本。
例如,要使用 CentOS 7 创建 Dockerized 主机,请键入:
docker-machine create --driver digitalocean --digitalocean-image centos-7-x64 --digitalocean-access-token $DOTOKEN machine-name
如果您想在您的服务器上运行 Debian 8 怎么办? 您将键入以下命令:
docker-machine create --driver digitalocean --digitalocean-image debian-8-x64 --digitalocean-access-token $DOTOKEN machine-name
默认情况下,使用 Docker Machine 创建 Dockerized 主机时使用的基本操作系统是 supposed 为最新版本(或 Ubuntu 的最新 LTS 版本)。 但是,在本文发布时,docker-machine create
命令仍然使用 Ubuntu 16.04 LTS 作为基本操作系统,尽管 Ubuntu 18.04 是最新的 LTS 版本。 因此,如果您需要运行 Ubuntu 18.04,则必须通过将 --digitalocean-image
标志传递给 docker-machine create
命令来指定 Ubuntu 以及所需的版本:
docker-machine create --driver digitalocean --digitalocean-image ubuntu-18-04-x64 --digitalocean-access-token $DOTOKEN machine-name
基本操作系统不是您唯一的选择。 您还可以指定 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 机器的所有标志,请键入:
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 发行版的版本:
Output{ "ConfigVersion": 3, "Driver": { "IPAddress": "203.0.113.71", "MachineName": "centos-docker", "SSHUser": "root", "SSHPort": 22, ... "Image": "centos-7-0-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 centos-docker digitalocean Timeout
重新开始:
docker-machine start machine-name
验证它是否已启动:
docker-machine ls
您将看到 STATE
现在为主机设置了 Running
:
OuputNAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS centos-docker - digitalocean Running tcp://203.0.113.71:2376 v18.05.0-ce
最后,如果要删除主机:
docker-machine rm machine-name
第 6 步 — 通过 SSH 在 Dockerized 主机上执行命令
此时,您已经获得了有关主机的信息,但您可以做的还不止这些。 例如,您可以在本地系统中使用 docker-machine
的 ssh
子命令在 Docker 主机上执行本机 Linux 命令。 本节介绍如何通过 docker-machine
执行 ssh
命令,以及如何打开与 Dockerized 主机的 SSH 会话。
假设您已经配置了一个使用 CentOS 作为操作系统的主机,请从本地系统执行以下命令来更新 Docker 主机上的软件包:
docker-machine ssh machine-name yum update
不确定您的远程 Docker 主机使用的是什么内核? 键入以下内容:
docker-machine ssh machine-name uname -r
除了使用 ssh
子命令在远程 Docker 主机上执行命令外,您还可以使用它来登录 Dockerized 主机本身。 这就像输入一样简单:
docker-machine ssh machine-name
您的命令提示符将更改以反映您已登录到远程主机的事实:
root@machine-name#
要退出远程主机,请键入:
exit
第 7 步 — 激活 Dockerized 主机
激活 Docker 主机将本地 Docker 客户端连接到该系统,这样就可以在远程系统上运行正常的 docker
命令。 要激活 Docker 主机,请键入以下命令:
eval $(docker-machine env machine-name)
或者,您可以使用以下命令激活它:
docker-machine use machine-name
Tip 使用多个 Docker 主机时,docker-machine use
命令是从一个切换到另一个的最简单方法。
键入上述任何命令后,您的 bash 提示符应更改以指示您的 Docker 客户端指向远程 Docker 主机。 它将采取这种形式。 主机名将在提示符的末尾:
username@localmachine:~ [machine-name]$
现在,您在此命令提示符下键入的任何 docker
命令都将在该远程主机上执行。
如果主机在运行docker-machine ls
命令的终端上处于活动状态,则ACTIVE列下的星号表示它是活动的。
Output NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS centos-docker * digitalocean Running tcp://203.0.113.71:2376 v18.05.0-ce
注意: 当主机处于活动状态时,您在正在使用的终端上键入的任何 docker
命令都将在远程主机上执行。 但是,所有正常的 Linux 命令都在本地计算机上执行。
要退出远程 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
。 这也将关闭终端:
exit
提示: 如果你打算在远程主机上创建容器,你的 Docker 客户端 必须 指向它——也就是说,它必须是你所在终端中的活动主机使用。 否则,您将在本地计算机上创建容器。 让您的命令提示符成为您的向导。
第 9 步 — 禁用崩溃报告(可选)
默认情况下,每当尝试使用 Docker Machine 配置 Dockerized 主机失败或 Docker Machine 崩溃时,一些诊断信息会自动发送到 Bugsnag 上的 Docker 帐户。 如果您对此不满意,可以通过在安装 .docker/machine
目录下创建一个名为 no-error-report
的空文件来禁用报告。
为此,只需键入:
touch ~/.docker/machine/no-error-report
如果配置失败或 Docker 机器崩溃,请检查文件中的错误消息。
结论
这是对安装和使用 Docker Machine 从一个本地系统远程配置多个 Docker Droplet 的介绍。 现在,您应该能够根据需要在您的 DigitalOcean 帐户上快速配置尽可能多的 Dockerized 主机。
有关 Docker Machines 的更多信息,请访问 官方文档页面 。 本教程下载的三个 bash 脚本托管在 这个 GitHub 页面 上。