Docker 安装及 Portainer 连接配置(TLS 加密)
下载安装程序
首先安装 docker 程序(推荐使用离线一键安装脚本方式),下载安装文件
https://download.docker.com/linux/static/stable/x86_64/
https://github.com/docker/compose/releases
使用 docker-23.0.6,安装文件下载地址
https://download.docker.com/linux/static/stable/x86_64/docker-23.0.6.tgz
https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-linux-x86_64
安装脚本
docker-install.sh
脚本内容
#!/bin/bash
if [ ! -d $1 ]; then
mkdir -p $1
if [ $? -ne 0 ]; then
echo "$1 target dir create failed, please check it!"
exit
fi
fi
ln -s $1 /var/lib/docker
ipv4_forward=$(sysctl -a |grep "net.ipv4.ip_forward =" |cut -d= -f2)
if [ $ipv4_forward -ne 1 ]; then
sed -i '/^net.ipv4.ip_forward\s*=/d' /etc/sysctl.conf
echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
sysctl -p
fi
#setup
tar -zxf docker-23.0.6.tgz && mv docker/* /usr/bin/ && rm -rf docker/
#systemd config
cat >/etc/systemd/system/docker.service << EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H unix://var/run/docker.sock
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
EOF
#start
chmod +x /etc/systemd/system/docker.service
systemctl daemon-reload && systemctl start docker && systemctl enable docker.service
#testing
systemctl status docker && docker -v
# 安装docker-compose
cp docker-compose-linux-x86_64 /usr/bin/docker-compose
chmod +x /usr/bin/docker-compose
docker-compose -v
参数 1 为 docker 数据目录,示例
sh docker-install.sh /opt/docker
安装证书脚本
然后创建脚本文件 ca.sh
,使用 vi 编辑
touch ca.sh
vi ca.sh
把下面命令粘贴进去 :wq
保存,生成证书私钥签名是比较繁琐的事情,不嫌麻烦一条条手打也是可以的
#!/bin/bash
set -e
#相关配置信息
#连接的服务器IP
SERVER="XX.XX.XX.XX"
#密码
PASSWORD="123456"
#国家
COUNTRY="cn"
#省
STATE=""
#市
CITY=""
#组织名称
ORGANIZATION="teaone"
#单位名称
ORGANIZATIONAL_UNIT="teaone"
#邮箱
EMAIL="123456@qq.com"
#创建然后切换到生产密钥的目录
mkdir -p /usr/local/ca
cd /usr/local/ca
#生成ca私钥(使用aes256加密)
openssl genrsa -aes256 -passout pass:$PASSWORD -out ca-key.pem 2048
#生成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=$SERVER/emailAddress=$EMAIL"
#生成server证书私钥文件
openssl genrsa -out server-key.pem 2048
#生成server证书请求文件
openssl req -subj "/CN=$SERVER" -new -key server-key.pem -out server.csr
#配置白名单
sh -c 'echo "subjectAltName = IP:'$SERVER',IP:0.0.0.0" >> extfile.cnf'
sh -c 'echo "extendedKeyUsage = serverAuth" >> extfile.cnf'
#使用CA证书及CA密钥以及上面的server证书请求文件进行签发,生成server自签证书
openssl x509 -req -days 3650 -in server.csr -CA ca.pem -CAkey ca-key.pem -passin "pass:$PASSWORD" -CAcreateserial -out server-cert.pem -extfile extfile.cnf
#生成client证书RSA私钥文件
openssl genrsa -out key.pem 2048
#生成client证书请求文件
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
sh -c 'echo extendedKeyUsage=clientAuth >> extfile.cnf'
#生成client自签证书(根据上面的client私钥文件、client证书请求文件生成)
openssl x509 -req -days 3650 -in client.csr -CA ca.pem -CAkey ca-key.pem -passin "pass:$PASSWORD" -CAcreateserial -out cert.pem -extfile extfile.cnf
#删除无用文件
rm client.csr server.csr
执行 ca.sh
脚本
sh ca.sh
在 /usr/local/ca/
下可以看见生成的文件
修改 docker 配置
vi /etc/systemd/system/docker.service
更改 ExecStart 行的值,使 docker 守护程序仅接收来自提供 CA 信任的证书的客户端的链接
ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/usr/local/ca/ca.pem --tlscert=/usr/local/ca/server-cert.pem --tlskey=/usr/local/ca/server-key.pem -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
然后重载配置并且重启 docker
systemctl daemon-reload && systemctl restart docker
配置 Portainer TLS 连接
将 /usr/local/ca/
下生成的 ca.pem
、cert.pem
、key.pem
导出到本地,待会要使用这三个文件连接 docker。
回到 Portainer -> Environments -> Add environments -> Docker Standalone -> Start Wizard
。还是通过 API 方式,但是这次需要勾选 TLS,然后把导出的 3 个文件,对应上传才能连接上。不开启 TLS 只通过 IP + 端口的方式已经连不上了,服务器那边设置了需要验证证书才能连上。
将Docker安装文件放到其他盘
要将Docker的安装文件移动到其他盘,需要先停止Docker服务,然后将Docker的相关文件移动到新位置,并更新Docker的配置文件以反映新的位置。
注意:在实际操作前,请确保已经停止所有容器,以免数据丢失。同时,移动Docker的默认数据存储位置可能会对正在运行的容器造成影响,因为容器可能依赖于它们的数据卷,这些数据卷位于Docker目录下。如果有重要数据,请确保进行了备份。
以下是在Linux系统中执行这些步骤的示例:
停止Docker服务:
systemctl stop docker
假设想将Docker文件移动到/newdisk/docker
目录下,使用rsync来同步文件,保留权限和链接等:
rsync -aP /opt/docker/ /newdisk/docker
确保/newdisk
是想要存放Docker文件的盘符,并且有足够的权限来执行这些操作。如果/newdisk/docker
不存在,需要先创建:
mkdir -p /newdisk/docker
更新Docker的配置文件(如果有的话),通常这个文件位于/etc/docker/daemon.json
,修改其中的"data-root"选项指向新的位置。如果没有这个文件,需要创建它。
例如,daemon.json可能看起来像这样:
{
"data-root": "/newdisk/docker"
}
更改了配置文件,重新启动Docker服务:
systemctl start docker