如何在 Ubuntu 18.04 上使用 Docker Machine 配置和管理远程 Docker 主机

介绍

Docker Machine是一种工具,可以轻松从您的个人计算机远程提供和管理多个Docker主机,这些服务器通常被称为Docker化主机,用于运行Docker容器。

虽然 Docker Machine 可以安装在本地或远程系统上,但最常见的方法是将其安装在本地计算机上(本地安装或虚拟机),并使用它来提供 Dockerized 远程服务器。

虽然Docker Machine可以安装在大多数Linux发行版以及macOS和Windows上,但在本教程中,您将将其安装在运行Ubuntu 18.04的本地机器上,并使用它来提供Dockerized DigitalOcean Droplets。

前提条件

要遵循本教程,您将需要以下内容:

  • 运行 Ubuntu 18.04 的本地机器或服务器安装了 Docker. 请参阅 如何在 Ubuntu 18.04 上安装和使用 Docker以获取说明
  • 一个 DigitalOcean API 代币. 如果您没有一个,请使用 本指南生成它。 当您生成代币时,请确保它具有读写范围。 这是默认的,所以如果您在生成时不改变任何选项,它将具有读写功能

步骤 1 – 安装 Docker 机器

在Ubuntu上,这意味着从GitHub的官方Docker存储库下载一小部分脚本。

要下载和安装 Docker Machine 二进制,键入:

1wget https://github.com/docker/machine/releases/download/v0.15.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.15.0, build b48dc28d

安装了 Docker Machine. 让我们安装一些额外的辅助工具来使 Docker Machine 更容易工作。

步骤 2 — 安装额外的 Docker 机器脚本

Docker Machine GitHub 存储库中有三个 Bash 脚本,您可以安装,以便更轻松地使用dockerdocker-machine命令。

在此步骤中,您将将这些三种脚本安装到本地机器上的 `/etc/bash_completion.d 目录中,直接从 Docker Machine GitHub 存储库下载。

<$>[注] :在从整个系统位置下载和安装一个脚本之前,您应该首先检查脚本的内容,通过查看浏览器中的源URL。

第一个脚本允许您在提示中查看正在运行的机器,这在您与多个 Dockerized 机器之间工作和切换时非常有用。

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 变量值. 该 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
 4...
 5
 6PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
 7
 8...
 9
10PS1="\[\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
 4...
 5
 6PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w$(__docker_machine_ps1 " [%s]")\$ '
 7
 8...
 9
10PS1="\[\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 登录到机器,请退出会话并再次登录,您将完成dockerdocker-machine命令。

让我们通过使用Docker Machine创建一个新的Docker主机来测试事情。

步骤 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命令,您必须指定您想要使用的 driver 以及机器名称。该驱动程序是您要创建的基础设施的适配器。

我们将使用digitalocean驱动程序. 根据您选择的驱动程序,您需要提供额外的选项来创建机器. digitalocean驱动程序需要API代码(或对其进行评估的变量)作为其论点,以及您想要创建的机器的名称。

要创建你的第一台机器,输入此命令来创建一个名为docker-01的DigitalOcean Droplet:

1docker-machine create --driver digitalocean --digitalocean-access-token $DOTOKEN docker-01

您将看到此输出,当Docker Machine创建Droplet时:

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 ubuntu1804-docker

Docker Machine为新主机创建一个 SSH 密钥对,以便它可以远程访问服务器。Droplet 配备了操作系统,并且安装了 Docker。

要从命令行查看新创建的机器,键入:

1docker-machine ls

输出将类似于此,表示新 Docker 主机正在运行:

1[secondary_label Output]
2NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
3docker-01   -        digitalocean Running tcp://209.97.155.178:2376 v18.06.1-ce

现在让我们看看如何在创建机器时指定操作系统。

步骤 4 — 在创建 Dockerized 主机时指定 Base OS 和 Droplet 选项

默认情况下,在使用 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 docker-ubuntu-1804

您不局限于 Ubuntu 的版本,您可以使用 DigitalOcean 支持的任何操作系统创建机器,例如,要使用 Debian 8 创建机器,请键入:

1docker-machine create --driver digitalocean --digitalocean-image debian-8-x64 --digitalocean-access-token $DOTOKEN docker-debian

若要提供使用 CentOS 7 作为基本操作系统的 Dockerized 主机,请指定 centos-7-0-x86 作为图像名称,如下:

1docker-machine create --driver digitalocean --digitalocean-image centos-7-0-x64 --digitalocean-access-token $DOTOKEN docker-centos7

基本操作系统不是你唯一的选择,你也可以指定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 docker-03

若要查看使用 DigitalOcean 驱动程序创建 Docker 机器的所有标志,请键入:

1docker-machine create --driver digitalocean -h

<$>[注] 提示: 如果您更新您的DigitalOcean仪表板的Droplet页面,您将看到您使用docker-machine命令创建的新机器。

现在让我们探索其他一些Docker机器命令。

步骤 5 — 执行额外的 Docker 机器命令

您已经看到如何使用创建子命令提供一个 Dockerized 主机,以及如何使用ls子命令列出可用于 Docker Machine 的主机。

要获取有关 Dockerized 主机的详细信息,请使用inspect子命令,如下:

1docker-machine inspect docker-01

输出包含类似以下输出中的行,Image行显示了使用的 Linux 发行版的版本,而Size行表示了尺寸的缩小:

 1[secondary_label Output]
 2...
 3{
 4    "ConfigVersion": 3,
 5    "Driver": {
 6        "IPAddress": "203.0.113.71",
 7        "MachineName": "docker-01",
 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 docker-01

结果将类似于此:

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 docker-01

如果您需要下载远程主机,您可以使用docker-machine来阻止它:

1docker-machine stop docker-01

检查它是否被阻止:

1docker-machine ls

输出显示机器的状态发生了变化:

1[secondary_label Ouput]
2NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
3docker-01   -        digitalocean Stopped Unknown

要重新启动,请使用开始子命令:

1docker-machine start docker-01

然后再来看看它的状态:

1docker-machine ls

您将看到状态现在为主机设置为运行:

1[secondary_label Ouput]
2NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
3
4docker-01           -        digitalocean Running tcp://203.0.113.71:2376 v18.06.1-ce

接下来,让我们看看如何使用SSH与远程主机进行交互。

步骤 6 — 通过 SSH 在 Dockerized 主机上执行命令

例如,您可以在 Docker 主机上执行本地 Linux 命令,使用本地系统的「docker-machine」的「ssh」子命令。

假设您已经配置了 Ubuntu 作为操作系统的机器,请从本地系统执行以下命令,以更新 Docker 主机上的包数据库:

1docker-machine ssh docker-01 apt-get update

您甚至可以使用可用的更新:

1docker-machine ssh docker-01 apt-get upgrade

您不确定远程 Docker 主机正在使用哪个内核?请输入以下内容:

1docker-machine ssh docker-01 uname -r

最后,您可以使用docker machine ssh命令登录远程主机:

1docker-machine ssh docker-01

您将登录为 root用户,您将看到类似于以下的东西:

 1[environment second]
 2Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-131-generic x86_64)
 3
 4 * Documentation:  https://help.ubuntu.com
 5 * Management:     https://landscape.canonical.com
 6 * Support:        https://ubuntu.com/advantage
 7
 8  Get cloud support with Ubuntu Advantage Cloud Guest:
 9    http://www.ubuntu.com/business/services/cloud
10
1114 packages can be updated.
1210 updates are security updates.

通过键入退出退出,返回您的本地机器。

接下来,我们将将 Docker 命令导向我们的远程主机。

步骤 7 – 激活 Dockerized 主机

激活 Docker 主机将本地 Docker 客户端连接到该系统,从而在远程系统上运行正常的docker命令。

首先,使用 Docker Machine 创建一个名为docker-ubuntu的新 Docker 主机,使用 Ubuntu 18.04:

1docker-machine create --driver digitalocean --digitalocean-image ubuntu-18-04-x64 --digitalocean-access-token $DOTOKEN docker-ubuntu

要激活 Docker 主机,请输入以下命令:

1eval $(docker-machine env machine-name)

或者,您可以使用这个命令来激活它:

1docker-machine use machine-name

<$>[注] **提示:**在使用多个Docker主机时,使用docker-machine use命令是从一个到另一个最简单的切换方法。

输入这些命令后,您的提示将更改,表示您的 Docker 客户端指向远程 Docker 主机。

1username@localmachine:~ [docker-01]$

现在,您在这个命令提示中输入的任何docker命令都会在该远程主机上执行。

再次执行docker-machine ls:

1docker-machine ls

你会看到一个星座在Docker-01ACTIVE列下方:

1[secondary_label Output]
2NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
3docker-01           *        digitalocean Running tcp://203.0.113.71:2376 v18.06.1-ce

若要退出远程 Docker 主机,请键入以下内容:

1docker-machine use -u

您的提示将不再显示活跃的主机。

现在让我们在远程机器上创建容器。

步骤 8 — 在远程 Docker 主机上创建 Docker 容器

到目前为止,您已在您的 DigitalOcean 帐户中配置了 Dockerized Droplet,并且已激活它,也就是说,您的 Docker 客户端正在指向它。

使用docker-machine use来选择您的远程机器:

1docker-machine use docker-01

现在执行此命令在该机器上运行 Nginx 容器:

1docker run -d -p 8080:80 --name httpserver nginx

在这个命令中,我们将 Nginx 容器中的端口80地图到 Dockerized 主机上的端口8080,以便我们可以从任何地方访问默认的 Nginx 页面。

一旦集装箱建成,您将能够访问默认的 Nginx 页面,将您的 Web 浏览器指向 http://docker_machine_ip:8080

虽然 Docker 主机仍然处于激活状态(如提示中的名称所示),但您可以列出该主机上的图像:

1docker images

输出包括你刚刚使用的 Nginx 图像:

1[secondary_label Output]
2REPOSITORY TAG IMAGE ID CREATED SIZE
3nginx latest 71c43202b8ac 3 hours ago 109MB

您还可以列出主机上正在运行的或正在运行的容器:

1docker ps

如果您在这个步骤中运行的 Nginx 容器是唯一活跃的容器,则输出将是这样的:

1[secondary_label Output]
2CONTAINER ID IMAGE COMMAND CREATED STATUS
3 PORTS NAMES
4d3064c237372 nginx               "nginx -g 'daemon of…"   About a minute ago Up About a minute
5 0.0.0.0:8080->80/tcp httpserver

如果您打算在远程机器上创建容器,您的Docker客户端必须指向它,也就是说,它必须是您正在使用的终端中的活跃机器。

Docker Machine 可以创建和管理远程主机,也可以删除它们。

步骤 9 – 删除 Docker 主机

您可以使用 Docker Machine 删除您创建的 Docker 主机. 使用docker-machine rm命令删除您创建的docker-01主机:

1docker-machine rm docker-01

Droplet 被删除,以及为其创建的 SSH 密钥,再次列出主机:

1docker-machine ls

这一次,您将不会看到输出中列出的docker-01主机,如果您只创建了一个主机,则不会看到任何输出。

请确保执行docker-machine use -u命令,将您的本地Docker大象指向本地机器。

步骤 10 – 禁用事故报告(可选)

默认情况下,每当尝试使用 Docker Machine 提供 Docker 主机失败或 Docker Machine 失败时,会发送某些诊断信息到 Bugsnag上的 Docker 帐户。

要创建文件,键入:

1touch ~/.docker/machine/no-error-report

检查文件的错误消息,如果提供失败或Docker Machine崩溃。

结论

您已经安装了 Docker Machine,并使用它从本地系统远程提供多台Docker托管器在DigitalOcean上,从这里开始,您应该能够在DigitalOcean帐户上提供所需的多台Docker化托管器。

有关 Docker Machine 的更多信息,请访问 官方文档页面。本教程中下载的三个 Bash 脚本在 GitHub 页面托管。

Published At
Categories with 技术
comments powered by Disqus