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

介绍

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

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

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

前提条件

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

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

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

要下载和安装 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

在该文件中,有三个开始于 PS1的行,它们应该是这样的:

1[label ~/.bashrc]
2PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
3
4PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
5
6PS1="\[\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
4PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w$(__docker_machine_ps1 " [%s]")\$ '
5
6PS1="\[\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 登录到机器,请退出会话并再次登录。

步骤 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命令,您必须指定(至少)驱动程序、API代码(或对其进行评估的变量),以及机器的唯一名称。

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

在此输出中,机器的名称是 ubuntu1604-docker:

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

SSH 密钥对为新主机创建,因此docker-machine可以远程访问它。Droplet 配备了所需的操作系统,Docker 安装在系统上。

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

1docker-machine ls

结果应该是这样的:

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

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

默认情况下,在使用 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 machine-name

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

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

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

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

基本操作系统不是你唯一的选择,你也可以指定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 发行版的版本,而 size 行表示了大小:

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

要重新开始:

1docker-machine start machine-name

检查是否已启动:

1docker-machine ls

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

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

然后你可以使用它去除:

1docker-machine rm machine-name

Droplet被删除,以及由docker-machine为其创建的SSH密钥。当你列出Dockerized主机时,你不应该看到你刚刚删除的主机:

1docker-machine ls

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

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

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

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

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

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

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

1docker-machine ssh machine-name uname -r

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

1docker-machine ssh machine-name

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

1[secondary_label Output]
2root@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]
2NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
3ubuntu1604-docker   *        digitalocean Running tcp://203.0.113.71:2376 v18.05.0-ce

若要退出远程 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 技术
comments powered by Disqus