将caddy安装在docker内,与需要用到caddy服务的其他容器共享网络

安装Docker

https://docs.docker.com/engine/install/

准备工作

# 最高权限
sudo su

# 创建caddy配置文件
DAC=/usr/local/etc/dockerAppsConfig/caddy
mkdir -p $DAC

# 下载Caddyfile配置
wget https://raw.githubusercontent.com/caddyserver/dist/master/config/Caddyfile -nc -O $DAC/Caddyfile

# 若国内服务器无法连接Github,可在URL前追加https://p.ooe.ooo/代理下载
# https://p.ooe.ooo/https://raw.githubusercontent.com/caddyserver/dist/master/config/Caddyfile

运行容器

使用bridge网络(推荐)

docker network create caddy-network
docker run -it -d --restart always --name caddy-service -p 80:80 -p 443:443 --network caddy-network -v ${DAC}:/etc/caddy -v ${DAC}/data:/data caddy

使用host网络

--network host 表示使用宿主机网络,除非特殊需求,否则不推荐

docker run -it -d --restart always --name caddy-service --network host -v ${DAC}:/etc/caddy -v ${DAC}/data:/data caddy

映射端口范围

默认docker会为每个映射端口启动一个进程,如果分配过多端口会造成非常大的内存占用,可在dockered守护进程增加--userland-proxy=false禁用此功能。即使关闭此项后Docker还是会为每个port在iptables里添加一条规则,如果端口范围很大还是会造成麻烦。端口范围取500个以下比较合适。

dockerd --userland-proxy=false

或者在daemon.json中添加此项

daemon.json文件位置,如果不存在则创建
    Linux:      /etc/docker/daemon.json
    Windows:    C:\ProgramData\docker\config\daemon.json

写入以下内容

{
    "userland-proxy": false
}

重启dockerd守护进程

service docker restart

之后可正常映射范围端口

docker run -it -d --restart always --name caddy-service -p 80:80 -p 443:443 -p 20000-20100:20000-20100 --network caddy-network -v ${DAC}:/etc/caddy -v ${DAC}/data:/data caddy

重载Caddy配置

caddy_container_id=$(docker ps | grep caddy | awk '{print $1;}')
docker exec -w /etc/caddy $caddy_container_id caddy reload

参考链接

  1. https://stackoverflow.com/questions/37770567/why-does-docker-run-so-many-processes-to-map-ports-though-to-my-application#answer-37809857

  2. https://github.com/moby/moby/issues/14856

  3. https://docs.docker.com/config/daemon/