nginx-proxy
自动为 Docker 镜像提供反向代理。配合 acme-companion 使用支持通过 Let's encrypt 自动签发和续期 HTTPS 证书。
运行:
mkdir -p /root/files/appdata/nginx-proxy
cd /root/files/appdata/nginx-proxy && mkdir certs vhosts html acme
docker network create nginx
docker run --detach \
--name nginx-proxy \
--network nginx \
--publish 80:80 \
--publish 443:443 \
--volume /root/files/appdata/nginx-proxy/certs:/etc/nginx/certs \
--volume /root/files/appdata/nginx-proxy/vhost:/etc/nginx/vhost.d \
--volume /root/files/appdata/nginx-proxy/html:/usr/share/nginx/html \
--volume /var/run/docker.sock:/tmp/docker.sock:ro \
nginxproxy/nginx-proxy
docker run --detach \
--name nginx-proxy-acme \
--network nginx \
--volumes-from nginx-proxy \
--volume /var/run/docker.sock:/var/run/docker.sock:ro \
--volume /root/files/appdata/nginx-proxy/acme:/etc/acme.sh \
--env "DEFAULT_EMAIL=webmaster@sakura-paris.org" \
nginxproxy/acme-companion
运行需要被反向代理的 docker 镜像:
docker run --detach \
--name your-proxied-app \
--network nginx \
--env "VIRTUAL_HOST=subdomain.yourdomain.tld" \
--env "LETSENCRYPT_HOST=subdomain.yourdomain.tld" \
nginx
# 指定应用内部的 http 服务端口
docker run --detach \
--name grafana \
--network nginx \
--env "VIRTUAL_HOST=othersubdomain.yourdomain.tld" \
--env "VIRTUAL_PORT=3000" \
--env "LETSENCRYPT_HOST=othersubdomain.yourdomain.tld" \
--env "LETSENCRYPT_EMAIL=mail@yourdomain.tld" \
grafana/grafana
注意 nginx-proxy 和 app 的 docker 容器需要配置为使用同一个网络 (--network, --net)。
如果 app 用 docker-compose.yaml (docker-compose up -d) 启动,配置指定使用同一个 network :
networks:
default:
external: true
name: nginx
配合 Podman 使用
Podman 默认没有 /var/run/docker.sock,需要修改配置才能使用 nginx-proxy。参考这里。
测试发现使用 Podman 时创建容器后无法自动更新 nginx-proxy / nginx-proxy-acme 配置,需要重启 nginx-proxy / nginx-acme 容器。