关于我
~一个热爱火影的业余小提琴玩家~
Joynaruto

Docker容器之Portainer搭建与管理

前言

这几天前前后后搭建了许多Docker容器,我就想着如何有效管理这些分布在不同服务器中的容器。每次通过SSH进入不同服务器后台,通过命令行管理显得略微低效。于是便使用Portainer中的Environment功能来集中管理各个服务器中的Docker容器

开始搭建

安装Docker及Docker-Compose

#安装docker
wget -qO- get.docker.com | bash
#查看Docker版本
docker -v
#设置开机启动
systemctl enable docker
#安装docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#授予执行权限
sudo chmod +x /usr/local/bin/docker-compose
#查看Docker-Compose版本
docker-compose --version

管理端搭建Portainer

特别说明下,这个方案只需要在自己的主力服务器上安装Portainer管理服务器,被管理端不需要安装Portainer。安装命令如下:

docker run -d -p 8000:8000 -p 9000:9000 --name portainer \
    --restart=always \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v /root/data/docker_data/pt/data:/data \
    cr.portainer.io/portainer/portainer-ce:latest

输入docker ps -a查看Portainer后台是否已经跑起来

客户端配置

内网配置

内网下配置非常简单,只需让Docker2375端口侦听就行

##一般Linux下##
#修改daemon文件
vi /etc/docker/daemon.json
#修改为如下配置
{
   "hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]
}
#重启docker
systemctl daemon-reload
systemctl restart docker.service
---------------分割线---------------
##群晖下##
#编辑docker配置文件
sudo vi /var/packages/Docker/etc/dockerd.json
#添加此行:
"hosts" : [ "tcp://192.168.0.233:2375", "unix:///var/run/docker.sock" ],
#重启docker服务
synoservice --restart pkgctl-Docker
---------------分割线---------------
##openwrt的dockerman配置注意##
1、允许被连以及自身管理,需要同时启用0.0.0.0:2375和ux
2、远程连接其他docker后无法同时再对自身docker进行管理
---------------分割线---------------
##Unraid下开启Docker的2375管理端口方法##(2023-09-05更新)
1、编辑/boot/config/docker.cfg,在最下面加入一行,并重启Docker
2、DOCKER_OPTS="--storage-driver=btrfs -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375"

外网配置

外网如果直接开放端口虽然可行,但安全性堪忧,很容易被攻击。所以需要进行tls加密连接来确保安全。

1、在任意路径新建一个脚本文件1.sh如下,按自己要求修改参数保存

#!/bin/bash
#相关配置信息 服务端指被管理的docker服务器 客户端指安装了portainer的服务器
#服务端域名
SERVER="被管理服务器的域名"   //需修改
#客户端域名
CLIENT="管理端服务器的域名"    //需修改
CLIENTIP="允许连入的IP即被管理服务器的IP"   //需修改
PASSWORD="随便设"   //需修改
COUNTRY="CN"
STATE="上海市"
CITY="上海市"
ORGANIZATION="公司名称"
ORGANIZATIONAL_UNIT="Dev"
EMAIL="随便设"    //需修改
​
###开始生成文件###
echo "开始生成文件"
​
#切换到生成密钥的目录
mkdir tls
cd tls
# 生成根证书 RSA 私钥,过程中需要设置密码
openssl genrsa -aes256 -passout pass:$PASSWORD  -out ca-key.pem 4096
#生成CA证书,填写配置信息
openssl req -new -x509 -days 365 -passin "pass:$PASSWORD" -key ca-key.pem -sha256  -subj "/C=$COUNTRY/ST=$STATE/L=$CITY/O=$ORGANIZATION/OU=$ORGANIZATIONAL_UNIT/CN=$SERVER/emailAddress=$EMAIL" -out ca.pem
​
#生成服务端 证书私钥文件
openssl genrsa -out server-key.pem 4096
#生成服务端 证书签名请求
openssl req -subj "/CN=$SERVER" -sha256 -new -key server-key.pem -out server.csr
#由于 TLS 连接可以通过 IP 地址和 DNS 名称进行,因此需要在创建证书时指定 IP 地址
echo subjectAltName = DNS:$SERVER,IP:$CLIENTIP,IP:127.0.0.1 >> extfile.cnf
#将 Docker 守护程序密钥的扩展使用属性设置为仅用于服务器身份验证:
echo extendedKeyUsage = serverAuth >> extfile.cnf
#生成签名证书
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -passin "pass:$PASSWORD" -CAcreateserial  -out server-cert.pem -extfile extfile.cnf
​
#生成客户端证书RSA私钥文件
openssl genrsa -out key.pem 4096
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
#要使密钥适合客户端身份验证,请创建一个新的扩展配置文件
sh -c 'echo "extendedKeyUsage=clientAuth" > extfile-client.cnf'
#生成client自签证书(根据上面的client私钥文件、client证书请求文件生成)
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem  -passin "pass:$PASSWORD" -CAcreateserial -out cert.pem  -extfile extfile-client.cnf
​
#更改密钥权限
chmod -v 0444 ca.pem server-cert.pem cert.pem
#删除无用文件
rm -fv client.csr server.csr extfile.cnf extfile-client.cnf
echo "生成文件完成"
###生成结束 最终生成文件###
#ca.pem CA证书
#ca-key.pem CA证书私钥
#server-cert.pem 服务端证书
#server-key.pem 服务端证书私钥
#cert.pem 客户端证书
#key.pem 客户端证书私钥

2、赋予脚本执行权限并执行

chmod +x 1.sh && bash 1.sh

3、执行完后会生成如下7个文件,其中需要把带箭头的3个复制到本地。

4、修改Docker启动文件

#docker.service可能在以下3个路径,选任一修改即可
/usr/lib/systemd/system/docker.service
/etc/systemd/system/multi-user.target.wants/
/lib/systemd/system/docker.service
#修改文件
vi /usr/lib/systemd/system/docker.service
找到 ExecStart 字段
#默认
#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
改为
ExecStart=/usr/bin/dockerd --iptables=false --tlsverify --tlscacert=/证书目录/ca.pem --tlscert=/证书目录/server-cert.pem --tlskey=/证书目录/server-key.pem -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock

5、重启Docker

systemctl daemon-reload && systemctl restart docker

———-至此客户端配置完成———-

服务端配置

登录服务端的Portainer,连接配置如下图:

之后就可以通过主服务器的Portainer来高效管理所有部署在内外网服务器上的Docker容器

最后

实际使用了几天觉得真心方便,管理效率提升了许多 :idea:

发表回复

textsms
account_circle
email

Joynaruto

Docker容器之Portainer搭建与管理
前言 这几天前前后后搭建了许多Docker容器,我就想着如何有效管理这些分布在不同服务器中的容器。每次通过SSH进入不同服务器后台,通过命令行管理显得略微低效。于是便使用Portainer中的…
扫描二维码继续阅读
2022-05-05