再写一点关于docker的问题吧,其实没必要用ufw来管理docker的端口开放,docker会自己写入iptables规则用以管控端口,以docker compose为例:
1. 对于数据库或者redis之类仅在应用内使用的服务:
- 仅在容器内部网络内开放,compose拉起时会创建一个名为
第一个服务名_default
的bridge,可以用docker network ls
查看。 - 容器默认对该内部网络开放所有端口。
- 同一网络内的其他容器可以通过容器名和端口访问该服务。
- 没有加入该网络的容器无法访问任何端口。
- 对于仅在内部网络中暴露端口的服务,无需在
ports
下指定任何映射
2. 对于需要进行反代的服务:
- 仅在127.0.0.1监听即可防止外部端口访问,在对应容器处使用
ports:
- 127.0.0.1:端口:端口
3. 对于需要外部直接访问端口的服务:
- 直接使用
ports:
- 端口:端口
同样的,贴一个示例compose.yml
services:
rsshub:
image: diygod/rsshub:latest
restart: always
ports:
- 127.0.0.1:1200:1200
environment:
NODE_ENV: production
CACHE_TYPE: redis
REDIS_URL: "redis://redis:6379/"
PUPPETEER_WS_ENDPOINT: "ws://browserless:3000"
env_file:
- .env
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:1200/healthz"]
interval: 30s
timeout: 10s
retries: 3
depends_on:
- redis
- browserless
browserless:
image: browserless/chrome
restart: always
ulimits:
core:
hard: 0
soft: 0
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/pressure"]
interval: 30s
timeout: 10s
retries: 3
redis:
image: redis:alpine
restart: always
volumes:
- ./data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 30s
timeout: 10s
retries: 5
start_period: 5s
sb:
image: ghcr.io/sagernet/sing-box
container_name: sb
restart: always
volumes:
- ./sing-box:/etc/sing-box/
command: -D /var/lib/sing-box -C /etc/sing-box/ run