我遇到了有关 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上,我调试它并得到以下信息:
我的电脑:
Docker 容器:
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 根据参数和环境进行了修改,否则问题中将显示很长的代码。
您的应用程序绑定到环回接口(127.0.0.1)。这意味着它只接受来自那里的连接。在容器中,它只接受来自容器内部的连接。
您需要绑定到 0.0.0.0 才能接受来自容器外部的连接。
要查找的关键日志消息是
Development Server (http://127.0.0.1:36001) started
。需要更改为 0.0.0.0.