Podman 环境使用 Nginx Proxy Manager 最佳实践
2024-7-18
·
hexer

我有台小的vps,2核1g

目标是,上面的所有服务都只能从nginx(nginx proxy manager)访问,不对外暴露服务端口

原来的freshrss,用的是下面的命令构建的容器

podman run -d --restart unless-stopped --log-opt max-size=10m \
  -p 8080:80 \
  -e TZ=Europe/Paris \
  -e 'CRON_MIN=1,31' \
  -v ./data:/var/www/FreshRSS/data \
  -v ./extensions:/var/www/FreshRSS/extensions \
  --name freshrss \
  freshrss/freshrss

端口映射使用的是桥接模式,故宿主机的防火墙无法管理到8080

参考了文档后,我成功实现,在不暴露容器端口的情况下通过nginx访问服务

其基本原理是,将多个容器置于同个网络中,让nginx proxy manager可以访问到,且容器的端口不保留给外界

前情提要

  • vps上安装的是podman,并不是docker(本文忽略podman和podman compose的安装过程)
  • podman的命令几乎完全和docker兼容,故下面所有的操作只需要替换到podman换成docker也可以正常使用
  • 下面的nginx proxy manager用NPM代替

个人习惯于,在~/app/中存放docker/podman的资源,例如:

  • 使用podman run的情况:建立~/app/freshrss/docker.sh文件,里面的就是上面那个freshrss的容器运行命令,在~/app/freshrss底下输入bash docker.sh即可启动容器,其中的容器卷也映射到了本地,例如./data./extensions
  • 使用podman compose的情况:建立~/app/freshrss/docker-compose.yml,在~/app/freshrss中输入podman compose up -d即可启动,容器卷叶映射到了本地

在nginx proxy manager没有被安装的情况下开始下面的步骤:

  1. 创建容器网络
  2. 修改docker-compose.yml文件并启动NPM
  3. 启动其他服务
  4. NPM映射

创建容器网络

# 创建容器网络
podman network create nginx-net

其中nginx-net是可以随意变换的,只要其他的容器加入到这个网络就行

# 查看容器所属的网络名
podman inspect -f '{{.NetworkSettings.Networks}}' <container_id_or_name>

启动NPM

我们需要修改官方提供的docker-compose.yml文件

官方提供的:

version: '3.8'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'
      - '443:443'
      - '81:81'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

其中ports默认是以桥接的模式对外开放的,即宿主机没办法用防火墙控制,而我们需要修改的是所属的网络

version: '3.8'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    networks: # 新增
      - nginx-net
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

networks: # 新增
  nginx-net:
    external: true # 该网络已经存在

docker-compose.yml存入~/app/nginx-proxy-manager中,并在其中输入podman compose up -d

查看是否成功启动

可以用下面的命令查看容器所属的网络名,后面的其他程序也同样适用

podman inspect -f '{{.NetworkSettings.Networks}}' <container_id_or_name>

启动其他程序

如果是使用podman compose的程序,那么就和上面的NPM一样,增加网络部分

如果是使用podman run的程序,可以按照下面的步骤执行

原本的命令是:

podman run -d --restart unless-stopped --log-opt max-size=10m \
  -p 8080:80 \ # 这行删掉,然后增加网络设置
  -e TZ=Europe/Paris \
  -e 'CRON_MIN=1,31' \
  -v ./data:/var/www/FreshRSS/data \
  -v ./extensions:/var/www/FreshRSS/extensions \
  --name freshrss \
  freshrss/freshrss

修改成:

podman run -d --restart unless-stopped --log-opt max-size=10m \
  --network nginx-net \
  -e TZ=Europe/Paris \
  -e 'CRON_MIN=1,31' \
  -v ./data:/var/www/FreshRSS/data \
  -v ./extensions:/var/www/FreshRSS/extensions \
  --name freshrss \
  freshrss/freshrss

将上面的命令写入~/app/freshrss/docker.sh中,然后在输入bash docker.sh即可

NPM映射

在NPM的UI界面修改反向代理,例如freshrss容器名就是freshrss,且原本暴露的端口是80,那么反向代理就可以写成这样:https://freshrss:80

最后检查是否无误

快速手册

  • docker-compose.yml中删掉端口,加入:
servers:
  app:
    networks:
      - nginx-net

networks:
  nginx-net:
    external: true
  • docker运行命令中去掉端口,加入--network nginx-net

  • 访问地址是容器名+原来的端口,例如https://freshrss:80

  • 可以参考docker-compose.yml