介绍
Docker 是集装箱化软件的热门选项,CoreOS 专门用于集群环境,这使得两者成为集装箱化应用的绝佳匹配,但保持所有集装箱的组织可能很复杂,特别是如果它们仅通过 Docker 命令行接口进行管理,或者如果您有多个 CoreOS 实例。
幸运的是,有一个有用的 Docker 管理工具,名为 Shipyard。它为您提供了通过有用的 GUI 重新启动、破坏和创建容器的能力。它还允许您管理特定容器的资源分配,并在多个 Docker 主机上管理容器。
在本指南中,我们将在单一的 CoreOS 服务器上设置 Shipyard 2.0.10 并通过 TLS 证书保护 Docker,以确保只有授权的客户端可以连接到它。
前提条件
要遵循本教程,您将需要:
- 至少有 512 MB 的内存,但建议使用 1 GB 或更多。 请确保您选择的是最新的稳定版本的 CoreOS,而不是一个 Alpha 或 Beta 版本。 所有 CoreOS 服务器都需要一个 SSH 密钥,所以如果您还没有一个,您可以通过以下步骤 1 - 3 添加一个 如何使用 SSH 密钥与 DigitalOcean Droplets。
- 一个完全合格的域名(FQDN)或子域名为您的 Docker 主机。 如果您还没有一个域名,您可以从任何不同的域名注册商中购买一个。 一旦您有一个域名使用, How to Point to DigitalOcean Names From Common Domain Registrars work
第一步:创建服务器证书
我们需要做的第一件事是创建一个证书权限,我们可以使用它来签署服务器和客户端证书。
首先,创建并移动到一个名为dockertls
的目录,所以很容易记住文件的位置。
1mkdir ~/dockertls && cd ~/dockertls
接下来,创建一个RSA私钥,这个命令会提示你为你的密钥创建一个密码。
1openssl genrsa -aes256 -out private-key.pem 4096
让我们分解上面的命令。 genrsa
意味着命令将生成一个私有 RSA 私钥。 -out private-key.pem
指定了我们想要生成的文件的名称,即 private-key.pem
。
接下来,生成一个新的证书,并使用我们刚刚创建的私钥签名,您需要输入您创建密钥时选择的密码。
1openssl req -new -x509 -sha512 -days 365 -key private-key.pem -out myca.pem
OpenSSL 还会询问一些必要的信息,例如您的服务器的 FQDN 和您的组织所在的县。 尽可能准确地回答这些问题。
现在我们有 CA,我们实际上可以创建一些服务器证书用于使用 Docker 命令. 以下两个命令会生成签名请求. 请确保用您正在使用的域或子域代替 `example.com。
1openssl genrsa -out docker-1-key.pem 4096
2openssl req -subj "/CN=example.com" -sha512 -new -key docker-1-key.pem -out docker.csr
最后,用CA的私钥签名,您需要再次输入密钥密码。
1openssl x509 -req -days 365 -sha256 -in docker.csr -CA myca.pem -CAkey private-key.pem -CAcreateserial -out final-server-cert.pem
这将在当前目录中创建一个名为final-server-cert.pem
的文件,即将在 Docker 主机上使用的服务器证书。
步骤二:创建客户证书
现在我们有一个服务器证书,我们需要创建一个客户端证书,每次我们尝试连接到 Docker 主机时都会使用此证书。
首先,为客户端创建另一个签名请求。
1openssl genrsa -out client-key.pem 4096
2openssl req -subj '/CN=client' -new -key client-key.pem -out docker-client.csr
我们需要创建一个配置文件,说明结果的证书实际上可以用于客户端身份验证。
1echo extendedKeyUsage = clientAuth > client.cnf
上面的命令会创建一个名为client.cnf
的文件,内容为extendedKeyUsage = clientAuth
,而无需使用文本编辑器。
接下来,用CA密钥签名客户端。
1openssl x509 -req -days 365 -sha512 -in docker-client.csr -CA myca.pem -CAkey private-key.pem -CAcreateserial -out client.pem -extfile client.cnf
现在我们有CA,服务器证书和客户端证书。
第三步:配置Docker和CoreOS
在此步骤中,我们将配置Docker DAEMON来使用我们的证书。
我们需要修改 Docker 的启动选项。CoreOS 使用systemd
来管理服务. 如果您想阅读systemd
并了解更多信息,您可以阅读 如何使用 Systemctl 来管理 Systemd 服务和单位。
首先,让我们从编辑Docker单元文件开始。有一个systemctl
命令的选项,可以帮助我们复制实际单元文件,而不是直接修改原始文件。
打开 Docker 单元文件以使用systemctl
进行编辑。
1sudo systemctl edit --full docker
这将打开文件以使用vim
进行编辑,您可以通过阅读我们的 vim 教程来学习如何使用它。
查找以 ExecStart=/usr/lib/coreos/dockerd
开头的行,在该行后附上下面的突出选项,以便该文件看起来像这样:
1EnvironmentFile=-/run/flannel_docker_opts.env
2MountFlags=slave
3LimitNOFILE=1048576
4LimitNPROC=1048576
5ExecStart=/usr/lib/coreos/dockerd --daemon --host=fd:// --tlsverify --tlscacert=/home/core/dockertls/myca.pem --tlscert=/home/core/dockertls/final-server-cert.pem --tlskey=/home/core/dockertls/docker-1-key.pem -H=0.0.0.0:2376 $DOCKER_OPTS $DOCKER_OPT_BIP $DOCKER_OPT_MTU $DOCKER_OPT_IPMASQ
让我们看看我们刚刚添加的选项:
--tlsverify
只是打开 TLS 验证,以便只有授权的客户端可以连接。--tlscacert
指定我们的 CA 证书的位置.--tlscert
指定服务器证书的位置.--tlskey
指定服务器密钥的位置.-H=0.0.0.0:2376
意味着 Docker 将从任何地方听取连接,但它仍然不会允许任何没有授权的客户端密钥或证书的连接。
保存并关闭该文件,然后重新加载Docker DAEMON,以便它使用我们的新配置。
1sudo systemctl restart docker
您可以通过检查 Docker 的状态来确保一切正常工作。
1systemctl status docker
寻找以 **Active:**开始的行,如果它说除了 **active(运行)**以外的任何东西,请双重检查您的单元文件编辑,并确保所有所需的密钥和证书被生成。
最后,我们可以测试我们的TLS验证。
1docker --tlsverify --tlscacert=myca.pem --tlscert=client.pem --tlskey=client-key.pem -H=example.com:2376 info
如果一切顺利,您应该收到有关 Docker 主机的一些基本系统信息;这意味着您刚刚用 TLS 保护了 Docker 主机。
您现在可以从任何地方访问 Docker 主机,只要使用有效的证书和客户端密钥连接,您可以生成和签署尽可能多的客户端证书,以便在集群中使用。
第四步:安装造船厂
设置造船厂是一个相当简单的过程,所有部件都具有自己的Docker容器,因此Docker会自动抽取所需的图像。
首先,我们需要设置一个数据量,在那里将存储造船厂的数据库。
1docker create --name shipyard-rethinkdb-data shipyard/rethinkdb
现在我们实际上可以拉下并生成一个新的容器为 RethinkDB.这是Shipyard 使用的数据库引擎来跟踪来自 Docker 的实时数据。
1docker run -it -d --name shipyard-rethinkdb --restart=always --volumes-from shipyard-rethinkdb-data -p 127.0.0.1:49153:8080 -p 127.0.0.1:49154:28015 -p 127.0.0.1:29015:29015 shipyard/rethinkdb
这个命令还确保RethinkDB只会听本地托管
这个数据库,这是一个很好的方法来保护这个数据库,因为这意味着没有人可以从服务器之外访问它。
我们将使用 Shipyard 版本 2.0.10 因为它是最容易配置的 Docker TLS. 下面的命令将启动一个运行 Shipyard 的新容器,并将其连接到 RethinkDB 容器,允许它们进行通信。
1docker run -it -p 8080:8080 -d --restart=always --name shipyard --link shipyard-rethinkdb:rethinkdb shipyard/shipyard:2.0.10
完成 Shipyard 设置后,请访问 http://example.com:8080
或 http://your_server_ip:8080
以访问 Shipyard 控制面板。您可以使用默认用户名 admin 和密码 shipyard 登录。
船厂将提示您将新发动机添加到集群中. 点击绿色 + 添加按钮,您将收到这样的表格:
如下填写信息:
- 名称可以是你想要的任何东西。这将是引擎的名称。
- 标签也可以是你想要的任何东西。只需把它缩短,这样你就可以把你的容器组织起来。
- CPUs是你的服务器有多少CPU。
- Memory是你的服务器有多少RAM。
- 地址必须是
https://your_server_ip:2376
才能使用TLS。
基本选项下方有三大文本区域,您将粘贴证书和密钥,以便 Shipyard 可以安全连接到您的 Docker 主机。
第一个字段, ** SSL 证书**,需要客户端证书. 打印证书的内容。
1cat ~/dockertls/client.pem
然后复制输出并粘贴到 **SSL 证书 ** 框中。
接下来,打印客户端密钥的内容。
1cat ~/dockertls/client-key.pem
将输出插入到 SSL 密钥 文本区域。
最后,打印CA证书的内容。
1cat ~/dockertls/myca.pem
将该内容粘贴到 **CA 证书 ** 框中。
点击页面底部的蓝色 ** 添加 ** 按钮. 如果一切都配置正确,船厂应该为您提供这个屏幕:
结论
您现在有安全的 Docker 主机在您的 CoreOS 服务器上运行!
Shipyard 可以帮助您安全地管理您的集装箱和主机集群,您还可以将客户端密钥和证书添加到本地机器中,以便您可以从任何地方远程管理 Docker 集群。
对于额外的安全步骤,您可以使用 Nginx 来逆转您的 Shipyard 服务器的代理服务器。这允许您使用 HTTPS 以便从本地计算机连接到 Shipyard 更安全。您可以在文章中了解更多有关此事的信息 Docker 解释:如何容器化和使用 Nginx 作为代理.您也可以 旋转更多 CoreOS 服务器并尝试一个 Docker 集群。