skip to content
The Life of Leung

Nginx Proxy Manager with Docker Compose

/ 3 min read

Updated:
Table of Contents

Nginx Proxy Manager 官网文档

Docker 安装

方案一(推荐一键部署)

Terminal window
curl -fsSL https://get.docker.com | sh

方案二(apt 命令安装)

Terminal window
apt update
apt install apt-transport-https ca-certificates curl software-properties-common -y
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
apt update
apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

Docker 开启全局 IPv6 支持

宿主机的 Docker 配置文件

/etc/docker/daemon.json
{
"ipv6": true,
"fixed-cidr-v6": "fd00::/64",
"experimental": true,
"ip6tables": true
}
# 重启服务
sudo systemctl restart docker

创建支持双栈的自定义网络

Terminal window
docker network create \
--ipv6 \
--subnet=172.20.0.0/16 \
--subnet=fd00:1a2b::/64 \
npm_public
# 查看网络信息
docker network inspect npm_public

docker-compose.yml 文件内容

Terminal window
# 🌟 创建独立的生产环境内部网络,实现容器间安全隔离
#networks:
# npm_public:
# name: npm_public
# driver: bridge
networks:
npm_public:
external: true
services:
npm:
image: 'jc21/nginx-proxy-manager:latest'
container_name: nginx-proxy-manager
restart: unless-stopped
# 🌟 端口映射安全策略
ports:
- '80:80' # HTTP 流量入口(公网开放)
- '443:443' # HTTPS 流量入口(公网开放)
- '127.0.0.1:81:81' # 🌟 核心安全:管理后台仅允许宿主机本地访问,外网无法肉身翻墙
environment:
- TZ=Asia/Shanghai # 🌟 强行同步时区,确保 SSL 证书申请日志、访问日志时间正确
# - DISABLE_IPV6=true # 如果你的环境完全不需要 IPv6,可以取消注释以禁用 NPM 内部的 IPv6 监听
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
networks:
- npm_public
# 🌟 生产环境防御:限制日志文件大小,防止长年累月把宿主机硬盘撑爆
logging:
driver: "json-file"
options:
max-size: "200m" # 单个日志文件最大 200MB
max-file: "5" # 最多保留 5 个日志文件

部署 NPM

Terminal window
docker compose up -d
# 后台登录地址:
http://127.0.0.1:81
# 默认账号密码:
Email: admin@example.com
Password: changeme

docker 开启双栈网络域名证书续期问题

Terminal window
# 让 NPM 内部的 Certbot 强制走 IPv4 域名解析
docker exec -it nginx-proxy-manager bash -c "sed -i 's/#precedence ::ffff:0:0\/96 100/precedence ::ffff:0:0\/96 100/' /etc/gai.conf"
# 验证是否修复
docker exec -it nginx-proxy-manager curl -4 -I https://acme-v02.api.letsencrypt.org/directory
docker exec -it nginx-proxy-manager curl -6 -I https://acme-v02.api.letsencrypt.org/directory
docker exec -it nginx-proxy-manager curl -I https://acme-v02.api.letsencrypt.org/directory