如何使用远程Docker Server加快工作流程

构建CPU密集型映像和二进制文件是一个非常缓慢且耗时的过程,有时可以将您的笔记本电脑变成空间加热器。在本教程中,您将为远程Docker服务器创建一个Droplet,并在本地计算机上配置`docker`命令以使用它。

介绍

构建CPU密集型映像和二进制文件是一个非常缓慢且耗时的过程,有时可以将您的笔记本电脑变成空间加热器。 在慢速连接上推送Docker镜像也需要很长时间。 幸运的是,这些问题很容易解决。 Docker允许您将所有这些任务卸载到远程服务器,因此您的本地计算机不必执行这项艰苦的工作。

这个功能是在Docker 18.09中引入的。 它支持通过SSH远程连接Docker主机。 它在客户端上只需要很少的配置,并且只需要常规的Docker服务器,而无需在远程计算机上运行任何特殊配置。 在Docker 18.09之前,您必须使用Docker Machine创建远程Docker服务器,然后配置本地Docker环境以使用它。 这种新方法消除了额外的复杂性。

在本教程中,您将创建一个Droplet来托管远程Docker服务器,并在本地计算机上配置docker命令以使用它。

先决条件

要学习本教程,您需要:

第1步 - 创建Docker主机

要开始使用,请使用相当大的处理能力来启动Droplet。 CPU优化计划非常适合此目的,但标准计划也同样适用。 如果您要编译资源密集型程序,则CPU优化计划会提供专用CPU内核,从而实现更快的构建。 否则,标准计划提供更平衡的CPU与RAM比率。

Docker一键式图像为我们完成了所有设置。 按照此链接从控制面板创建一个带Docker的16GB / 8vCPU CPU优化Droplet。

或者,您可以使用doctl从本地命令行创建Droplet。 要安装它,请按照GitHub上doctl README文件中的说明进行操作。

以下命令基于Docker一键式图像在FRA1区域中创建新的16GB / 8vCPU CPU优化Droplet:

doctl compute droplet create docker-host \
    --image docker-18-04 \
    --region fra1 \
    --size c-8 \
    --wait \
    --ssh-keys $(doctl compute ssh-key list --format ID --no-header | sed 's/$/,/' | tr -d '\n' | sed 's/,$//')

doctl命令使用ssh-keys值指定应将哪些SSH密钥应用于新Droplet。 我们使用子shell调用doctl compute ssh-key-list来检索与您的DigitalOcean帐户关联的SSH密钥,然后使用sedtr命令解析结果,以正确的格式格式化数据。 此命令包含您帐户的所有SSH密钥,但您可以使用帐户中任何密钥的指纹替换突出显示的子命令。

创建Droplet后,您将看到其IP地址以及其他详细信息:

ID           Name           Public IPv4        Private IPv4    Public IPv6    Memory    VCPUs    Disk    Region    Image                                 Status    Tags    Features    Volumes
148681562    docker-host    your_server_ip                                    16384     8        100     fra1      Ubuntu Docker 5:18.09.6~3 on 18.04    active

您可以在教程如何使用官方DigitalOcean命令行客户端 doctl了解有关使用doctl命令的更多信息。

创建Droplet后,您就可以使用Docker服务器了。 出于安全考虑,请创建一个Linux用户而不是root用户

首先,以root用户身份使用SSH连接到Droplet:

ssh root@your_server_ip

连接后,添加新用户。 此命令添加一个名为sammy的命令:

adduser sammy

然后将用户添加到docker组,以授予其在Docker主机上运行命令的权限。

sudo usermod -aG docker sammy

最后,键入exit远程服务器。

现在服务器已准备就绪,让我们配置本地docker命令来使用它。

第2步 - 配置Docker以使用远程主机

要将远程主机用作Docker主机而不是本地计算机,请将DOCKER_HOST环境变量设置为指向远程主机。 此变量将指示Docker CLI客户端连接到远程服务器。

export DOCKER_HOST=ssh://sammy@your_server_ip

现在,您运行的任何Docker命令都将在Droplet上运行。 例如,如果启动Web服务器容器并公开端口,它将在Droplet上运行,并且可以通过您在Droplet的IP地址上公开的端口访问。

要验证您是否正在访问Droplet作为Docker主机,请运行docker info

docker info

您将在“ Name字段中看到Droplet的主机名,如下所示:

…
Name: docker-host

要记住的一件事是,当您运行docker build命令时,构建上下文(可从Dockerfile访问的所有文件和文件夹)将被发送到主机,然后构建过程将运行。 与在本地计算机上构建映像相比,可能需要更长的时间,具体取决于构建上下文的大小和文件的数量。 一种解决方案是创建专用于Docker镜像的新目录,并仅复制或链接将在图像中使用的文件,以便不会无意中上载不需要的文件。

结论

您已经创建了一个远程Docker主机并在本地连接到它。 下次您的笔记本电脑电池电量不足或需要构建沉重的Docker映像时,请使用Shiny的远程Docker服务器而不是本地计算机。

您可能还有兴趣学习如何优化Docker图像以进行生产 ,或者如何针对Kubernetes优化它们