【发布时间】:2016-06-10 14:30:19
【问题描述】:
我目前在一个容器中有一个 Java 应用程序 (.jar),我正在使用 docker-compose.yml 在第二个容器中创建一个 mysql 数据库实例。
我想知道容器 1 是否有可能与容器 2 交互,并能够从 mysql 数据库读取/写入数据
如果可能的话,我会怎么做?
【问题讨论】:
标签: java mysql docker docker-compose dockerfile
我目前在一个容器中有一个 Java 应用程序 (.jar),我正在使用 docker-compose.yml 在第二个容器中创建一个 mysql 数据库实例。
我想知道容器 1 是否有可能与容器 2 交互,并能够从 mysql 数据库读取/写入数据
如果可能的话,我会怎么做?
【问题讨论】:
标签: java mysql docker docker-compose dockerfile
每个容器都像是在您的实际机器中运行的虚拟机。他们有一个连接所有这些的虚拟网络。它们可以像真实网络上的真实机器一样相互通信。
当您在 yaml 中指定链接时,例如来自documentation 的示例:
web:
links:
- db
结果将是在web 容器内,主机名db 将解析为db 容器的虚拟IP。您实际上可以在web 容器中执行ping db,您应该会看到db 容器的答案。
对于 mysql,假设您在示例中将 mysql 容器命名为 db 并像上面一样将您的应用程序链接到它,您只需编写假定此主机名的代码。例如。你会连接到jdbc:mysql://db:3306/databasename。端口取决于您使用的图像所公开的内容。
如果您想让容器在实际不同的机器上运行,这会变得很棘手,因为您需要一种方法来访问这些机器内的虚拟容器网络。有诸如代理、转发端口、覆盖网络之类的方法……但这超出了 compose 的能力。
【讨论】:
从代码来看,交互是一样的。
Docker 中的 MySQL 在特定主机名和端口上公开服务。使用它的程序使用该主机名和端口。 Docker 使您能够在 MySQL 之外进行配置,但 Java 代码是相同的。
【讨论】:
是的,通过网络链接容器是标准功能。 正如 Peter Lawrey 所提到的,您只需像往常一样使用 Java 中的数据库连接配置您想要连接的服务或 docker 容器的名称。
version: "2"
services:
web:
image: myapp
networks:
- myapp
db:
image: mysql
networks:
- myapp
networks:
myapp:
driver: bridge
那么你有一个网络可以连接
$ docker-compose start
Starting composenetworks_web_1
Starting composenetworks_db_1
$ docker exec composenetworks_web_1 ping db
PING mysql (172.22.0.3): 56 data bytes
64 bytes from 172.22.0.3: seq=0 ttl=64 time=0.093 ms
【讨论】: