我目前在一个容器中有一个Java应用程序(.jar),我使用docker-compose.yml在第二个容器中创建一个mysql数据库的实例。
我想知道容器1是否可以与容器2交互,并且能够读取/写入mysql数据库
如果有可能,我该怎么做?
答案 0 :(得分:2)
每个容器就像在实际机器内运行的虚拟机。他们有一个连接所有这些网络的虚拟网络。他们可以像真实网络上的真机一样相互通信。
在yaml中指定链接时,例如来自documentation:
的示例web:
links:
- db
结果将是web
容器内的主机名db
将解析为db
容器的虚拟IP。您实际上可以从ping db
容器中执行web
,您应该会看到db
容器答案。
对于mysql,假设您在示例中命名了mysql容器db
,并将您的应用程序与上面的链接相关联,那么您只需编写承担此主机名的代码即可。例如。您已连接到jdbc:mysql://db:3306/databasename
。端口取决于您使用的图像所暴露的内容。
一旦您希望容器在实际上不同的计算机上运行,就会变得棘手,因为您需要一种方法来访问这些计算机内的虚拟容器网络。有代理,转发端口,覆盖网络等方式......但这超出了撰写的能力。
答案 1 :(得分:0)
从代码的角度来看,交互是相同的。
您在Docker中的MySQL在特定主机名和端口上公开服务。使用它的程序使用该主机名和端口。 Docker使您能够在MySQL外部配置它,但Java代码是相同的。
答案 2 :(得分:0)
是的,通过网络链接容器是标准功能。 正如Peter Lawrey所提到的,您只需使用要连接的服务名称或docker容器在Java中配置数据库连接。
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