本文将介绍如何在Debian系统上安装Docker并进行配置。
建议优先参考官方文档
Install Docker Engine on Debian | Docker Documentation
首先需要添加Docker的软件源并安装最新版Docker Engine:

1
2
3
4
5
6
7
8
9
10
sudo apt install ca-certificates curl gnupg  
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL [https://download.docker.com/linux/ubuntu/gpg](https://download.docker.com/linux/ubuntu/gpg) | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] [https://download.docker.com/linux/ubuntu](https://download.docker.com/linux/ubuntu) \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install docker-ce docker-ce-cli [containerd.io](http://containerd.io/) docker-buildx-plugin docker-compose-plugin

然后需要将当前用户加入docker组,以免每次执行Docker命令时都需要sudo:

1
sudo usermod -aG docker username   

注销并重新登录以使更改生效。

编辑/etc/docker/daemon.json文件:

1
sudo vim /etc/docker/daemon.json  

 
加入以下内容:

1
2
3
4
5
6
7
8
9
10
11
{
"log-driver": "json-file",
"log-opts": {
"max-size": "20m",
"max-file": "3"
},
"ipv6": true,
"fixed-cidr-v6": "fd00:dead:beef:c0::/80",
"experimental":true,
"ip6tables":true
}

重启Docker服务:

1
sudo systemctl restart docker

安装Traefik

首先,我们需要创建一个Docker network,以便Traefik和其他服务可以互相通信:

1
docker network create traefik

然后,创建Traefik的配置目录和存放证书的文件:

1
2
3
mkdir -p ~/traefik
touch ~/traefik/acme.json
chmod 600 ~/traefik/acme.json

编辑Traefik的静态配置文件traefik.yml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
global:
checkNewVersion: true # 检查Traefik是否有新版本,保持更新是很重要的,可以获取最新的功能和安全修复。
sendAnonymousUsage: false # 不发送匿名使用情况数据,如果你不想分享你的Traefik使用数据,可以将此项设置为false。

entryPoints:
web:
address: ":80" # HTTP监听端口,用于接收HTTP请求。
http:
redirections: # 将HTTP请求重定向到HTTPS,确保安全的通信。
entryPoint:
to: websecure

websecure:
address: ":443" # HTTPS监听端口,用于接收HTTPS请求。
http:
tls:
certResolver: dns-cloudflare # 使用Cloudflare证书解析器,用于管理HTTPS证书的自动获取和更新。
domains:
- main: "domain.com" # 主要域名,用于生成证书。
sans:
- "*.domain.com" # 通用名称,允许使用通配符的子域名。

providers:
docker:
defaultRule: "Host(`{{ trimPrefix `/` .Name }}.domain.com`)" # Docker容器域名规则,用于将容器与域名进行关联。
watch: true # 监听Docker事件,当有新的容器启动或停止时,Traefik会自动更新配置。
network: traefik # 指定Docker网络,Traefik将通过该网络与容器进行通信。
exposedByDefault: false # 只有加了label标签的容器才会被traefik发现并关联。

file:
filename: /etc/traefik/dynamic.yml # 动态配置文件的路径,Traefik会监听该文件的变化并重新加载配置。
watch: true # 监听文件变化并重新加载,方便在运行时动态更新配置。

api:
dashboard: true # 启用Web UI,可以通过该界面查看Traefik的运行状态和配置信息。

log:
level: WARN # 日志级别,可以根据需要调整日志的详细程度,此处设置为WARN表示只记录警告及以上级别的日志信息。

accessLog: {} # 开启记录访问日志信息。

certificatesResolvers:
dns-cloudflare: # Cloudflare证书解析器,用于自动获取和更新HTTPS证书。
acme:
email: name@email.com # 证书过期提醒邮箱,当证书即将过期时,Traefik会发送提醒邮件。
storage: /etc/traefik/acme.json # 证书存储位置,用于存储已获取的证书和相关信息。
dnsChallenge:
provider: cloudflare
resolvers:
- "1.1.1.1:53" # Cloudflare DNS服务器,Traefik在进行DNS验证时将使用此服务器进行域名解析。
- "1.0.0.1:53"

然后编辑Traefik的动态配置文件dynamic.yml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
tls:
options:
default: # 默认TLS选项,用于所有域名的TLS配置。
sniStrict: true # 开启SNI严格模式,可以限制ip直接访问。
minVersion: VersionTLS12 # 最低支持TLS 1.2版本。
cipherSuites: # 支持的加密套件列表,用于建立TLS连接时的加密算法选择。
- TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
- TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
mintls13: # 最低使用TLS 1.3版本。
minVersion: VersionTLS13

部署Traefik服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
services:
traefik:
image: traefik:v2.10.1 # 使用Traefik版本2.10.1的Docker镜像。
container_name: traefik # 容器的名称为"traefik"。
security_opt:
- no-new-privileges:true # 设置容器的安全选项,禁止新的特权提升。
ports:
- "80:80" # 将主机的80端口映射到容器的80端口,用于接收HTTP请求。
- "443:443" # 将主机的443端口映射到容器的443端口,用于接收HTTPS请求。
volumes:
- /etc/timezone:/etc/timezone:ro # 将主机的时区文件挂载到容器中,以保持时间一致性。
- /etc/localtime:/etc/localtime:ro # 将主机的本地时间文件挂载到容器中,以保持时间一致性。
- /var/run/docker.sock:/var/run/docker.sock:ro # 将主机的Docker套接字挂载到容器中,以便Traefik能够与Docker交互。
- ~/traefik:/etc/traefik # 将主机上的目录挂载到容器中,用于存储Traefik的配置文件和证书等数据。
networks:
- traefik # 使用名为"traefik"的Docker网络,用于容器之间的通信。
labels:
traefik.enable: true # 启用Traefik对该容器的代理和路由功能。
traefik.http.routers.api.rule: Host(`traefik.domain.com`) # 配置Traefik的路由规则,将请求路由到容器。
traefik.http.routers.api.entryPoints: websecure # 指定路由使用的入口点为"websecure",即HTTPS入口点。
traefik.http.routers.api.service: api@internal # 指定服务为Traefik内部API服务。
environment:
PUID: 1000 # 设置容器中Traefik进程的用户ID。
PGID: 1000 # 设置容器中Traefik进程的组ID。
CF_DNS_API_TOKEN: your cloudflare dns token # 设置Cloudflare DNS API令牌,用于进行DNS验证和管理。
restart: unless-stopped # 设置容器在非停止状态下自动重启。

networks:
traefik:
external: true # 定义名为"traefik"的外部Docker网络,使Traefik容器能够与其他容器进行通信。

获取CF_DNS_API_TOKEN的步骤:

  1. 登录Cloudflare控制面板,点击右上角的个人资料图标,选择“My Profile”。
  2. 在“API Tokens”选项卡上,点击“Create Token”。
  3. 选择 Edit zone DNS, 点击”Use template”
  4. 输入一个描述性名称, Permissions不用改,保持”Zone-DNS-Edit”,
  5. Zone Resources,第三项可以选择要认证的域名,最下面点击“Continue”。
  6. 复制显示的API令牌,这就是你的CF_DNS_API_TOKEN。