Terry

Terry

Docker 安装及 Portainer 连接配置(TLS 加密)

222
2024-01-04

离线安装(推荐)

下载安装程序

首先安装 docker 程序(推荐使用离线一键安装脚本方式),下载安装文件

https://download.docker.com/linux/static/stable/x86_64/
https://github.com/docker/compose/releases

使用 docker-28.0.1,安装文件下载地址

https://download.docker.com/linux/static/stable/x86_64/docker-28.0.1.tgz

安装脚本

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-28.0.1.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

# check
systemctl status docker && docker -v

# install docker-compose
cp docker-compose-linux-x86_64 /usr/bin/docker-compose
chmod +x /usr/bin/docker-compose
docker-compose -v

# install docker compose
# https://github.com/docker/compose/releases/download/v2.28.0/docker-compose-linux-x86_64
mkdir -p /usr/local/lib/docker/cli-plugins
cp docker-compose /usr/local/lib/docker/cli-plugins/docker-compose
chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
docker compose version

参数 1 为 docker 数据目录,示例

sh docker-install.sh /opt/docker

在线安装

以 Rocky Linux 系统安装/部署 Docker 为例

Rocky Linux 是一个社区驱动的开源项目,旨在作为 RHEL 的免费替代品。它是由 CentOS 项目联合创始人之一 Gregory Kurtzer 发起的。CentOS 曾经是 RHEL 的免费替代品,但随着 CentOS 项目转向 CentOS Stream,Rocky Linux 诞生了,以填补 CentOS 留下的空白。Rocky Linux 与 RHEL 具有二进制兼容性,即 Rocky Linux 使用与 RHEL 相同的源代码进行构建,因此软件和系统行为应该与 RHEL 一致。

下载docker-ce的repo文件

curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker.repo

阿里云镜像地址:

https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装docker

yum install docker-ce -y

启动docker

docker -v && systemctl restart docker && systemctl enable 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

|800

/usr/local/ca/ 下可以看见生成的文件

|800

修改 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

|800

然后重载配置并且重启 docker

systemctl daemon-reload && systemctl restart docker

配置 Portainer TLS 连接

/usr/local/ca/ 下生成的 ca.pemcert.pemkey.pem 导出到本地,待会要使用这三个文件连接 docker。

回到 Portainer -> Environments -> Add environments -> Docker Standalone -> Start Wizard 。还是通过 API 方式,但是这次需要勾选 TLS,然后把导出的 3 个文件,对应上传才能连接上。不开启 TLS 只通过 IP + 端口的方式已经连不上了,服务器那边设置了需要验证证书才能连上。

|800

|800

将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

添加镜像源

参考镜像源网站:国内 Docker 服务状态 & 镜像加速监控

# 将内容写入 /etc/docker/daemon.json 文件,root 用户可以去掉 sudo
# 配置 Docker 镜像,使用多个镜像源来提高镜像下载速度
{
    "registry-mirrors": [
        "https://docker.1panel.live",
        "https://docker.m.daocloud.io",
        "https://docker.ketches.cn",
        "https://docker.1ms.run"
    ]
}

# 重启 Docker 服务以使配置生效
systemctl daemon-reload && systemctl restart docker