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

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站

简介

Docker Machine 是一个工具,可以方便地从个人计算机远程配置和管理多个 Docker 主机。这些服务器通常被称为 Docker 化主机,并且可以用来运行 Docker 容器。

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

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

先决条件

要完成本教程,您需要以下内容:

  • 运行 Ubuntu 16.04 的本地计算机,并已安装 Docker(请参阅《在 Ubuntu 16.04 上安装和使用 Docker》)
  • DigitalOcean API 令牌。如果您没有令牌,请使用此指南生成。生成令牌时,请确保它具有读写权限。这是默认设置,因此如果在生成令牌时没有更改任何选项,它将具有读写权限。为了在命令行上更容易使用,确保将令牌分配给一个变量,如该文章中所述。

步骤 1 --- 在本地计算机上安装 Docker Machine

在这一步中,我们将介绍在运行 Ubuntu 16.04 的本地计算机上安装 Docker Machine 的过程。

要下载并安装 Docker Machine 二进制文件,请输入:

command 复制代码
wget https://github.com/docker/machine/releases/download/v0.14.0/docker-machine-$(uname -s)-$(uname -m)

文件的名称应为 docker-machine-Linux-x86_64。将其重命名为 docker-machine 以便更轻松地使用:

command 复制代码
mv docker-machine-Linux-x86_64 docker-machine

使其可执行:

command 复制代码
chmod +x docker-machine

将其移动或复制到 usr/local/bin 目录中,以便作为系统命令使用:

command 复制代码
sudo mv docker-machine /usr/local/bin

检查版本,以确认已正确安装:

command 复制代码
docker-machine version

输出应类似于:

docker-machine version 0.14.0, build 89b8332

步骤 2 --- 安装额外的 Docker Machine 脚本

Docker Machine GitHub 仓库中有三个 Bash 脚本,旨在简化 dockerdocker-machine 命令的使用。它们提供命令完成和 Bash 提示定制。

在这一步中,我们将在本地计算机上安装这三个脚本。它们将被下载并安装到 /etc/bash_completion.d 目录中。

第一个脚本允许您从 Bash 提示符中查看活动的机器。当您使用和在多个 Docker 化机器之间切换时,这非常方便。该脚本名为 docker-machine-prompt.bash。要下载它,请输入:

command 复制代码
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 变量设置自定义值。为此,使用 nano 打开它(PS1 是一个特殊的 shell 变量,用于修改 bash 命令提示符):

command 复制代码
nano ~/.bashrc

在该文件中,有三行以 PS1 开头。它们应该像这样:

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]"),使其变为:

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 机器之间切换变得容易。要下载它,请输入:

command 复制代码
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 完成。使用以下命令下载它:

command 复制代码
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 命令的命令完成。

步骤 3 --- 使用 Docker Machine 部署一个 Docker 化的主机

现在你已经在本地机器上运行了 Docker 和 Docker Machine,你可以使用 Docker Machine 的 docker-machine create 命令在你的 DigitalOcean 账户上部署一个 Docker 化的 Droplet。如果你还没有这样做,可以使用以下命令将你的 DigitalOcean API 令牌分配给一个 bash 变量:

command 复制代码
export DOTOKEN=your-api-token

要使这个变量永久生效,将它放在你的 ~/.bashrc 文件中。这一步是可选的,但如果你希望这个值在终端会话之间保持不变,这是必要的。

使用 nano 打开该文件:

command 复制代码
nano ~/.bashrc

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

export DOTOKEN=your-api-token

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

command 复制代码
source ~/.bashrc

要成功调用 docker-machine create 命令,你必须至少指定驱动程序、API 令牌(或者求值为它的变量)和一个唯一的机器名称。要创建你的第一台机器,输入:

command 复制代码
docker-machine create --driver digitalocean --digitalocean-access-token $DOTOKEN machine-name

随着机器的创建,部分输出如下所示。在这个输出中,机器的名称是 ubuntu1604-docker

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

为新主机创建了一个 SSH 密钥对,以便 docker-machine 可以远程访问它。Droplet 使用所需的操作系统进行了配置,并在系统上安装了 Docker。当命令完成时,你的 Docker Droplet 就已经运行起来了。

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

command 复制代码
docker-machine ls

输出应该类似于这样:

NAME               ACTIVE      DRIVER         STATE     URL                         SWARM   DOCKER    ERRORS
ubuntu1604-docker    -        digitalocean   Running   tcp://203.0.113.71:2376            v18.05.0-ce

步骤 4 --- 在创建 Docker 化的主机时指定基础操作系统

默认情况下,使用 Docker Machine 创建 Docker 化主机时使用的基础操作系统 应该 是最新的 Ubuntu LTS 版本。然而,在本文发布时,docker-machine create 命令仍然使用 Ubuntu 16.04 LTS 作为基础操作系统,尽管 Ubuntu 18.04 是最新的 LTS 版本。因此,如果你需要在最近创建的机器上运行 Ubuntu 18.04,你将需要通过向 docker-machine create 命令传递 --digitalocean-image 标志来指定 Ubuntu 以及所需的版本。

例如,要使用 Ubuntu 18.04 创建一台机器,输入:

command 复制代码
docker-machine create --driver digitalocean --digitalocean-image ubuntu-18-04-x64 --digitalocean-access-token $DOTOKEN machine-name

你不仅限于 Ubuntu 的版本。你可以使用 DigitalOcean 支持的任何操作系统来创建一台机器。例如,要使用 Debian 8 创建一台机器,输入:

command 复制代码
docker-machine create --driver digitalocean --digitalocean-image debian-8-x64 --digitalocean-access-token $DOTOKEN machine-name

要使用 CentOS 7 作为基础操作系统来部署一个 Docker 化的主机,指定 centos-7-0-x64 作为镜像名称,如下所示:

command 复制代码
docker-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 文档中对应的 slug 来找到你想要使用的 Droplet 的大小。

例如,要使用 2GB 的 RAM、两个 CPU 和 60GB 的 SSD 来部署一台机器,使用 slug s-2vcpu-2gb

command 复制代码
docker-machine create --driver digitalocean --digitalocean-size s-2vcpu-2gb --digitalocean-access-token $DOTOKEN machine-name

要查看使用 DigitalOcean 驱动程序创建 Docker Machine 的所有特定标志,输入:

command 复制代码
docker-machine create --driver digitalocean -h

步骤 5 --- 执行额外的 Docker Machine 命令

您已经学会了如何使用 create 子命令来配置一个 Docker 化的主机。您还学会了如何使用 ls 子命令列出 Docker Machine 可用的主机。在这一步中,您将学习一些更多的 docker-machine 子命令。

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

command 复制代码
docker-machine inspect machine-name

输出应包括这样的行。Image 行显示了所使用的 Linux 发行版的版本,而 size 行指示了大小标识:

...
{
    "ConfigVersion": 3,
    "Driver": {
        "IPAddress": "203.0.113.71",
        "MachineName": "ubuntu1604-docker",
        "SSHUser": "root",
        "SSHPort": 22,
        ...
        "Image": "ubuntu-16-04-x64",
        "Size": "s-1vcpu-1gb",
        ...
    },

要打印主机的连接配置,请输入:

command 复制代码
docker-machine config machine-name

输出应类似于:

--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 地址,但您也可以通过输入以下命令来获取该信息:

command 复制代码
docker-machine ip machine-name

如果您需要关闭远程主机,可以使用 docker-machine 来停止它:

command 复制代码
docker-machine stop machine-name

验证它是否已停止:

command 复制代码
docker-machine ls

机器的状态已更改:

[secondary_label Ouput]
NAME                 ACTIVE   DRIVER         STATE     URL                        SWARM   DOCKER    ERRORS
ubuntu1604-docker                  digitalocean   Timeout

要重新启动它:

command 复制代码
docker-machine start machine-name

验证它是否已启动:

command 复制代码
docker-machine ls

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

[secondary_label Ouput]
NAME                 ACTIVE   DRIVER         STATE     URL                        SWARM   DOCKER    ERRORS

ubuntu1604-docker         -        digitalocean   Running   tcp://203.0.113.71:2376           v18.05.0-ce

然后,您可以使用以下命令将其删除:

command 复制代码
docker-machine rm machine-name

Droplet 将与 docker-machine 为其创建的 SSH 密钥一起被删除。现在,当您列出 Docker 化的主机时,您将不会看到刚刚删除的那个:

command 复制代码
docker-machine ls

步骤 6 --- 通过 SSH 在 Docker 化的主机上执行命令

到目前为止,您已经获取了有关您的机器的信息,但您可以做更多。例如,您可以通过使用 docker-machinessh 子命令从本地系统在 Docker 主机上执行本机 Linux 命令。本节将解释如何通过 docker-machine 执行 ssh 命令以及如何打开到 Docker 化主机的 SSH 会话。

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

command 复制代码
docker-machine ssh machine-name apt-get update

您甚至可以使用以下命令应用可用的更新:

command 复制代码
docker-machine ssh machine-name apt-get upgrade

不确定远程 Docker 主机使用的内核是什么?输入以下命令:

command 复制代码
docker-machine ssh machine-name uname -r

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

command 复制代码
docker-machine ssh machine-name

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

root@machine-name#

要从远程主机退出,请输入:

exit

步骤 7 --- 激活 Docker 化的主机

激活 Docker 主机会将您的本地 Docker 客户端连接到该系统,从而使得可以在远程系统上运行正常的 docker 命令成为可能。要激活 Docker 主机,请输入以下命令:

command 复制代码
eval $(docker-machine env machine-name)

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

command 复制代码
docker-machine use machine-name

在输入上述任何命令后,您的 bash 提示符应更改以指示您的 Docker 客户端指向远程 Docker 主机。它将采用以下形式。主机的名称将出现在提示符的末尾:

username@localmachine:~ [machine-name]$

现在,在此命令提示符下输入的任何 docker 命令都将在该远程主机上执行。

如果终端上激活了一个主机,那么在运行 docker-machine ls 命令时,ACTIVE 列下的星号表示它是活动的。

NAME                ACTIVE          DRIVER         STATE     URL                         SWARM   DOCKER    ERRORS
ubuntu1604-docker   *        digitalocean   Running   tcp://203.0.113.71:2376             v18.05.0-ce

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

docker-machine use -u

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

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

第8步 --- 在远程 Docker 化主机上创建 Docker 容器

到目前为止,您已经在您的 DigitalOcean 账户上配置了一个 Docker 化的 Droplet,并且已经激活了它 --- 也就是说,您的 Docker 客户端正在指向它。下一个逻辑步骤是在其上启动容器。举个例子,让我们尝试运行官方的 Nginx 容器。

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

command 复制代码
docker-machine use machine-name

现在执行以下命令在该机器上运行一个 Nginx 容器:

command 复制代码
docker run -d -p 8080:80 --name httpserver nginx

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

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

在 Docker 主机仍处于激活状态(如提示符中所示)时,您应该能够列出该主机上的镜像:

docker images

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

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              ae513a47849c        3 weeks ago         109MB

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

command 复制代码
docker ps

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

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
4284f9d25548        nginx               "nginx -g 'daemon of..."   20 minutes ago      Up 20 minutes       0.0.0.0:8080->80/tcp   httpserver

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

command 复制代码
exit

第9步 --- 禁用崩溃报告(可选)

默认情况下,每当使用 Docker Machine 配置 Docker 化主机失败或 Docker Machine 崩溃时,一些诊断信息会自动发送到 Bugsnag 上的 Docker 账户。如果您对此感到不舒服,您可以通过在安装的 .docker/machine 目录中创建一个名为 no-error-report 的空文件来禁用报告。

要创建该文件,请键入:

command 复制代码
touch ~/.docker/machine/no-error-report

如果配置失败或 Docker Machine 崩溃,请检查该文件以查看错误消息。

结论

这是一个关于安装和使用 Docker Machine 从一个本地系统远程配置多个 Docker Droplets 的介绍。现在,您应该能够在您的 DigitalOcean 账户上快速配置所需数量的 Docker 化主机。

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

相关推荐
TeYiToKu1 小时前
笔记整理—linux驱动开发部分(9)framebuffer驱动框架
linux·c语言·arm开发·驱动开发·笔记·嵌入式硬件·arm
dsywws1 小时前
Linux学习笔记之时间日期和查找和解压缩指令
linux·笔记·学习
yeyuningzi1 小时前
Debian 12环境里部署nginx步骤记录
linux·运维·服务器
上辈子杀猪这辈子学IT1 小时前
【Zookeeper集群搭建】安装zookeeper、zookeeper集群配置、zookeeper启动与关闭、zookeeper的shell命令操作
linux·hadoop·zookeeper·centos·debian
minihuabei1 小时前
linux centos 安装redis
linux·redis·centos
lldhsds2 小时前
书生大模型实战营第四期-入门岛-1. Linux前置基础
linux
wowocpp3 小时前
ubuntu 22.04 硬件配置 查看 显卡
linux·运维·ubuntu
山河君3 小时前
ubuntu使用DeepSpeech进行语音识别(包含交叉编译)
linux·ubuntu·语音识别
鹏大师运维3 小时前
【功能介绍】信创终端系统上各WPS版本的授权差异
linux·wps·授权·麒麟·国产操作系统·1024程序员节·统信uos
筱源源3 小时前
Elasticsearch-linux环境部署
linux·elasticsearch