无法使用链接的 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 容器