无法使用Docker容器连接到MySQL数据库

hrirmatl  于 2022-12-18  发布在  Docker
关注(0)|答案(3)|浏览(349)

我在Typescript中编写了一个应用程序,它使用TypeormMySQL数据库交互。当我使用npm run devpackage.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

我无法解决这个问题,我也尝试过用localhost来修改127.0.0.1,但是同样的问题。这很奇怪,因为我用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容器中看到的,每个端口都正确地暴露出来了:

avwztpqn

avwztpqn1#

这里的问题是每个容器使用它们自己的网络,即使我在端口3306上公开了mysql容器,我也无法从myapp容器访问mysql,因为myapp容器使用另一个网络。
因此,执行以下命令:docker network ls我能够列出所有可用的网络,然后我做了:

docker network inspect bridge

该函数返回以下gateway:172.17.0.1
解决方案是将localhost替换为172.17.0.1,但我不太喜欢下面的解决方案,所以我重新构建了myapp映像,在docker-compose.yml中添加了以前的network_mode,所以现在我有:

version: '3'
services:
  app:
    container_name: myapp
    restart: always
    build: .
    ports:
      - '4000:4000'
    network_mode: 'host'

如文件所述:
如果对container使用主机网络模式,则该container的网络堆栈不会与Docker主机隔离(container共享主机的网络名称空间),并且不会为container分配自己的IP地址。例如,如果运行绑定到端口80的container并使用主机网络,则container的应用程序可在主机IP地址的端口80上使用。
我不知道是否有更好的解决方案,到目前为止,我是一个Docker的新手,所以也许有人在这方面更Maven可以提出一个更好的解决方案,共享一个容器网络,如mysql,然后从其他容器访问该共享网络。
另一个解决方案是"host": "host.docker.internal"

polkgigr

polkgigr2#

一个月一个月

docker-compose并不局限于一个服务,您可以拥有整个系统,在您的情况下,这意味着数据库服务器、应用程序和所有其他东西。
您可以将您的docker-compose.yml文件更改为如下所示(MySQL位复制自https://hub.docker.com/_/mysql

version: '3'
services:

  db:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example

  app:
    container_name: myapp
    restart: always
    build: .
    ports:
      - '4000:4000'

网络
因为你的container是在同一个docker-compose中启动的,默认情况下它们可以通过主机名访问彼此,例如appdb。要尝试这个,启动它们,docker attach/execapp,然后尝试ping db
参见https://stackoverflow.com/a/30173220/1148483
这意味着在您的应用中,您可以使用db作为DB主机配置。

2j4z5cfb

2j4z5cfb3#

我们不使用localhost,而使用host.docker.internal。这将允许您连接本地数据库

相关问题