无法使用链接的 mysql 数据库在 docker 中启动应用程序

Posted

技术标签:

【中文标题】无法使用链接的 mysql 数据库在 docker 中启动应用程序【英文标题】:Can't start application within docker using linked mysql database 【发布时间】:2016-02-29 22:13:55 【问题描述】:

我正在使用 docker 来运行我的 nodejs 应用程序,数据库很少,其中之一是 mysql

我在 docker hub 上找到了 mysql 镜像并在我的 docker-compose.yml 中使用它

app:
  build: .
  volumes:
    - ./:/var/www/app/
  working_dir: /var/www/app/
  command: node app.js
  ports:
    - "3000:3000"
  links:
    - mongo
    - elasticsearch
    - mysql

mysql:
  image: mysql
  environment:
    MYSQL_DATABASE: testdb

mongo:
  image: mongo

elasticsearch:
  image: elasticsearch

一切构建和应用程序使用 mysql 连接配置,看起来像这样:

mysql: 
      host: 'localhost',
      user: 'root',
      password: '',
      database: 'testdb'
    

应用程序尝试在mysql连接错误时启动和停止。

Error: connect ECONNREFUSED 127.0.0.1:3306

我想知道 docker mysql 图像是否可以通过撰写文件链接到应用程序容器。请说明如何正确链接mysql容器。

提前致谢!

我自己的回答

当您使用任何类型的链接其他容器(external_link 或链接)时,您可以根据容器的名称在应用程序配置文件中设置进程环境变量

process.env.<container_name>_PORT_<container_port>

SailsJS 到 Mongo 示例:

我有一个名为 mongo_dev 的容器,它在我的 docker compose 文件中连接为

external_links:
  - mongo_dev

所以在我的应用程序配置中这个环境变量是这样使用的:

mongo: 
      module   : 'sails-mongo',
      host     : process.env.MONGO_DEV_PORT_27017_TCP_ADDR || 'localhost',
      port     : process.env.MONGO_DEV_PORT_27017_TCP_PORT || '27017',
      user     : null,
      password : null,
      database : 'database_name'
    

【问题讨论】:

包含mysql连接的源代码 How to handle IP addresses when linking docker containers with each other using docker-compose?的可能重复 当我使用没有 docker 的本地 mysql 服务器时,mysql 连接工作正常。我的连接配置已附加到此问题。 【参考方案1】:

使用连接字符串如下: mysql://username:password@mysql:3306/demo

【讨论】:

【参考方案2】:

链接的mysql 容器将是您的 mysql 主机

mysql:  host: 'mysql', user: 'root', password: '', database: 'testdb' 

您将看到所有链接的主机都以/etc/hosts 命名,例如:

172.17.0.2  composetest_mysql_1 fffb39e63df6
172.17.0.2  mysql fffb39e63df6 composetest_mysql_1
172.17.0.2  mysql_1 fffb39e63df6 composetest_mysql_1

【讨论】:

/etc/hosts 位对我的调试很有帮助 Docker 已从用户定义网络上的本地 DNS 服务器的链接移出,因此这对非链接容器不可用

以上是关于无法使用链接的 mysql 数据库在 docker 中启动应用程序的主要内容,如果未能解决你的问题,请参考以下文章

无法将 mysql docker 容器与 Spring Boot 应用程序链接 - 通信链接失败

使用 docker-compose 链接 django 和 mysql 容器

Docker节点应用程序无法连接链接的mysql容器

将Docker链接到本地​​MySQL数据库[重复]

为啥 PHP docker 容器无法查找 MYSQL 容器的主机名?

无法在本地环境中使用 docker 连接到 cakephp 中的 mysql 数据库