caddy Docker 容器代理介绍与使用

type
Post
status
Published
date
May 17, 2023
slug
caddy
summary
tags
工具
caddy
icon
如果你想在宿主机上直接运行 Caddy 并为 Docker 容器内的服务提供反代,参考 https://blog.insv.xyz/caddy-host

介绍

Caddy 2 是一个功能强大、面向企业级、开源的 Web 服务器,使用 Go 语言编写,支持自动 HTTPS 加密。
对普通使用者而言,Caddy 最主要的优势在于
  1. 配置相对简单(与 nginx 相比,我看到要写 nginx 就脑壳疼)
  1. 自动生成 SSL 证书(利用 Let’s encrypt 生成免费证书,但只有三个月有效期),并自动续期

安装

1. 创建 docker-compose.yml 文件

内容如下:
最后 4 行是重点
内容如下:
💡
为什么要用 vim 创建一个 Caddyfile 文件并填入内容 1. 不创建 Caddyfile 文件,启动 caddy 时新建一个名为 Caddyfile 的目录 2. 使用 touch 新建一个空文件,会报 EOF 错误: Error: adapting config using caddyfile: EOF
 

2. 创建名为 caddy 的 docker network

创建一个外部桥接网络(external Bridge Network),如果将其他 docker 容器服务放在上面,就不需要额外公开端口,通过 <container_hostname>:<port> 打开对应的服务。

3. 启动 caddy

4. 打开防火墙端口 80, 443

以腾讯云服务器为例
notion image
notion image

使用

假设我们拥有 example.com 这个域名,我们想利用 docker 创建一个名为 gotify 的服务并通过域名 gotify.example.com ,我们需要做以下几件事
  1. example.com 域名管理中,设置一条 A 记录,将 gotify.example.com 定向到我们运行 caddy 容器的服务器的 IP
  1. 创建一个 gotify 服务并加入 caddy 网络
  1. 在 Caddyfile 中配置 gotify.example.com 解析到运行 gotify 服务的容器

1. DNS 设置域名解析到 IP

腾讯云 DNS Pod 为例

notion image
notion image
notion image
 

以 Cloudflare 为例

notion image
notion image
如果红框内的小云朵不关的话,需要设置 SSL 为 Full
notion image

2. 创建一个 gotify 服务并加入 caddy 网络

内容如下:
13, 14 行设置了 gotify 服务的用户名和密码,可以自行设置
最后四行令 gotify 加入 caddy 网络
如果想访问主机服务,例如主机直接起了个 127.0.0.1:8000 ,想通过 caddy 为其反代,docker-compose.yml 内容如下:
Caddyfile 格式如下
启动 gotify 容器

3. 配置 gotify.example.com 解析到容器

删除之前输入的示意内容,新增内容如下:
💡
说明: test@email.com 改为你的邮箱,用来生成 HTTPS 证书; example.com 该为你的域名; gotify-server:80 中的 gotify-server:在 gotify 的 docker-compose.yml 文件第 6 行 container_name: gotify-servergotify-server:80 中的 80:在 gotify 的 docker-compose.yml 文件第 10 行 # - 82:80 ,冒号前的 82 是指通过转发到的主机端口, 冒号后的 80 才是 gotify 这个容器本来的端口。我们使用 caddy 进行域名直接定向到服务容器,无需转发到主机端口,故注释第 9, 10 行; 以后其他容器想要使用 caddy 进行 reverse_proxy,可以按照第4,5,6行的模板在 Caddyfile 文件中创建新的条目
修改 Caddyfile 后重新加载 Caddy:(需要在 caddy 目录下)
将这个命令封装成脚本
在 caddy 目录下新建文件 reload.sh
reload.sh 执行权限
现在,可以直接输入 ./relaod.sh 就能执行该命令了
以后有改动时,只要 cd 到 caddy 目录下,然后 ./reload.sh 就行了
如果你甚至不想 cd 到 caddy 目录下,可以在脚本中添加 cd 到 caddy 目录 , 然后将这个脚本 mv 到 /usr/local/bin/ 目录下
在浏览器地址栏输入 gotify.example.com ,应该可以正常访问 gotify 服务了,如下图:
notion image
如果无法正常打开该页面,可以使用下面这条命令查看 caddy 运行 logs

参考链接:

  • ChatGPT
 

© insv 2021 - 2024