Portainer是一个开源的容器管理平台,它提供了一个直观易用的Web界面来管理Docker容器、镜像、卷等。Portainer可以用于管理单个Docker主机,也可以在群集环境中管理多个Docker主机。

docker-compose

  portainer:
    image: portainer/portainer-ce:latest
    container_name: portainer
    restart: always
    ports:
      - 9000:9000
    volumes:
      - /data/portainer:/data
      - /var/run/docker.sock:/var/run/docker.sock

nginx配置

nginxp配置支持CF反代

    server {
        listen 443 ssl;
        server_name portainer.xxx.com;

        ssl_certificate      /etc/nginx/cert/xxx.com.pem;
        ssl_certificate_key  /etc/nginx/cert/xxx.com.key;

        access_log logs/portainer.access.log main;
        error_log logs/portainer.error.log  notice;

        ssl_session_timeout  1d;
        ssl_session_cache shared:MozSSL:10m;
        ssl_session_tickets off;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
        ssl_prefer_server_ciphers   off;

        add_header Strict-Transport-Security "max-age=63072000" always;

        location / {
            proxy_pass http://portainer:9000;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "Upgrade";
            proxy_set_header Host $host;
        }
    }

初始化

在浏览器访问https://portainer.xxx.com,根据界面提示输入初始化管理员用户名密码。 进入系统后可看到本机docker节点。

添加docker节点

在另一台服务器上操作

开启docker api端口并启用ssl双向认证

自建证书生成脚本

cert.sh

set -e
if [ -z $1 ];then
    echo "服务器ip 示例192.168.1.1"
    exit 0
fi
HOST=$1
# 密码
PASSWORD="改成你的密码"
# 国家
COUNTRY="CN"
# 省份
STATE="XX"
# 城市
CITY="XX"
# 机构名称
ORGANIZATION="XX"
# 机构单位
ORGANIZATIONAL_UNIT="XXXX"
# 邮箱
EMAIL="xxx@xxx.com"
# 生成CA密钥
openssl genrsa -aes256 -passout pass:$PASSWORD -out ca-key.pem 4096
# 生成CA证书
openssl req -new -x509 -passin "pass:$PASSWORD" -days 3650 -key ca-key.pem -sha256 -out ca.pem -subj "/C=$COUNTRY/ST=$STATE/L=$CITY/O=$ORGANIZATION/OU=$ORGANIZATIONAL_UNIT/CN=$HOST/emailAddress=$EMAIL"
#生成服务端密钥
openssl genrsa -out server-key.pem 4096
# 生成服务端证书签名的请求文件
openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr
# 配置白名单,推荐配置0.0.0.0,允许所有IP连接但只有证书才可以连接成功
echo subjectAltName = DNS:$HOST,IP:$HOST,IP:0.0.0.0,IP:127.0.0.1 > extfile.cnf
# 生成服务端证书
openssl x509 -req -days 3650 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -passin "pass:$PASSWORD" -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
# 生成客户端证书
echo extendedKeyUsage = clientAuth > extfile.cnf
openssl x509 -req -days 3650 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -passin "pass:$PASSWORD" -CAcreateserial -out cert.pem -extfile extfile.cnf
rm -v client.csr server.csr
chmod -v 0400 ca-key.pem key.pem server-key.pem
chmod -v 0444 ca.pem server-cert.pem cert.pem
 
cp ca.pem /etc/docker/
cp server-cert.pem /etc/docker/
cp server-key.pem /etc/docker/

执行脚本

sh cert.sh 本机IP

建议本机IP使用netbird组网的虚拟IP,如果使用公网IP还要将API端口暴露在公网,非常不安全。

修改docker配置

修改/etc/docker/daemon.json,添加以下内容

    "hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"],
    "tls": true,
    "tlsverify": true,
    "tlscacert": "/etc/docker/ca.pem",
    "tlscert": "/etc/docker/server-cert.pem",
    "tlskey": "/etc/docker/server-key.pem"

修改/lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
#修改为
ExecStart=/usr/bin/dockerd --containerd=/run/containerd/containerd.sock

开启防火墙端口<若有>

ufw allow from portainer所在服务器IP to any port 2375

下载客户端证书

sz ca.pem cert.pem key.pem 

portainer 添加节点

在左侧菜单中,点击Environments,再在右侧界面中点击Add environment 选择Docker Standalone,点击Start Wizard 选择API,根据提示输入Name,Docker API URL。 打卡TLS选项 TLS CA certificate 对应之前下载的 ca.pem 文件 TLS certificate 对应之前下载的 cert.pem 文件 TLS key 对应之前下载的 key.pem 文件 点击Connect完成节点添加 点击右侧菜单的Home,就可以管理你鸡群的docker了。