Nginx/nginx-proxy

Nginx/nginx-proxy

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 容器。


Last update: 2023-07-19 06:25:50 UTC