Portainer 初体验

最近突然想尝试一下 Docker 现有的 GUI 界面 , 找了一下发现 Portainer 的 UI 比较出众, 于是咱就打算尝试体验一下

准备工作

  • 装有 Ubuntu 操作系统的 Docker 的服务器
  • 基本 Docker 及 Linux 知识
  • 一个脑子

在服务器上安装 Portainer

首先我们需要在服务器上安装 Portainer 服务以使用它的服务, 为了保证该服务不宕机, 小霖在 Azure 上开了一台最便宜的服务器当做 Portainer 的专用宿主机, 并在网页的外面套上了 Verizon CDN 服务以保证在国内外都有最好的访问效果

因为服务是要远程连接到我们的服务器上的, 所以宿主机到 Docker 服务器的延迟也应该要在一定范围内才行, Azure 这台新加坡的服务器到上海腾讯云和广州腾讯云的延迟都是 60ms 左右, 已经足够了

安装 Docker

小霖选用的是 Ubuntu 18.04 操作系统, 不过别的系统应该也差不多, 输入以下指令即可:

curl https://get.docker.com | sudo bash

等待安装完成后可以按照提示将自己的用户加入 docker 用户组

安装 Portainer

Portainer 有现成的 Docker 镜像, 所以咱就直接使用官方提供的镜像

这玩意儿关乎着所有 Docker 服务器的安危, 所以 SSL 是肯定要上的啦. 将证书存放在某个神奇的小目录下咱就可以开始安装了(请将以下代码中的 ${DIR}${PORT} 更换成自己需要的值):

docker run -d -p ${PORT}:9000 --name portainer --restart always -v ${DIR}:/certs -v portainer_data:/data portainer/portainer --ssl --sslcert /certs/cert.pem --sslkey /certs/key.pem

等命令执行完后打开 https://IP 就应该可以看到下面的界面了

初始化界面

在这个界面设置好登录信息后我们就可以进入下一个环节了

开启安全的 Docker Remote API

开启 Docker Remote API 的方法非常简单, 只要在 /etc/default/docker 中添加如下代码即可:

OPTIONS='-H=tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock'

但是这样就相当于直接把你的服务器毫无保留地暴露出去了, 所以我们需要一些更安全的开启方式, 我们开始吧!

生成服务器证书及建立 API 服务

我们将所有的证书都放置到 /etc/docker/目录下以便于管理

咱首先生成 CA 的公钥以及私钥:

openssl genrsa -aes256 -out ca-key.pem 4096 # 生成 CA 私钥
openssl req -new -x509 -days 3650 -key ca-key.pem -sha256 -out ca.pem # 生成 CA 公钥

接下来生成服务端证书、签名请求和密钥:

openssl genrsa -out server-key.pem 4096 # 生成证书私钥
openssl req -sha256 -new -key server-key.pem -out server.csr # 创建证书签名请求
# 输入一系列相关信息,可省略部分直接输入.
# 其中 Common Name 需要改成你连接服务器的地址, 比如 1.1.1.1 或 example.com
openssl x509 -req -days 3650 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem # 生成服务器证书

到现在咱的服务器端证书就已经生成好了, 可以建立经过加密的 Docker Remote API 服务了

/etc/default/docker 添加如下代码:

OPTIONS='-H=tcp://0.0.0.0:2376 -H=unix:///var/run/docker.sock --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem'

理论来说以上代码是可以正常运行的, 但是在小霖的服务器上貌似不起作用, 所以咱直接修改启动 Docker 的脚本参数: 打开 /lib/systemd/system/docker.service , 在 ExecStart 后添加以下内容:

-H=tcp://0.0.0.0:2376 --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem

之后输入 sudo systemctl daemon-reload 重新载入 systemctl 配置文件后输入 sudo systemctl restart docker 重启 Docker 服务即可

为客户端生成证书

目前为止 API 服务已经被刚刚咱创建的证书所加密了, 接下来就要生成客户端证书以允许客户端连接上 API 服务, 代码如下

openssl genrsa -out key.pem 4096 # 生成证书私钥
openssl req -new -key key.pem -out client.csr # 创建证书签名请求
# 输入一系列相关信息, 例外同上
openssl x509 -req -days 3650 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem # 生成客户端证书

上面的代码运行完成后, 客户端的证书就生成完毕了, 我们需要将 ca.pem cert.pemkey.pem 复制到本地以便稍后在 Portainer 中添加节点

在 Portainer 中添加节点

完成了上面的步骤之后就可以在 Portainer 添加刚刚操作的 Docker 服务器了

在填写完账号信息后我们应该可以看到下面的界面:

添加节点

在这个界面我们就可以添加需要的节点了

其中 Name 是名字, Endpoint URL 是服务器 IP 加上端口号, 在这里也就是上面设置的 2376

除了填写这些我们还要上传刚刚复制回来的三个文件, TLS CA certificate 对应的是 ca.pem, TLS certificate 对应的是 cert.pem, TLS key 对应的是 key.pem

填写完这些信息并连接成功后咱就可以进入到主页了, 如下图:

首页

小结

如果步骤没有缺漏的话到这里 Portainer 就应该已经安装完成了, 小霖体验了一下感觉还是很好用的, 不过有一些功能还是没有的, 比如增加端口或者挂载卷之类的, 希望以后会持续更新吧

那么, 就酱~ (滚去睡觉觉惹

本文采用 CC BY-NC-SA 4.0 许可协议。转载和引用时请注意遵守协议、注明出处!