前言
有看过我前面文章的朋友都知道,我的文章都是基于最开始的《系统架构设计》逐步展开的,是一个有上下文的系列,并不是单纯的为了分享某个牛逼的技术。基于该架构,我们知道,其后续的所有的应用(主要就是网站)都会通过容器部署,这意味着随着时间的推移,我们需要管理的应用和容器会越来越多。
为了解决统一管理大量网站的问题,我们前面引入了Nginx Proxy Manager,该工具功能虽然不多,但都非常关键,主要涉及反向代理和SSL
证书,当然为了丰富管理场景(比如流量监控),后续还会按需引入一些其它的应用软件管理工具。而本文我们将要介绍的是一款Docker的可视化管理工具-Portainer,它可以让你方便、安全且统一地管理所有远程服务器上的容器。
接下来,我将详细介绍如何在本地虚拟机中安装和配置Portainer,以及如何使用它来管理远程服务器的容器。
1. SSH终端连接虚拟机
首先,肯定是先用root
账号登录一台即将安装Portainer的虚拟机。事实上,你完全可以直接选中虚拟机,然后点击连接进入系统,如下图所示:
但是这样做会有一些很明显的缺点,比如:
- 每次登录都要重新输入账号密码;
- 命令必须手动输入,无法与宿主机之间通过复制粘贴实现快速交互;
- 上传文件比较麻烦,需要额外安装相关工具;
- 无法通过滚动鼠标来查看历史操作日志等。
这些虽然不是什么致命的缺点,但却十分影响使用体验,而通过SSH
客户端,就不会有这些问题。这里我们依然使用前面已经安装的electerm
,有不清楚的可以看一下《比Xshell更好用更酷炫的免费开源SSH/SFTP终端工具》这篇文章。接下来我们看一下如何通过electerm
连接虚拟机。
1.1 启动虚拟机
用SSH
终端连接之前需要启动虚拟机,如下图所示:
这里选择启动而不是连接,因为启动只会后台运行,不会打开一个客户端窗口。
1.2 连接虚拟机
这里比较简单,直接上图,不清楚的可以看一下前面讲SSH/SFTP
终端工具的那篇文章。
不同的是,这次不用私钥登录,而是直接使用root
密码,另外,主机地址需要从如下图所示的位置获:
值得注意的是,由于这里的IP
是由DHCP
动态分配,所以并不是一成不变的,不过也不用太担心,DHCP
服务器默认的租期为8
天,也就是说,只要8
天内虚拟机有被使用,IP
就不会变,你也可以改成固定IP。当然,动态IP
也有动态IP
的好处,其中之一就是不用每次复制创建虚拟机都需要修改IP
。最后,别忘了取一个有意义的标题,然后保存并连接就可以了。
2. 安装Docker引擎
这一节直接参考《Docker环境部署》安装Docker和Docker Compose,并配置镜像加速器。值得注意的是,由于这里是通过root
用户安装的,所以不需要使用sudo
命令,安装后的效果如下图所示:
下一步就可以安装Portainer了,不过在这之前,我建议赶紧先创建一个检查点,因为快速搭建一个干净的Docker环境太重要了,效果如下图所示:
我这里有两个检查点,并分别重命名了,其中,一个是干净的CentOS系统,另一个是干净的Docker环境,然后再重新导出备份一下系统。这样一来,备份文件里面就也有两个检查点了,后续如果有需要,直接导入虚拟机就能快速得到一个部署好Docker环境的虚拟机了,怎么样?方便吧?
3. 安装Portainer
关于Portainer的安装,我建议大家直接查阅官方文档:Install Portainer CE with Docker on Linux,你在网上其它地方搜到的资料大概率都是过时的,因为portainer/portainer
这个仓库现在已被弃用了。我这里参考官方文档,然后结合我的情况简单介绍一下安装过程。
3.1 环境要求
安装Portainer之前,请确保你的环境满足以下要求:
- 已安装并运行
23.0.6
及以上版本的Docker; SELinux
已被禁用,如果没有禁用,则需要在部署Portainer时指定--privileged
参数;- Docker以
root
身份运行。
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
命令查看目录结构,如下图所示:
该目录不需要提前创建,容器部署时,会自动生成。另外,8000
端口我这里用不上,所以也没有开放。
3.3 访问Portainer
访问https://<虚拟机IP>:9443
,即可进入Portainer创建用户的界面,如下图所示:
上面的域名、端口以及证书问题,也可以处理,但我这里不想搞那么麻烦,本来就是本地虚拟机,没有强迫症的话,就先将就这么用了。
填上密码,点击Create user,创建完成之后,会打开如下页面:
安装过程会自动检测本地环境并进行设置,点击Get Started开始使用,就能看到如下界面,自动就有了一个local
环境:
如果要添加其他环境,则需要点击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
目录下进行(事实上,证书在哪里生成都可以),详细步骤如下:
生成
CA
私钥,这里会提示设置密码,两次输入需要相同。openssl genrsa -aes256 -out ca-key.pem 4096
生成
CA
公钥。openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
这里需要输入刚才设置的密码,然后设置一些基本信息,可以随便填,也可以不填,但需要注意的是,Country Name应该填
CN
,Common Name应该填服务器的外网IP,如下图所示:
生成服务器端的私钥。
openssl genrsa -out server-key.pem 4096
生成服务器端的证书签名请求,这里的IP需要替换成你自己的服务器IP。
openssl req -subj "/CN=111.229.186.72" -sha256 -new -key server-key.pem -out server.csr
生成服务端配置文件
extfile.cnf
,注意替换IP。echo subjectAltName = IP:111.229.186.72,IP:0.0.0.0 >> extfile.cnf && echo extendedKeyUsage = serverAuth >> extfile.cnf
生成服务器端的证书,需要输入密码。
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \ -CAcreateserial -out server-cert.pem -extfile extfile.cnf
生成客户端的私钥。
openssl genrsa -out key.pem 4096
生成客户端的证书签名请求。
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
生成客户端的配置文件
extfile-client.cnf
。echo extendedKeyUsage = clientAuth > extfile-client.cnf
生成客户端的证书,需要输入密码。
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \ -CAcreateserial -out cert.pem -extfile extfile-client.cnf
删除无用的文件。
rm -fv client.csr server.csr extfile.cnf extfile-client.cnf
删除写入访问权限,以防止意外损坏。
chmod -v 0400 ca-key.pem key.pem server-key.pem && \ chmod -v 0444 ca.pem server-cert.pem cert.pem
上述一系列操作,其实就是为了生成CA
证书,服务端证书以及客户端证书相关的一系列文件,如下图所示:
这些证书生成不易,可以保留着,以备不时之需。
4.2 配置服务端证书
通过
vim
修改/lib/systemd/system/docker.service
文件,使Docker守护进程仅接受来自提供CA
信任的客户端的请求,如下图所示:
插入的内容如下:--tlsverify --tlscacert=~/ca.pem --tlscert=~/server-cert.pem --tlskey=~/server-key.pem -H tcp://0.0.0.0:2376
重新加载
systemd
配置并重启Docker
服务。systemctl daemon-reload && systemctl restart docker
- 放通
2376
端口,如下图所示。
4.3 配置客户端证书
首先,把上面生成的ca.pem
、cert.pem
、key.pem
三个文件复制到本地,然后在Portainer中添加环境,如下图所示:
环境类型选择Docker,然后如下图所示填写信息,最后点击Add environment就添加成功了。
可以看到,列表中多了一个腾讯云的Docker环境了。
点进去就能看到我们之前通过脚本创建的一些容器,这里我就不再继续展开了。
结语
有了Portainer,我们对容器的管理将不再需要写一行脚本,只需要点点鼠标就能完成,而且,不管你有多少台服务器,都可以在一个统一的地方维护,是不是很方便呢?
不仅如此,只要你自己不泄露ca.pem
、cert.pem
、key.pem
三个文件,你的容器就是安全的,不用担心别人也能远程操控你的容器。
下一篇文章,我们将通过Portainer来部署一个应用,感受一下Portainer的强大,敬请期待!
评论0
暂时没有评论