移除Docker Compose端口绑定后Nginx出现Connection refused错误求助
解决Docker Host网络模式下Nginx连接拒绝问题
问题背景
在AWS Ubuntu实例上运行Docker容器时,为了让容器的网络请求看起来来自主机,给所有容器设置了network_mode: "host",并注释了端口绑定(host模式下端口绑定不兼容)。但现在访问时出现Connection refused错误,尝试移除URL中的8501也没用,需要修改Nginx的project.conf配置文件,但不确定具体改法。
提供的配置文件
docker-compose.yml
version: '3' services: app: restart: always build: ./app #ports: # - "8501:8501" env_file: - .env command: streamlit run Main.py network_mode: "host" mariadb: image: mariadb:10.9.3 #ports: # - "3306:3306" volumes: - db_data:/var/lib/mysql - db_conf:/etc/mysql/conf.d environment: MYSQL_ROOT_PASSWORD: "xxx" MYSQL_DATABASE: "xxx" MYSQL_USER: "xxx" MYSQL_PASSWORD: "xxx" MYSQL_ROOT_HOST: "xxx" network_mode: "host" nginx: restart: always build: ./nginx #ports: # - "80:80" depends_on: - app - mariadb volumes: db_data: db_conf:
project.conf
server { listen 80; server_name helloworld-st-app; location / { proxy_pass http://app:8501/; } location ^~ /static { proxy_pass http://app:8501/static/; } location ^~ /healthz { proxy_pass http://app:8501/healthz; } location ^~ /vendor { proxy_pass http://app:8501/vendor; } location /stream { proxy_pass http://app:8501/stream; proxy_http_version 1.1; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_read_timeout 86400; } }
解决方案
核心原因
容器启用host网络模式时,Docker会关闭容器间的DNS解析服务,Nginx配置里用容器名app访问服务的方式会失效,直接导致连接被拒绝。
具体修改步骤
- 更新Nginx的project.conf配置
把所有proxy_pass指令中的app替换为localhost(host模式下容器端口直接绑定在主机网络上),修改后的配置如下:
server { listen 80; server_name helloworld-st-app; location / { proxy_pass http://localhost:8501/; } location ^~ /static { proxy_pass http://localhost:8501/static/; } location ^~ /healthz { proxy_pass http://localhost:8501/healthz; } location ^~ /vendor { proxy_pass http://localhost:8501/vendor; } location /stream { proxy_pass http://localhost:8501/stream; proxy_http_version 1.1; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_read_timeout 86400; } }
- 给Nginx容器添加host网络模式
原docker-compose中Nginx未设置network_mode: "host",导致它无法访问主机上的8501端口,需要补上该配置:
nginx: restart: always build: ./nginx #ports: # - "80:80" depends_on: - app - mariadb network_mode: "host"
- 验证端口监听状态
在AWS Ubuntu实例上执行以下命令,确认8501(Streamlit)、3306(MariaDB)、80(Nginx)端口都被对应进程正常监听:
netstat -tulpn
- 检查App的数据库连接配置
如果Streamlit应用连接MariaDB时用的是容器名mariadb,同样要改成localhost或者主机内网IP,否则也会出现连接失败问题。
内容的提问来源于stack exchange,提问作者divyashie
相关产品推荐
相关产品推荐

