容器无法在 docker-compose 中连接到 microsoft sql server

Ham*_*nce 1 docker docker-compose

我有包含两个服务的 docker-compose.yml 文件:

  • NodeJs API
  • 微软MSSQL数据库

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,数据库主机需要更改。

cla*_*arj 5

您应该将 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 网络中,使用服务名称或自定义主机名与其​​他容器进行通信。