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

介绍

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 代币. 如果您没有一个,请使用 此指南生成它。 当您生成代币时,请确保它具有读写范围。 这是默认的,所以如果您在生成时不改变任何选项,它将具有读写功能。 为了使它在命令行上更容易使用,请确保将代币分配给该条文中所述的变量。( )

步骤 1 — 在本地计算机上安装 Docker 机器

在此步骤中,我们将通过在运行CentOS 7的本地计算机上安装Docker Machine的过程进行工作。

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

1wget https://github.com/docker/machine/releases/download/v0.14.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.14.0, build 89b8332

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

Docker Machine GitHub 存储库中有三个 bash 脚本,旨在方便使用dockerdocker-machine命令,它们提供命令完成和 bash-prompt 定制。

在此步骤中,我们将将三个脚本安装在您的本地机器上. 它们将下载并安装到 /etc/bash_completion.d 目录中。

第一个脚本允许您在 bash 提示中看到活跃的机器。当您与多个 Dockerized 机器一起工作和切换时,这很方便。该脚本被称为docker-machine-prompt.bash。

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 变量设置自定义值,因此使用 nano 打开它(PS1 是一个用于修改 bash 命令提示的特殊壳变量):

1nano ~/.bashrc

复制并粘贴该文件末尾的下一个行:

1[label ~/.bashrc]
2export PS1='[\u@\h \W$(__docker_machine_ps1 " [%s]")]\$ '

通过对您的 ~/.bashrc 文件进行此更改,当您激活机器时,其名称将被插入壳提示。

保存并关闭文件。

第二个脚本名为docker-machine-wrapper.bash。它将一个使用子命令添加到docker-machine命令中,使其易于在 Dockerized Machines 之间切换。

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命令的完成命令现在应该起作用。如果它不起作用,则很可能没有安装bash-completion包。如果是这样的情况,请使用:

1sudo yum install bash-completion

这应该纠正。

步骤 3 — 使用 Docker 机器提供 Docker 主机

现在你已经在本地机器上运行了 Docker 和 Docker Machine,你现在可以使用 Docker Machine 的docker-machine create 命令在你的 DigitalOcean 帐户上提供 Dockerized Droplet。

1export shell-variable=your-api-token

<$>[注] **注:**本教程使用 DOTOKEN 作为 DO API 代币的 bash 变量。

要使变量永久,请将其放入您的 ~/.bashrc 文件中. 此步骤是可选的,但如果您希望该值在终端会话中继续存在,则是必要的。

1nano ~/.bashrc

在任何地方添加类似的行:

1[secondary_label ~/.bashrc]
2export DOTOKEN=your-api-token

要在当前终端会话中激活变量,键入:

1source ~/.bashrc

要成功调用docker-machine create命令,您必须指定(至少)驱动程序、API代码(或对其进行评估的变量),以及远程主机的唯一名称。

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

当主机被创建时的部分输出如下:在这个输出中,主机的名称是centos-docker:

 1[secondary_label Output]
 2
 3 ...
 4
 5Installing Docker...
 6Copying certs to the local machine directory...
 7Copying certs to the remote machine...
 8Setting Docker configuration on the remote daemon...
 9Checking connection to Docker...
10Docker i up and running!
11To 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 安装在系统上。

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

1docker-machine ls

结果应该是这样的:

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

步骤 4 — 在创建 Dockerized 主机时指定 Base OS

此步骤将向您展示如何指定正在使用--digitalocean-image旗帜创建的 Dockerized 主机的基本操作系统和版本。

例如,若要使用 CentOS 7 创建一个 Dockerized 主机,请键入:

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

如果你想在你的服务器上运行 Debian 8,你会输入以下命令:

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

默认情况下,在使用 Docker Machine 创建 Dockerized 主机时使用的基本操作系统是最新版本(或 Ubuntu 的最新 LTS 版本)。然而,在这个发布时,docker-machine create命令仍然使用 Ubuntu 16.04 LTS 作为基本操作系统,尽管 Ubuntu 18.04 是最新 LTS 版本。

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

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

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

1docker-machine create --driver digitalocean -h

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

步骤 5 — 执行其他 Docker 机器命令

您已经看到如何使用创建子命令提供一个 Dockerized 主机,您还看到如何使用ls子命令列出可用于 Docker Machine 的主机,在此步骤中,您将了解其他一些docker-machine子命令。

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

1docker-machine inspect machine-name

输出应该包含这样的行. Image 行揭示了所使用的 Linux 发行版的版本:

 1[secondary_label Output]
 2{
 3    "ConfigVersion": 3,
 4    "Driver": {
 5        "IPAddress": "203.0.113.71",
 6        "MachineName": "centos-docker",
 7        "SSHUser": "root",
 8        "SSHPort": 22,
 9        ...
10        "Image": "centos-7-0-x64",
11        "Size": "s-1vcpu-1gb",
12        ...
13    },
14
15---

要打印一个主机的连接配置,键入:

1docker-machine config machine-name

结果应该是这样的:

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 machine-name

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

1docker-machine stop machine-name

检查它是否被阻止。

1docker-machine ls

主持人的身份发生了变化:

1[secondary_label Ouput]
2NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
3centos-docker digitalocean Timeout

要重新开始:

1docker-machine start machine-name

检查是否已启动:

1docker-machine ls

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

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

最后,如果你想删除一个主机:

1docker-machine rm machine-name

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

例如,您可以在 Docker 主机上执行本地 Linux 命令,通过从本地系统中使用docker-machinessh子命令。

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

1docker-machine ssh machine-name yum update

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

1docker-machine ssh machine-name uname -r

除了使用ssh子命令在远程 Docker 主机上执行命令外,您还可以使用它来登录 Dockerized 主机本身。

1docker-machine ssh machine-name

您的命令提示将更改以反映您已登录到远程主机的事实:

1root@machine-name#

要离开远程主机,键入:

1exit

步骤 7 – 激活 Dockerized 主机

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

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

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

1docker-machine use machine-name

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

在输入上述任何一个命令后,您的 bash 提示应更改,以表明您的 Docker 客户端指向远程 Docker 主机。

1username@localmachine:~ [machine-name]$

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

如果主机在运行docker-machine ls命令的终端上是活跃的,则 ACTIVE列下的星座显示它是活跃的。

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

<$>[注] **注:**当主机活跃时,您在使用的终端上输入的任何docker命令都会在远程主机上执行。

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

1docker-machine use -u

您将被返回您的本地系统的提示。

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

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

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

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

1docker-machine use machine-name

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

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

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

如果命令成功执行,您将能够通过指向您的 Web 浏览器到 http://docker_machine_ip:8080来访问默认的 Nginx 页面。

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

1docker images

输出应该包括您刚刚使用的 Nginx 图像,以及您之前下载的其他图像:

1[secondary_label Output]
2REPOSITORY TAG IMAGE ID CREATED SIZE
3nginx latest ae513a47849c 3 weeks ago 109MB

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

1docker ps

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

1[secondary_label Output]
2CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
34284f9d25548 nginx               "nginx -g 'daemon of…"   20 minutes ago Up 20 minutes 0.0.0.0:8080->80/tcp httpserver

要退出远程主机的提示,请键入退出,这也会关闭终端:

1exit

<$>[注] 提示: 如果您打算在远程主机上创建容器,您的Docker客户端必须指向它 - 也就是说,它必须是您正在使用的终端中的活跃主机。

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

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

要做到这一点,简单的类型:

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

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

结论

这是安装和使用Docker Machine从一个本地系统远程提供多个Docker Droplets的介绍,现在您应该能够在您的DigitalOcean帐户上快速提供您需要的尽可能多的Dockerized主机。

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

Published At
Categories with 技术
Tagged with
comments powered by Disqus