介绍
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
你会看到与此类似的输出,显示版本号和版本:
Outputdocker-machine version 0.15.0, build b48dc28d
已安装Docker Machine。 让我们安装一些额外的帮助工具,使Docker Machine更易于使用。
第2步 - 安装其他Docker机器脚本
您可以安装Docker Machine GitHub存储库中的三个Bash脚本,以便更轻松地使用docker
和docker-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
开头。 他们应该看起来像这样:
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主机之间切换变得更加容易。 要下载它,请键入:
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登录到计算机,请退出会话并再次登录,并且您将完成docker
和docker-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
将此行添加到文件中:
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时看到此输出:
Output ...
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主机正在运行:
OutputNAME 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:
Output...
{
"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
输出将类似于:
Output--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
输出显示机器的状态已更改:
OuputNAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
docker-01 - digitalocean Stopped Unknown
要再次启动它,请使用start
子命令:
docker-machine start docker-01
然后再次检查其状态:
docker-machine ls
您将看到STATE
现在已设置为主机Running
:
OuputNAME 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-machine
的ssh
子命令在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-01
的ACTIVE
列下看到一个星号:
OutputNAME 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图像:
OutputREPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 71c43202b8ac 3 hours ago 109MB
您还可以在主机上列出活动容器或正在运行的容器:
docker ps
如果您在此步骤中运行的Nginx容器是唯一的活动容器,则输出将如下所示:
OutputCONTAINER 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页面上 。