【发布时间】:2020-10-25 15:15:08
【问题描述】:
我在Typescript 中编写了一个应用程序,它使用Typeorm 与MySQL 数据库进行交互。当我使用npm run dev(package.json 脚本)运行应用程序时,使用这些凭据可以正常连接:
"type": "mysql",
"host": "127.0.0.1",
"port": 3306,
"username": "root",
"password": "root",
"database": "mydb",
但是当我启动我的 Docker 容器时,我得到:
> Error: connect ECONNREFUSED 127.0.0.1:3306
> errno: -111,
> code: 'ECONNREFUSED',
> syscall: 'connect',
> address: '127.0.0.1',
> port: 3306,
> fatal: true
我无法解决这个问题,我也尝试将127.0.0.1 更改为localhost,但同样的问题。这很奇怪,因为我使用Dbeaver 连接我的LAMP,这也是一个Docker 容器容器,我可以建立连接。
似乎只与容器连接有关的问题,也许应用程序的容器不知道网络127.0.0.1?
这是我的图片文件:
FROM node:stretch-slim
WORKDIR /myapp
COPY package.json ./
COPY ./dist ./dist
RUN npm install
EXPOSE 4000
ENV NODE_ENV development
ENV PORT 4000
ENV URL http://localhost:4000
ENV JWT_SECRET secret
CMD ["npm", "run", "start", "dev"]
这是我的docker-compose.yml:
version: '3'
services:
app:
container_name: myapp
restart: always
build: .
ports:
- '4000:4000'
为了编译我的容器,我做了:docker-compose up --build
怎么了?从我的lamp 容器中可以看出,每个端口都正确暴露:
【问题讨论】:
-
lamp_db_1是数据库主机名,使用它代替 localhost 或 127.0.0.1 -
@abestrad 如果我这样做,我会得到:getaddrinfo ENOTFOUND lamp_db_1
-
假设它们在同一个
docker-compose.yml文件中(这些容器名称表明它们是),Compose 服务块名称db也将用作主机名。 Docker 中的localhost几乎总是“这个容器”,而不是另一个容器或主机。 -
您如何在 compose 中声明您的网络?默认情况下,它会为您的应用程序设置一个网络。每个服务都应该加入默认网络,并且该网络上的其他服务都可以访问。和 可发现 使用主机名(容器名称)
-
Networking in Compose 是有用的背景资料;它描述了 Compose 自动为您执行的设置,以及默认情况下可以访问的主机名。
标签: mysql node.js docker docker-compose docker-networking