docker-compose部署PostgreSQL未监听127.0.0.1无法本地访问问题
解决方案
1. 核心配置修改
- 端口绑定调整:将postgres服务的端口映射从默认的全网卡绑定改为仅绑定localhost,避免对外暴露
- 修正app服务的DB_HOST参数多余空格,否则会导致数据库连接失败
- 指定postgres监听规则,保障容器内服务可正常访问的同时不会泄露到外部网络
2. 修改后完整配置
version: "3.7" services: app: build: args: user: admin uid: 1000 context: . dockerfile: Dockerfile image: platform container_name: app restart: unless-stopped environment: - DB_CONNECTION=pgsql - DB_HOST=db # 已删除原配置多余空格 - DB_PORT=5432 - DB_DATABASE=database - DB_USERNAME=username depends_on: - db working_dir: /var/www/ volumes: - ./:/var/www networks: - nginx db: image: postgres:10-alpine container_name: db restart: unless-stopped environment: - POSTGRES_USER=${DB_USERNAME} - POSTGRES_PASSWORD=${DB_PASSWORD} - POSTGRES_DB=${DB_DATABASE} command: postgres -c listen_addresses='*' # 保留容器内网访问权限,外部访问由端口绑定规则限制 ports: - "127.0.0.1:5432:5432" # 仅绑定宿主机localhost的5432端口 volumes: - ./db1:/docker-entrypoint-initdb.d/db1 - ./docker-compose/postgres:/var/lib/postgresql/data networks: - nginx nginx: image: nginx:alpine container_name: nginx restart: unless-stopped ports: - "8000:80" volumes: - ./:/var/www - ./docker-compose/nginx:/etc/nginx/conf.d/ networks: - nginx depends_on: - db networks: nginx: driver: bridge
3. 生效方式
先停止原有服务并清理残留配置(操作前注意备份重要数据库数据):
docker-compose down -v
再重新启动服务:
docker-compose up -d
4. 效果验证
- 宿主机层面:仅能通过
127.0.0.1:5432访问postgres服务,使用宿主机其他网卡IP无法访问 - 同部署栈服务:app、nginx容器可通过服务名
db:5432正常访问数据库 - postgres不会再绑定随机内网地址对外提供服务
内容的提问来源于stack exchange,提问作者Tim Bogdanov
相关产品推荐
相关产品推荐

