如何在Ubuntu18.04上使用DockerMachine配置和管理远程Docker主机
介绍
Docker Machine 是一种工具,可以轻松地从您的个人计算机远程配置和管理多个 Docker 主机。 此类服务器通常称为 Dockerized 主机,用于运行 Docker 容器。
虽然 Docker Machine 可以安装在本地或远程系统上,但最常见的方法是将其安装在本地计算机(本机安装或虚拟机)上,并使用它来配置 Dockerized 远程服务器。
尽管 Docker Machine 可以安装在大多数 Linux 发行版以及 macOS 和 Windows 上,但在本教程中,您将在运行 Ubuntu 18.04 的本地计算机上安装它,并使用它来配置 Dockerized DigitalOcean Droplets。 如果您没有本地 Ubuntu 18.04 机器,则可以在任何 Ubuntu 18.04 服务器上按照这些说明进行操作。
先决条件
要学习本教程,您将需要以下内容:
- 运行 Ubuntu 18.04 并安装了 Docker 的本地机器或服务器。 有关说明,请参阅 如何在 Ubuntu 18.04 上安装和使用 Docker。
- DigitalOcean API 令牌。 如果您没有,请使用 this guide 生成它。 生成令牌时,请确保它具有读写范围。 这是默认设置,因此如果您在生成它时不更改任何选项,它将具有读写功能。
第 1 步 — 安装 Docker 机器
为了使用 Docker Machine,您必须首先在本地安装它。 在 Ubuntu 上,这意味着从 GitHub 上的官方 Docker 存储库下载少量脚本。
要下载并安装 Docker Machine 二进制文件,请键入:
wget https://github.com/docker/machine/releases/download/v0.15.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.15.0, build b48dc28d
Docker 机器已安装。 让我们安装一些额外的帮助工具来使 Docker Machine 更易于使用。
第 2 步 — 安装额外的 Docker 机器脚本
您可以在 Docker Machine GitHub 存储库中安装三个 Bash 脚本,以便更轻松地使用 docker
和 docker-machine
命令。 安装后,这些脚本提供命令完成和提示自定义。
在这一步中,您将通过直接从 Docker Machine GitHub 存储库下载这三个脚本,将它们安装到本地计算机上的 /etc/bash_completion.d
目录中。
注意:在从 Internet 下载并安装脚本到系统范围的位置之前,您应该首先通过在浏览器中查看源 URL 来检查脚本的内容。
第一个脚本允许您在提示符中查看活动机器。 当您在多台 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
变量的值。 PS1
变量是一个特殊的 shell 变量,用于修改 Bash 命令提示符。 在编辑器中打开 ~/.bashrc
:
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 主机之间切换变得更加容易。 要下载它,请键入:
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
命令的命令完成。
让我们通过使用 Docker Machine 创建一个新的 Docker 主机来测试一下。
第 3 步 — 使用 Docker Machine 配置 Dockerized 主机
现在您已经在本地机器上运行了 Docker 和 Docker Machine,您可以使用 Docker Machine 的 docker-machine create
命令在您的 DigitalOcean 帐户上配置 Dockerized Droplet。 如果您还没有这样做,请将您的 DigitalOcean API 令牌分配给环境变量:
export DOTOKEN=your-api-token
注意: 本教程使用 DOTOKEN 作为 DO API 令牌的 bash 变量。 变量名不必是 DOTOKEN,也不必全部大写。
要使变量永久化,请将其放入您的 ~/.bashrc
文件中。 此步骤是可选的,但如果您希望该值在 shell 会话中持续存在,则它是必需的。
使用 nano
打开该文件:
nano ~/.bashrc
将此行添加到文件中:
~/.bashrc
export DOTOKEN=your-api-token
要在当前终端会话中激活变量,请键入:
source ~/.bashrc
要成功调用 docker-machine create
命令,您必须指定要使用的 驱动程序 以及机器名称。 驱动程序是您要创建的基础设施的适配器。 有云基础设施提供商的驱动程序,以及各种虚拟化平台的驱动程序。
我们将使用 digitalocean
驱动程序。 根据您选择的驱动程序,您需要提供其他选项来创建机器。 digitalocean
驱动程序需要 API 令牌(或对其求值的变量)作为其参数,以及您要创建的机器的名称。
要创建您的第一台机器,请输入以下命令以创建名为 docker-01
的 DigitalOcean Droplet:
docker-machine create --driver digitalocean --digitalocean-access-token $DOTOKEN docker-01
当 Docker Machine 创建 Droplet 时,您将看到以下输出:
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 ubuntu1804-docker
Docker Machine 为新主机创建一个 SSH 密钥对,以便它可以远程访问服务器。 Droplet 配备了操作系统并安装了 Docker。 命令完成后,您的 Docker Droplet 已启动并正在运行。
要从命令行查看新创建的机器,请键入:
docker-machine ls
输出将与此类似,表明新的 Docker 主机正在运行:
OutputNAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS docker-01 - digitalocean Running tcp://209.97.155.178:2376 v18.06.1-ce
现在让我们看看在创建机器时如何指定操作系统。
第 4 步 — 在创建 Dockerized 主机时指定基本操作系统和 Droplet 选项
默认情况下,使用 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 docker-ubuntu-1804
您不仅限于某个版本的 Ubuntu。 您可以使用 DigitalOcean 支持的任何操作系统来创建机器。 例如,要使用 Debian 8 创建机器,请输入:
docker-machine create --driver digitalocean --digitalocean-image debian-8-x64 --digitalocean-access-token $DOTOKEN docker-debian
要使用 CentOS 7 作为基本操作系统来配置 Dockerized 主机,请将 centos-7-0-x86
指定为映像名称,如下所示:
docker-machine create --driver digitalocean --digitalocean-image centos-7-0-x64 --digitalocean-access-token $DOTOKEN docker-centos7
基本操作系统不是您唯一的选择。 您还可以指定 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 docker-03
要查看特定于使用 DigitalOcean 驱动程序创建 Docker 机器的所有标志,请键入:
docker-machine create --driver digitalocean -h
提示: 如果刷新 DigitalOcean 仪表板的 Droplet 页面,您将看到使用 docker-machine
命令创建的新机器。
现在让我们探索一些其他 Docker Machine 命令。
第 5 步 — 执行其他 Docker 机器命令
您已经了解了如何使用 create
子命令配置 Dockerized 主机,以及如何使用 ls
子命令列出 Docker Machine 可用的主机。 在这一步中,您将学习一些更有用的子命令。
要获取有关 Dockerized 主机的详细信息,请使用 inspect
子命令,如下所示:
docker-machine inspect docker-01
输出包括类似于以下输出中的行。 Image
行显示使用的 Linux 发行版的版本,Size
行表示大小 slug:
Output... { "ConfigVersion": 3, "Driver": { "IPAddress": "203.0.113.71", "MachineName": "docker-01", "SSHUser": "root", "SSHPort": 22, ... "Image": "ubuntu-16-04-x64", "Size": "s-1vcpu-1gb", ... }, ---
要打印主机的连接配置,请键入:
docker-machine config docker-01
输出将与此类似:
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 docker-01
如果需要关闭远程主机,可以使用 docker-machine
来停止它:
docker-machine stop docker-01
验证它是否已停止:
docker-machine ls
输出显示机器的状态发生了变化:
OuputNAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS docker-01 - digitalocean Stopped Unknown
要再次启动它,请使用 start
子命令:
docker-machine start docker-01
然后再次查看其状态:
docker-machine ls
您将看到 STATE
现在为主机设置了 Running
:
OuputNAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS docker-01 - digitalocean Running tcp://203.0.113.71:2376 v18.06.1-ce
接下来让我们看看如何使用 SSH 与远程主机进行交互。
第 6 步 — 通过 SSH 在 Dockerized 主机上执行命令
此时,您已经获得了有关您的机器的信息,但您可以做的还不止这些。 例如,您可以在本地系统中使用 docker-machine
的 ssh
子命令在 Docker 主机上执行本机 Linux 命令。 本节介绍如何通过 docker-machine
执行 ssh
命令,以及如何打开与 Dockerized 主机的 SSH 会话。
假设您已经配置了一台使用 Ubuntu 作为操作系统的机器,请从本地系统执行以下命令来更新 Docker 主机上的包数据库:
docker-machine ssh docker-01 apt-get update
您甚至可以使用以下方法应用可用更新:
docker-machine ssh docker-01 apt-get upgrade
不确定您的远程 Docker 主机使用的是什么内核? 键入以下内容:
docker-machine ssh docker-01 uname -r
最后,您可以使用docker machine ssh
命令登录远程主机:
docker-machine ssh docker-01
您将以 root 用户身份登录,您将看到类似于以下内容的内容:
Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-131-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage Get cloud support with Ubuntu Advantage Cloud Guest: http://www.ubuntu.com/business/services/cloud 14 packages can be updated. 10 updates are security updates.
通过键入 exit
退出以返回到本地计算机。
接下来,我们将把 Docker 的命令指向我们的远程主机。
第 7 步 — 激活 Dockerized 主机
激活 Docker 主机将本地 Docker 客户端连接到该系统,这样就可以在远程系统上运行正常的 docker
命令。
首先,使用 Docker Machine 使用 Ubuntu 18.04 创建一个名为 docker-ubuntu
的新 Docker 主机:
docker-machine create --driver digitalocean --digitalocean-image ubuntu-18-04-x64 --digitalocean-access-token $DOTOKEN docker-ubuntu
要激活 Docker 主机,请键入以下命令:
eval $(docker-machine env machine-name)
或者,您可以使用以下命令激活它:
docker-machine use machine-name
提示: 使用多个 Docker 主机时,docker-machine use
命令是从一个切换到另一个的最简单方法。
键入任何这些命令后,您的提示将更改以指示您的 Docker 客户端指向远程 Docker 主机。 它将采取这种形式。 主机名将在提示符的末尾:
username@localmachine:~ [docker-01]$
现在,您在此命令提示符下键入的任何 docker
命令都将在该远程主机上执行。
再次执行docker-machine ls
:
docker-machine ls
您将在 docker-01
的 ACTIVE
列下看到一个星号:
OutputNAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS docker-01 * digitalocean Running tcp://203.0.113.71:2376 v18.06.1-ce
要退出远程 Docker 主机,请键入以下内容:
docker-machine use -u
您的提示将不再显示活动主机。
现在让我们在远程机器上创建容器。
第 8 步 — 在远程 Dockerized 主机上创建 Docker 容器
到目前为止,您已经在您的 DigitalOcean 帐户上配置了一个 Dockerized Droplet,并且您已经激活了它——也就是说,您的 Docker 客户端指向它。 下一个合乎逻辑的步骤是在其上启动容器。 例如,让我们尝试运行官方的 Nginx 容器。
使用 docker-machine use
选择您的远程机器:
docker-machine use docker-01
现在执行此命令以在该机器上运行 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 71c43202b8ac 3 hours ago 109MB
您还可以列出主机上的活动或正在运行的容器:
docker ps
如果您在此步骤中运行的 Nginx 容器是唯一的活动容器,则输出将如下所示:
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d3064c237372 nginx "nginx -g 'daemon of…" About a minute ago Up About a minute 0.0.0.0:8080->80/tcp httpserver
如果您打算在远程机器上创建容器,您的 Docker 客户端必须指向它——也就是说,它必须是您正在使用的终端中的活动机器。 否则,您将在本地计算机上创建容器。 同样,让您的命令提示符成为您的指南。
Docker Machine 可以创建和管理远程主机,也可以删除它们。
第 9 步 - 删除 Docker 主机
您可以使用 Docker Machine 删除您创建的 Docker 主机。 使用 docker-machine rm
命令删除您创建的 docker-01
主机:
docker-machine rm docker-01
Droplet 连同为其创建的 SSH 密钥一起被删除。 再次列出主机:
docker-machine ls
这一次,您不会在输出中看到 docker-01
主机。 如果您只创建了一台主机,您将根本看不到任何输出。
请务必执行命令 docker-machine use -u
将本地 Docker 守护进程指向本地计算机。
第 10 步 — 禁用崩溃报告(可选)
默认情况下,每当尝试使用 Docker Machine 配置 Dockerized 主机失败或 Docker Machine 崩溃时,都会将一些诊断信息发送到 Bugsnag 上的 Docker 帐户。 如果您对此不满意,可以通过在本地计算机的 .docker/machine
目录中创建一个名为 no-error-report
的空文件来禁用报告。
要创建文件,请键入:
touch ~/.docker/machine/no-error-report
如果配置失败或 Docker 机器崩溃,请检查文件中的错误消息。
结论
您已安装 Docker Machine 并使用它从本地系统远程配置 DigitalOcean 上的多个 Docker 主机。 从这里您应该能够根据需要在您的 DigitalOcean 帐户上配置尽可能多的 Dockerized 主机。
有关 Docker Machine 的更多信息,请访问 官方文档页面 。 本教程中下载的三个 Bash 脚本托管在 这个 GitHub 页面 上。