Ham*_*nce 1 docker docker-compose
我有包含两个服务的 docker-compose.yml 文件:
version: "3.7"
services:
api:
container_name: dev_api
environment:
- DATABASE_PUBLIC_URL=${DATABASE_URL} # Not used yet
build: .
restart: always
ports:
- "4100:4100"
networks:
- backend
depends_on:
- db
db:
image: mcr.microsoft.com/mssql/server:2017-latest
restart: always
ports:
- "1433:1433"
environment:
ACCEPT_EULA: "Y"
SA_PASSWORD: "Abc123**"
networks:
- backend
networks:
backend:
driver: bridge
Run Code Online (Sandbox Code Playgroud)
当我运行它时docker-compose up
,我得到:
...
021-10-22 14:54:20.77 spid11s The tail of the log for database model is being rewritten to match the new sector size of 4096 bytes. 2048 bytes at offset 75776 in file /var/opt/mssql/data/modellog.ldf will be written.
dev_api | App is running at http://localhost:4100 in development mode
dev_api | Press CTRL-C to stop
dev_api |
dev_api | ConnectionError: Failed to connect to localhost:1433 - Could not connect (sequence)
dev_api | at /usr/src/app/node_modules/mssql/lib/tedious/connection-pool.js:71:17
dev_api | at Connection.onConnect (/usr/src/app/node_modules/tedious/lib/connection.js:1043:9)
dev_api | at Object.onceWrapper (node:events:510:26)
dev_api | at Connection.emit (node:events:390:28)
dev_api | at Connection.emit (/usr/src/app/node_modules/tedious/lib/connection.js:1071:18)
dev_api | at Connection.socketError (/usr/src/app/node_modules/tedious/lib/connection.js:1669:12)
dev_api | at /usr/src/app/node_modules/tedious/lib/connection.js:1428:21
dev_api | at SequentialConnectionStrategy.connect (/usr/src/app/node_modules/tedious/lib/connector.js:129:14)
dev_api | at Socket.onError (/usr/src/app/node_modules/tedious/lib/connector.js:149:12)
dev_api | at Socket.emit (node:events:390:28) {
dev_api | code: 'ESOCKET',
dev_api | originalError: ConnectionError: Failed to connect to localhost:1433 - Could not
dev_api | }
2021-10-22 14:54:20.80 spid5s Converting database 'msdb' from version 862 to the current version 869.
2
...
Run Code Online (Sandbox Code Playgroud)
我可以从 访问应用程序htpp://localhost:4100
,但由于无法访问数据库而出现错误
项目中,有一个文件ormconfig.json
,数据库主机需要更改。
您应该将 API 配置为使用 DNS 名称与 Docker Compose 网络内的 MSSQL 实例进行通信。像下面这样
api:
container_name: dev_api
environment:
- DATABASE_PUBLIC_URL=db
Run Code Online (Sandbox Code Playgroud)
请注意,您的 MSSQL 容器实例名为db
。
当容器尝试访问 时localhost
,就像任何其他机器尝试与自身通信一样。在您的情况下,Node API 容器不会在其上运行 MSSQL,因此它将失败。
在 Docker Compose 网络中,使用服务名称或自定义主机名与其他容器进行通信。