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

Docker Machine是一种工具,可以轻松地从您的个人计算机远程配置和管理多个Docker主机。在本教程中,您将在运行Ubuntu 18.04的本地计算机上安装它,并使用它来配置Dockerized DigitalOcean Droplet。如果您没有本地Ubuntu 18.04计算机,可以在任何Ubuntu 18.04服务器上按照这些说明进行操作

介绍

Docker Machine是一种工具,可以轻松地从您的个人计算机远程配置和管理多个Docker主机。 此类服务器通常称为Dockerized主机,用于运行Docker容器。

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

虽然Docker Machine可以安装在大多数Linux发行版以及macOS和Windows上,但在本教程中,您将在运行Ubuntu 18.04的本地计算机上安装它并使用它来配置Dockerized DigitalOcean Droplet。 如果您没有本地Ubuntu 18.04计算机,则可以在任何Ubuntu 18.04服务器上按照这些说明进行操作。

先决条件

要学习本教程,您需要具备以下条件:

  • 安装了Docker的运行Ubuntu 18.04的本地计算机或服务器。 有关说明,请参阅如何在Ubuntu 18.04上安装和使用Docker
  • DigitalOcean API令牌。 如果您没有,请使用本指南生成它。 生成令牌时,请确保它具有读写范围。 这是默认设置,因此如果您在生成选项时不更改任何选项,则它将具有读写功能。

第1步 - 安装Docker Machine

要使用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

你会看到与此类似的输出,显示版本号和版本:

docker-machine version 0.15.0, build b48dc28d

已安装Docker Machine。 让我们安装一些额外的帮助工具,使Docker Machine更易于使用。

第2步 - 安装其他Docker机器脚本

您可以安装Docker Machine GitHub存储库中的三个Bash脚本,以便更轻松地使用dockerdocker-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登录到计算机,请退出会话并再次登录,并且您将完成dockerdocker-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时看到此输出:

 ...
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主机正在运行:

NAME        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标志传递给--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 Machine的所有标志,请键入:

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:

...
{
    "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

输出将类似于:

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

输出显示机器的状态已更改:

NAME        ACTIVE   DRIVER         STATE     URL   SWARM   DOCKER    ERRORS
docker-01   -        digitalocean   Stopped                 Unknown

要再次启动它,请使用start子命令:

docker-machine start docker-01

然后再次检查其状态:

docker-machine ls

您将看到STATE现在已设置为主机Running

NAME                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-machinessh子命令在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-01ACTIVE列下看到一个星号:

NAME                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图像:

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              71c43202b8ac        3 hours ago         109MB

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

docker ps

如果您在此步骤中运行的Nginx容器是唯一的活动容器,则输出将如下所示:

CONTAINER 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 Machine崩溃,请检查文件中的错误消息。

结论

您已经安装了Docker Machine并使用它从本地系统远程配置DigitalOcean上的多个Docker主机。 从这里,您应该可以根据需要在DigitalOcean帐户上配置尽可能多的Dockerized主机。

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


分享按钮