前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。
简介
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 脚本,旨在简化 docker
和 docker-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 登录到机器上的,请退出会话,然后再次登录。现在应该可以正常使用 docker
和 docker-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-machine
的 ssh
子命令从本地系统在 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 页面上。