如何通过应用程序容器连接mysql容器的localhost:3306-docker

时间:2018-07-25 07:39:16

标签: docker containers

在我的应用程序设置中,我使用以下设置连接到数据库

spring.jpa.hibernate.ddl-auto=none
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/gosallowMultiQueries=true&createDatabaseIfNotExist=true
spring.datasource.username=root
spring.datasource.password=root

现在我有两个容器App和mysql。我已经链接了两个容器

docker run --name app --link mysql:dbalias appimage

但是我收到通讯链接失败错误。我无法连接mysql服务器

我使用以下命令运行mysql容器:

docker run --name mysql -e MYSQL_ROOT_PASSWORD=root -d -p 3306:3306 mysql:latest

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

您要指向localhost,这意味着该应用正在尝试连接到其自己的容器的localhost。不是主机的本地主机。

如果将这两个容器部署在同一用户定义的网桥网络内,则可以使用容器名称进行通信:

spring.datasource.url = jdbc:mysql:// mysql:3306 / gosallowMultiQueries = true&createDatabaseIfNotExist = true

如果不是,则可以使用mysql容器的容器IP,但是当容器重新启动/重新创建时,这可以更改。推荐的方法是创建用户定义的桥接网络:

$ docker network create my-network
$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
73df63463bb2        bridge              bridge              local
4cabe965c01d        host                host                local
c94ae182d8fa        my-network          bridge              local
93ec6f5bf028        none                null                local

并在同一网络中启动两个容器:

$ docker run --name mysql --network=my-network -e MYSQL_ROOT_PASSWORD=root -d -p 3306:3306 mysql:latest

当两个容器都在同一用户定义的网络内启动时,您可以使用容器名称进行通信(可以通过其中一个容器内的docker exec进行测试,并尝试使用容器名称对另一个容器进行ping操作)。