【发布时间】:2022-01-24 22:16:09
【问题描述】:
我正在对一个具有多个不同服务的应用程序进行 docker 化,并且我使用 Docker Compose 文件为所有服务实现了这个单一的 docker-compose.yml 文件,并为每个服务实现了一个 Dockerfile。
- 前端(角度)[http://localhost:4200]
- 后端(PHP)[http://localhost:80]
- 后端数据库(Mysql)
- 集成服务(NodeJS)[http://localhost:4433]
- 集成服务数据库(MongoDB)
- 身份验证层(NodeJS)[http://localhost:4454]
- 身份验证层数据库(Mysql)
到目前为止,我已经成功地将所有这些服务容器化,但是当我的“Backend(PHP)”容器尝试从“Integration Service(NodeJS)”调用 API 时,它会抛出 cURL error 7: Failed to connect to localhost port 4433: Connection refused (see http://curl.haxx.se/libcurl/c/libcurl-errors.html) 的错误。
services:
angular-service:
container_name: wms_frontend
build: ../frontend/.
ports:
- "4200:80"
php:
build:
context: .
image: wms-backend
networks:
- frontend
- backend
environment:
- MYSQL_HOST=wms-backend-mysql-app
- MYSQL_USER=wmsroot
- MYSQL_PASSWORD=pass
- MYSQL_DB=dbname
volumes:
- ./:/var/www/html/wms/backend
ports:
- "80:80"
container_name: wms-backend-php-app
mysql:
image: mysql:5.7
networks:
- backend
environment:
- MYSQL_ROOT_PASSWORD=rootpassword
- MYSQL_USER=wmsroot
- MYSQL_PASSWORD=pass
- MYSQL_DATABASE=
volumes:
- ./dump:/docker-entrypoint-initdb.d
container_name: wms-backend-mysql-app
phpmyadmin:
image: phpmyadmin/phpmyadmin:4.7
depends_on:
- mysql
networks:
- backend
ports:
- "40002:80"
environment:
- PMA_HOST=wms-backend-mysql-app
- PMA_PORT= 3306
volumes:
- /sessions
container_name: wms-backend-phpmyadmin-app
app:
container_name: wms_auth
restart: always
build: ../../wms_auth/.
networks:
- backend
volumes:
- ../../auth/./:/usr/src/app
- /usr/src/app/node_modules
ports:
- "4454:4454"
links:
- db
depends_on:
db:
condition: service_healthy
db:
image: mariadb
restart: always
ports:
- "3308:3306"
environment:
- MYSQL_ALLOW_EMPTY_PASSWORD= YES
- MYSQL_DATABASE=auth
- MYSQL_USER= root
- MYSQL_PASSWORD=
volumes:
- ../../auth/dump/:/docker-entrypoint-initdb.d
networks:
- backend
healthcheck:
test: ["CMD", "mysql", "-h", "db","-u","root", "mysql", "-e", "select 1"]
interval: 1s
retries: 20
wms_integration:
container_name: integration
restart: always
build: ../../wmsIntegeration/.
volumes:
- ../../wmsIntegeration/./:/usr/src/app
- /usr/src/app/node_modules
ports:
- "4433:4433"
networks:
- backend
links:
- db
depends_on:
db:
condition: service_healthy
wms_integration_db:
image: mongo
restart: always
networks:
- backend
ports:
- "27019:27017"
volumes:
- ../../wmsIntegeration/mongodb:/data/db
healthcheck:
test: echo 'db.runCommand("ping").ok' | mongo db:27017/config --quiet
interval: 10s
timeout: 10s
retries: 5
networks:
local:
driver: bridge
networks:
frontend:
backend:
【问题讨论】:
-
您可能希望添加一个指向集成服务的链接,以便您可以在容器之间内部访问它。
-
我怎样才能做到这一点?
-
为什么不使用容器名称或任何自选别名访问另一个容器?另外,当 PHP 代码(你忘了分享)抛出这样的错误时,这真的是 Node 的问题吗?
-
localhost在 Docker 中通常表示“这个容器”;你不能用它来连接容器。正如@NicoHaase 建议的那样,您可以使用 Compose 服务名称作为主机名;有关更多详细信息,请参阅 Docker 文档中的 Networking in Compose。 (各种links:和networks:设置只是令人困惑,我建议将它们全部删除。) -
我也尝试将容器名称用作本地主机,但随后显示“无法解析主机:CONTAINER_NAME”