介绍
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 脚本,旨在方便使用docker
和docker-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 登录到机器,请退出会话并再次登录。docker
和docker-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-machine
的ssh
子命令。
假设您已经配置了 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 页面托管。