AI导读:在使用VPS部署Docker项目时,由于该VPS没有外部防火墙,只能依赖Ubuntu内部的UFW防火墙。最初,通过禁止所有端口并仅放开必要端口来进行配置。然而,发现Docker会直接修改iptables,绕过UFW设置,导致端口依然可以访问。虽然禁用Docker修改iptables权限可以解决问题,但会影响Docker容器的内部通信,导致服务无法正常访问。最终解决方案是使用默认UFW防火墙规则禁止所有端口,同时让Docker容器加入统一网络,并通过Nginx容器处理外部访问,容器间使用服务名称进行通信。
起因
整了一个vps,想要docker部署一些项目,这渣机根本没有外部防火墙,只能使用Ubuntu内部的ufw防火墙。
禁止全部,然后放开使用端口,简单
docker启动,nginx映射正常,完美?
端口还能继续访问?docker无视ufw,直接修改iptables
搜了一下,基本都是禁用docker对iptables的修改权限,和对docker专修改的ufw版本。但是禁用docker对iptables修改权限直接导致docker内部通信都失败了。nginx都无法访问了。
最终还是使用默认的ufw禁止全部,然后让docker容器都加入统一网络,端口都不对外开放,统一使用nginx容器外处理,地址使用服务名称如http://db:3306
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| version: '3.3'
services: app: networks: - docker_network image: 'chishin/nginx-proxy-manager-zh:release' restart: unless-stopped ports: - '80:80' - '443:443' environment: DB_MYSQL_HOST: "db" DB_MYSQL_PORT: 3306 DB_MYSQL_USER: "npm" DB_MYSQL_PASSWORD: "npm" DB_MYSQL_NAME: "nginxproxymanager" depends_on: - db volumes: - ./data:/data - ./letsencrypt:/etc/letsencrypt
db: networks: - docker_network image: 'jc21/mariadb-aria:latest' restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: 'x' MYSQL_DATABASE: 'nginxproxymanager' MYSQL_USER: 'npm' MYSQL_PASSWORD: 'npm' volumes: - ./data/mysql:/var/lib/mysql networks: docker_network: external: true
|