在这篇文章中,我将介绍如何使用Docker Compose创建并配置一个Caddy容器。Caddy 是一个强大的反向代理服务器,具有自动HTTPS、轻松的配置以及高性能等优点。通过Docker Compose,我们可以轻松地管理和部署Caddy容器化应用。这样我们访问各种服务的时候就不用带上端口号,也可以避免http明文传输带来的安全性风险。
相比nginx,我觉得Caddy最大的优势是会自动帮你完成Let’s Encrypt的SSL挑战并获取证书,而你需要做的只是手动把域名指向你的服务器IP即可。下面我将提供快速部署Caddy的教学。
安装Docker以运行Caddy
如果你还没有安装Docker,运行以下代码安装:
apt update
apt install curl -y
curl -fsSL https://get.docker.com -o get-docker.sh && sh get-docker.sh
目前DockerHub是被墙的状态,如果你的服务器在国内切想稳定使用,需要找一个可用的镜像源或者使用梯子,Linux个人推荐ShellCrash,这部分请自行查看文档恕不提供教学。
编辑Caddyfile
创建一个用于管理caddy相关文件的文件夹,例如~/caddy
。随后我们执行cd ~/caddy
进入刚刚创建的caddy目录。
首先,我们在目录下创建一个Caddyfile文件,添加反代的规则。基本的规则如下,首先是你的服务要对应的域名,随后是本地的IP以及端口。当你使用下方的第一种方式配置时,Caddy会自动检查你的服务是否支持https并自动启用。此外caddy会自动帮你完成ssl挑战并自动管理和应用证书:
yourdomain.com {
reverse_proxy http://127.0.0.1:5000 #ip+端口
}
将域名指向服务器的IP
以腾讯云为例,前往云解析DNS,我的解析,选择添加记录
随后添加一条解析记录
你可以添加单独一条,就像上图一样,Caddy中的配置就对应为:
blog.yourdomain.com {
reverse_proxy http://backend-ip:port1
}
也可以添加整个子域名范围,这样Caddy应用子域名的时候就不用再来添加了,例如添加*.blog
,一样指向你的服务器IP。这样你就可以在Caddy添加多个子域名来对应多个服务,例如aaa, bbb, ccc
:
aaa.blog.yourdomain.com {
reverse_proxy http://backend-ip:port2
}
bbb.blog.yourdomain.com {
reverse_proxy http://backend-ip:port3
}
ccc.blog.yourdomain.com {
reverse_proxy http://backend-ip:port4
}
使用Docker Compose创建Caddy容器
接下来,我们将编写一个docker-compose.yml
文件来配置Caddy容器。以下是一个示例配置文件:
version: '3.3'
services:
caddy:
image: caddy:latest
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- ./site:/srv
- caddy_data:/data
- caddy_config:/config
network_mode: host # 使用host网络模式
volumes:
caddy_data:
caddy_config:
完成配置后,使用以下命令启动Caddy容器:
docker compose up -d
这将以守护进程模式启动Caddy容器,Caddy将直接通过宿主机的网络端口提供服务。
静态网站的运行
我们在Docker compse中进行了如下映射./site:/srv
。假设你在本地有一个目录结构为 ~/caddy/site/your_site_folder
,那么他将会被 Docker Compose 映射到容器中的 /srv/your_site_folder
,那么 Caddyfile 可以如下配置:
http://example.com {
root * /srv/your_site_folder # 使用映射到容器内的 /srv/your_site_folder 目录作为网站根目录
file_server # 启用文件服务器功能,提供静态文件服务
}
https://example.com {
root * /srv/your_site_folder # 使用映射到容器内的 /srv/your_site_folder 目录作为网站根目录
file_server # 启用文件服务器功能,提供静态文件服务
# 反向代理配置
reverse_proxy /api/* http://127.0.0.1:5000 # 将 /api/* 的请求代理到本地主机的5000端口
}
如此,我们的https配置就大功告成了。更新Caddyfile文件后,你只需要运行
docker compose down
docker compose up -d
就可以应用新的配置啦。