背景: 有2台服务器,其中一台安装有portainer作为管理服务器 名字叫A 另一台只安装了docker 作为被管理的服务器 名字叫B
1.服务器A安装portainer
1.拉取镜像
docker pull portainer/portainer
2.运行
docker run -d --restart=always --name portainer -p 9000:9000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/dev/portainer/data:/data \
-v /usr/dev/portainer/public:/public portainer/portainer
2.管理远程docker服务器
1.内网最简单方法
B服务器打开防火墙2375端口,修改daemon.json
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
登录portainer页面添加断点
Public IP是在Portainer 容器列表中点击暴露的端口时自动跳转用到的,IP 或者 HOST 都行,追加上容器端口可以访问到容器即可
缺陷 安全问题,我的服务器是在腾讯云上的,打开2375端口第二天,腾讯云就给我报警了,我的服务器被人攻击变成肉鸡了,还好只是平时学习研究用的服务器,没有重要文件,如果是生产使用,不建议直接开启2375端口
2.tls加密连接
脚本
在服务端 也就是服务器B上跑这个脚本
#!/bin/bash
#相关配置信息 服务端指被管理的docker服务器 客户端指安装了portainer的服务器
#服务端域名
SERVER="txy1-docker.com"
#客户端域名
CLIENT="txy2-docker.com"
CLIENTIP="允许访问的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 客户端证书私钥
证书配置
修改docker启动文件
vi /usr/lib/systemd/system/docker.service
找到 ExecStart 字段
#默认
#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
改为
ExecStart=/usr/bin/dockerd --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
重启
systemctl daemon-reload && systemctl restart docker
然后登录服务器A上的portainer配置端点
可能有的问题
内网域名问题,我是直接修改host文件,来使服务器间可以用域名互相访问,但是portainer在连接端点的时候,会报域名解析不了,初步分析是它会连接一个默认的dns服务器,我的内网域名是解析不了的,就会报错
我的解决办法就是在启动portainer容器的参数加上 --add-host
docker run -d --restart=always --name portainer -p 9000:9000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/dev/portainer/data:/data \
-v /usr/dev/portainer/public:/public \
--add-host="xxx.com:192.168.11.233" portainer/portainer
--add-host="xxx.com:192.168.11.233" 内网域名对应内网的ip地址