Docker 网络转发失败

问题描述 投票:0回答:1

我遇到了有关 Docker 网络的问题。我使用 Docker Compose 和 Docker Desktop 设置了 php(非框架)和 mysql。 Mysql 使用端口 3636 并且工作完美,例如:我可以在 Docker 容器内和我的本地容器上访问他。但是,一旦我使用 php 打开 Web 应用程序,我就可以在 Docker 容器内执行curl 操作并收到 302 消息,并且可以通过命令行查看该应用程序,但是一旦我在本地环境(我的计算机)上尝试它,我就得到了以下错误:

  • curl: (56) Recv failure: Connection reset by peer

这似乎没有意义,我的Web应用程序运行在36001上,我调试它并得到以下信息:

我的电脑:

  • 本地主机[127.0.0.1] 36001打开
  • com.docke 23209 *** 97u IPv6 0x5***d5b 0t0 TCP *:36001(监听)

Docker 容器:

  • 用户 tcp 0 0 127.0.0.1:36001 0.0.0.0:* 听
  • 连接到本地主机(127.0.0.1)36001端口[tcp/*]成功!
  • {"36001/tcp":[{"HostIp":"0.0.0.0","HostPort":"36001"}],"80/tcp":null}

Docker 堆栈跟踪(日志):

2024-03-27 19:25:34 [Wed Mar 27 18:25:34 2024] PHP 8.3.4 Development Server (http://127.0.0.1:36001) started
2024-03-27 19:26:04 [Wed Mar 27 18:26:04 2024] 127.0.0.1:54472 Accepted
2024-03-27 19:26:04 [Wed Mar 27 18:26:04 2024] 127.0.0.1:54472 [302]: GET /
2024-03-27 19:26:04 [Wed Mar 27 18:26:04 2024] 127.0.0.1:54472 Closing

Docker 组成:

version: "3.8"

services:
  web:
    container_name: ${CONTAINER_NAME?error}
    env_file:
      - path: .env
        required: true
    environment:
      LANGUAGE: ${LANGUAGE?error}
    stdin_open: true
    tty: true
    build:
      context: .
      args:
        LANGUAGE: ${LANGUAGE?error}
      dockerfile: Dockerfile
    ports:
      - "${WEB_PORT?error}:${WEB_PORT?error}"
    volumes:
      - .:${CONTAINER_WORKDIR?error}
    depends_on: # only if you're using the database service
        - database
    networks:
      - testnetwork
    init: true

  # Conditionally include database service if DATABASE_ENGINE is not 'none'
  database:
    env_file:
      - path: .env
        required: true
    environment:
      MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
      MYSQL_ROOT_HOST: "%"
      MYSQL_DATABASE: '${DB_NAME}'
      MYSQL_USER: ${DB_USER}
      MYSQL_PASSWORD: '${DB_PASSWORD}'
      MYSQL_ALLOW_EMPTY_PASSWORD: 1
      DATABASE_PORT: ${DATABASE_PORT?error}
      DB_SQL_PATH: ${DB_SQL_PATH?error}
    image: ${DATABASE_ENGINE}:${DB_VERSION}
    command: mysqld --sql_mode=""
    hostname: mysql
    ports:
        - '${DATABASE_PORT?error}:${DATABASE_PORT?error}'
    volumes:
        - 'test-mysql:/var/lib/mysql'
        - './${DB_SQL_PATH?error}:/docker-entrypoint-initdb.d/${DB_SQL_PATH?error}'
    networks:
        - testnetwork
    healthcheck:
        test: [ "CMD", "mysqladmin", "ping", "-p test" ]
        retries: 3
        timeout: 5s

networks:
    testnetwork:
        driver: bridge

volumes:
    test-mysql:
        driver: local

Docker Compose 根据参数和环境进行了修改,否则问题中将显示很长的代码。

docker networking dns apache2 local
1个回答
0
投票

您的应用程序绑定到环回接口(127.0.0.1)。这意味着它只接受来自那里的连接。在容器中,它只接受来自容器内部的连接。

您需要绑定到 0.0.0.0 才能接受来自容器外部的连接。

要查找的关键日志消息是

Development Server (http://127.0.0.1:36001) started
。需要更改为 0.0.0.0.

© www.soinside.com 2019 - 2024. All rights reserved.