可视化管理你的远程Docker容器-Portainer

作者:Keysqiu
创建时间:2026-01-15 15:20:23 最后一次修改时间:2026-01-15 15:32:40
Categories: Tags:

1. SSH终端连接虚拟机

首先,肯定是先用root​账号登录一台即将安装Portainer的虚拟机。事实上,你完全可以直接选中虚拟机,然后点击连接进入系统,如下图所示:
image
但是这样做会有一些很明显的缺点,比如:

这些虽然不是什么致命的缺点,但却十分影响使用体验,而通过SSH客户端,就不会有这些问题。这里我们依然使用前面已经安装的electerm,有不清楚的可以看一下《比Xshell更好用更酷炫的免费开源SSH/SFTP终端工具》这篇文章。接下来我们看一下如何通过electerm连接虚拟机。

1.1 启动虚拟机

SSH​终端连接之前需要启动虚拟机,如下图所示:
image
这里选择启动而不是连接,因为启动只会后台运行,不会打开一个客户端窗口。

1.2 连接虚拟机

这里比较简单,直接上图,不清楚的可以看一下前面讲SSH/SFTP​终端工具的那篇文章。
image
不同的是,这次不用私钥登录,而是直接使用root​密码,另外,主机地址需要从如下图所示的位置获:
image
值得注意的是,由于这里的IP​是由DHCP​动态分配,所以并不是一成不变的,不过也不用太担心,DHCP​服务器默认的租期为8​天,也就是说,只要8​天内虚拟机有被使用,IP​就不会变,你也可以改成固定IP。当然,动态IP​也有动态IP​的好处,其中之一就是不用每次复制创建虚拟机都需要修改IP​。最后,别忘了取一个有意义的标题,然后保存并连接就可以了。

2. 安装Docker引擎

这一节直接参考《Docker环境部署》安装DockerDocker Compose,并配置镜像加速器。值得注意的是,由于这里是通过root​用户安装的,所以不需要使用sudo​命令,安装后的效果如下图所示:
image
下一步就可以安装Portainer了,不过在这之前,我建议赶紧先创建一个检查点,因为快速搭建一个干净的Docker环境太重要了,效果如下图所示:
image
我这里有两个检查点,并分别重命名了,其中,一个是干净的CentOS系统,另一个是干净的Docker环境,然后再重新导出备份一下系统。这样一来,备份文件里面就也有两个检查点了,后续如果有需要,直接导入虚拟机就能快速得到一个部署好Docker环境的虚拟机了,怎么样?方便吧?

3. 安装Portainer

关于Portainer的安装,我建议大家直接查阅官方文档:Install Portainer CE with Docker on Linux,你在网上其它地方搜到的资料大概率都是过时的,因为portainer/portainer这个仓库现在已被弃用了。我这里参考官方文档,然后结合我的情况简单介绍一下安装过程。

3.1 环境要求

安装Portainer之前,请确保你的环境满足以下要求:

3.2 运行容器

执行如下脚本,即可部署并启动Portainer容器:

docker run -d -p 9443:9443 --name portainer --restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /data/portainer:/data \
portainer/portainer-ce:latest

值得注意的是,官方文档中,运行容器之前先创建了一个portainer_data​卷,这个卷默认挂载在/var/lib/docker/volumes/​目录下,我这里为了方便维护,将目录挂载到了/data/portainer​目录下,可通过tree​命令查看目录结构,如下图所示:
image
该目录不需要提前创建,容器部署时,会自动生成。另外,8000端口我这里用不上,所以也没有开放。

3.3 访问Portainer

访问https://<虚拟机IP>:9443​,即可进入Portainer创建用户的界面,如下图所示:
image

上面的域名、端口以及证书问题,也可以处理,但我这里不想搞那么麻烦,本来就是本地虚拟机,没有强迫症的话,就先将就这么用了。

填上密码,点击Create user,创建完成之后,会打开如下页面:
image
安装过程会自动检测本地环境并进行设置,点击Get Started开始使用,就能看到如下界面,自动就有了一个local​环境:
image
如果要添加其他环境,则需要点击Add Environments,当然也可以随后再到Environments中添加。

4. 远程管理

如果只是管理本地环境,那么到这里就可以结束了,但如果仅此而已的话,那安装Portainer就没太大意义了。我们实际想要的是远程管理来自不同服务器上的多个Docker环境。基于这种需求,Portainer提供了多种方式,我这里不一一介绍,而是直接采用Docker API方式,这也是我最推荐的方式,具体可以参考官方文档:Connect to the Docker API。不过既然是远程管理,那么在这之前,肯定是需要让远程服务器的Docker进程允许远程访问的。

4.1 生成证书

这里主要参考官方文档:Use TLS (HTTPS) to protect the Docker daemon socket。操作均在服务器上的/root目录下进行(事实上,证书在哪里生成都可以),详细步骤如下:

  1. 生成CA私钥,这里会提示设置密码,两次输入需要相同。

    openssl genrsa -aes256 -out ca-key.pem 4096
  2. 生成CA公钥(注意:这里的有效期设置成了 365 天,也就是说该公钥并非永久有效,到期后需要重新生成。当然,如有必要,你也可以设置更长的过期时间)。

    openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem

    这里需要输入刚才设置的密码,然后设置一些基本信息,可以随便填,也可以不填,但需要注意的是,Country Name应该填CN​,Common Name应该填服务器的外网IP,如下图所示:
    image

  3. 生成服务器端的私钥。

    openssl genrsa -out server-key.pem 4096
  4. 生成服务器端的证书签名请求,这里的IP需要替换成你自己的服务器IP。

    openssl req -subj "/CN=111.229.186.72" -sha256 -new -key server-key.pem -out server.csr
  5. 生成服务端配置文件extfile.cnf,注意替换IP。

    echo subjectAltName = IP:111.229.186.72,IP:0.0.0.0 >> extfile.cnf && echo extendedKeyUsage = serverAuth >> extfile.cnf
  6. 生成服务器端的证书,需要输入密码(有效期同上,不再赘述)。

    openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \
    -CAcreateserial -out server-cert.pem -extfile extfile.cnf
  7. 生成客户端的私钥。

    openssl genrsa -out key.pem 4096
  8. 生成客户端的证书签名请求。

    openssl req -subj '/CN=client' -new -key key.pem -out client.csr
  9. 生成客户端的配置文件extfile-client.cnf

    echo extendedKeyUsage = clientAuth > extfile-client.cnf
  10. 生成客户端的证书,需要输入密码(有效期同上,不再赘述)。

    openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \
    -CAcreateserial -out cert.pem -extfile extfile-client.cnf
  11. 删除无用的文件。

    rm -fv client.csr server.csr extfile.cnf extfile-client.cnf
  12. 删除写入访问权限,以防止意外损坏。

    chmod -v 0400 ca-key.pem key.pem server-key.pem && \
    chmod -v 0444 ca.pem server-cert.pem cert.pem

上述一系列操作,其实就是为了生成CA​证书,服务端证书以及客户端证书相关的一系列文件,如下图所示:
image
这些证书生成不易,可以保留着,以备不时之需。

4.2 配置服务端证书

  1. 通过vim​修改/lib/systemd/system/docker.service​文件,使Docker守护进程仅接受来自提供CA​信任的客户端的请求,如下图所示:
    image
    插入的内容如下:

    --tlsverify --tlscacert=~/ca.pem --tlscert=~/server-cert.pem --tlskey=~/server-key.pem -H tcp://0.0.0.0:2376
  2. 重新加载systemd配置并重启Docker服务。

    systemctl daemon-reload && systemctl restart docker
  3. 放通2376​端口,如下图所示。
    image

4.3 配置客户端证书

首先,把上面生成的ca.pem​、cert.pem​、key.pem​三个文件复制到本地,然后在Portainer中添加环境,如下图所示:
image
环境类型选择Docker,然后如下图所示填写信息,最后点击Add environment就添加成功了。
image
可以看到,列表中多了一个腾讯云的Docker环境了。
image
点进去就能看到我们之前通过脚本创建的一些容器,这里我就不再继续展开了。