介绍
构建CPU密集型映像和二进制文件是一个非常缓慢且耗时的过程,有时可以将您的笔记本电脑变成空间加热器。 在慢速连接上推送Docker镜像也需要很长时间。 幸运的是,这些问题很容易解决。 Docker允许您将所有这些任务卸载到远程服务器,因此您的本地计算机不必执行这项艰苦的工作。
这个功能是在Docker 18.09中引入的。 它支持通过SSH远程连接Docker主机。 它在客户端上只需要很少的配置,并且只需要常规的Docker服务器,而无需在远程计算机上运行任何特殊配置。 在Docker 18.09之前,您必须使用Docker Machine创建远程Docker服务器,然后配置本地Docker环境以使用它。 这种新方法消除了额外的复杂性。
在本教程中,您将创建一个Droplet来托管远程Docker服务器,并在本地计算机上配置docker
命令以使用它。
先决条件
要学习本教程,您需要:
- DigitalOcean帐户。 如果您还没有帐户,则可以创建帐户 。
- Docker安装在本地计算机或开发服务器上。 如果您正在使用Ubuntu 18.04,请按照如何在Ubuntu 18.04上安装和使用Docker的第1步和2进行操作; 否则,请按照官方文档获取有关在其他操作系统上安装的信息。 请确保将非root用户添加到
docker
组,如链接教程的第2步中所述。
第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密钥,然后使用sed
和tr
命令解析结果,以正确的格式格式化数据。 此命令包含您帐户的所有SSH密钥,但您可以使用帐户中任何密钥的指纹替换突出显示的子命令。
创建Droplet后,您将看到其IP地址以及其他详细信息:
ID Name Public IPv4 Private IPv4 Public IPv6 Memory VCPUs Disk Region Image Status Tags Features Volumes148681562 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 [email protected]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优化它们 。