我有台小的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没有被安装的情况下开始下面的步骤:
- 创建容器网络
- 修改docker-compose.yml文件并启动NPM
- 启动其他服务
- 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