介绍
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 令牌。 如果您没有,请使用 this guide 生成它。 生成令牌时,请确保它具有读写范围。 这是默认设置,因此如果您在生成它时不更改任何选项,它将具有读写功能。 为了使其更易于在命令行上使用,请确保将令牌分配给该文章中给出的变量。
第 1 步 — 在本地计算机上安装 Docker 机器
在这一步中,我们将完成在运行 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 开头。 它们应该是这样的:
~/.bashrc
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]")
以便它们读取:
~/.bashrc
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
。 它在 docker-machine
命令中添加了 use
子命令,方便在 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
在任何地方添加与此类似的行:
~/.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-machine create
命令来指定 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 机器的所有标志,请键入:
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 行表示大小块:
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 机器崩溃,请检查文件中的错误消息。
结论
这是对安装和使用 Docker Machine 从一个本地系统远程配置多个 Docker Droplet 的介绍。 现在,您应该能够根据需要在您的 DigitalOcean 帐户上快速配置尽可能多的 Dockerized 主机。
有关 Docker Machines 的更多信息,请访问 官方文档页面 。 本教程中下载的三个 Bash 脚本托管在 这个 GitHub 页面 上。