如何在Docker Compose文件(docker-compose.yml)中连接容器?

6

我无法使用Docker Compose将MySQL和Play容器进行链接。请看下面的yml文件:

zookeeper:
    image: zookeeper:3.4
    ports:
       - 2181:2181
kafka:
    image: ches/kafka:latest
    ports:
       - 9092:9092
    links: 
       - zookeeper
myDpm:
    image: dpm-image:latest
    ports:
       - 9000:9000
    links:
       - kafka
       - zookeeper
mySql:
    image: mysql:latest
    environment:
       MYSQL_ROOT_PASSWORD: root
myMc3:
    image: mc3-v3:3.0
    ports:
        - 9001:9000
    links:
        - mySql:3306  
    environment:
       runMode: dev
myElastic:
    image: elasticsearch:2.4.0
    ports:
        - 9200:9200

我想在我的play scala项目中链接mysql,但是出现了一个错误:

[错误] - [play.core.server.netty.PlayDefaultUpstreamHandler] - 无法调用操作 java.sql.SQLTimeoutException: 在等待连接10001ms后超时。 at com.zaxxer.hikari.pool.BaseHikariPool.getConnection(BaseHikariPool.java:227) ~[com.zaxxer.HikariCP-java6-2.3.7.jar:na] at com.zaxxer.hikari.pool.BaseHikariPool.getConnection(BaseHikariPool.java:182) ~[com.zaxxer.HikariCP-java6-2.3.7.jar:na] at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:93) ~[com.zaxxer.HikariCP-java6-2.3.7.jar:na] at slick.jdbc.hikaricp.HikariCPJdbcDataSource.createConnection(HikariCPJdbcDataSource.scala:12) ~[com.typesafe.slick.slick-hikaricp_2.11-3.1.1.jar:na] at slick.jdbc.JdbcBackend$BaseSession.conn$lzycompute(JdbcBackend.scala:415) ~[com.typesafe.slick.slick_2.11-3.1.1.jar:na] at slick.jdbc.JdbcBackend$BaseSession.conn(JdbcBackend.scala:414) ~[com.typesafe.slick.slick_2.11-3.1.1.jar:na] at slick.jdbc.JdbcBackend$SessionDef$class.prepareStatement(JdbcBackend.scala:297) ~[com.typesafe.slick.slick_2.11-3.1.1.jar:na] at slick.jdbc.JdbcBackend$BaseSession.prepareStatement(JdbcBackend.scala:407) ~[com.typesafe.slick.slick_2.11-3.1.1.jar:na] at slick.jdbc.StatementInvoker.results(StatementInvoker.scala:33) ~[com.typesafe.slick.slick_2.11-3.1.1.jar:na] at slick.jdbc.StatementInvoker.iteratorTo(StatementInvoker.scala:22) ~[com.typesafe.slick.slick_2.11-3.1.1.jar:na] at slick.jdbc.Invoker$class.foreach(Invoker.scala:48) ~[com.typesafe.slick.slick_2.11-3.1.1.jar:na] at slick.jdbc.StatementInvoker.foreach(StatementInvoker.scala:16) ~[com.typesafe.slick.slick_2.11-3.1.1.jar:na] at slick.jdbc.Invoker$class.firstOption(Invoker.scala:24) ~[com.typesafe.slick.slick_2.11-3.1.1.jar:na] at slick.jdbc.StatementInvoker.firstOption(StatementInvoker.scala:16) ~[com.typesafe.slick.slick_2.11-3.1.1.jar:na] at slick.jdbc.StreamingInvokerAction$HeadOptionAction.run(StreamingInvokerAction.scala:57) ~[com.typesafe.slick.slick_2.11-3.1.1.jar:na] at slick.jdbc.StreamingInvokerAction$HeadOptionAction.run(StreamingInvokerAction.scala:56) ~[com.typesafe.slick.slick_2.11-3.1.1.jar:na] at slick.backend.DatabaseComponent$DatabaseDef$$anon$2.liftedTree1$1(DatabaseComponent.scala:237) ~[com.typesafe.slick.slick_2.11-3.1.1.jar:na] at slick.backend.DatabaseComponent$DatabaseDef$$anon$2.run(DatabaseComponent.scala:237) ~[com.typesafe.slick.slick_2.11-3.1.1.jar:na] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[na:1.8.0_111] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[na:1.8.0_111] at java.lang.Thread.run(Thread.java:745) ~[na:1.8.0_111] 原因: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 通信链接失败
3个回答

10
此处所述,Docker链接在某种程度上已被网络取代。

在 Docker 网络功能推出之前,您可以使用 Docker 链接功能来使容器相互发现。随着 Docker 网络的引入,容器的名称可以自动被发现。

默认情况下,如果没有定义其他网络,则compose文件中的所有容器都加入默认网络,并且您应该能够通过使用服务名称和正确的端口(例如:mySql:3306)从一个服务访问另一个服务。
有关更多信息,请参见Docker 的网络文档

这句话解决了我的问题:“你应该能够通过使用服务名称从一个服务访问另一个服务。” - Matias Haeussler

1

正确连接到MySQL:

myMc3:
  ...
  links:
    - mySql

(去掉3306)


-1
如果mc3-v3:3.0需要mysql容器,那么您将使用depends on来解决依赖关系。它将首先运行mysql,然后运行mc3。
而且,请确保在mc3-v3中使用mysql:3306的代码连接mysql或使用mysql容器IP进行连接。
myMc3:
image: mc3-v3:3.0
ports:
    - 9001:9000
depends:
    - mySql
environment:
   runMode: dev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接