Docker容器与2个应用程序进行交互

我目前有一个容器中的Java应用程序(.jar),我正在使用docker-compose.yml在第二个容器中创build一个mysql数据库的实例。

我想知道是否有可能容器1能够与容器2 interect,并能够读取/写入和从mysql数据库

如果可能的话,我会怎么做呢?

每个容器就像是在你的实际机器中运行的虚拟机。 而且他们有一个连接所有这些虚拟networking的虚拟networking。 他们可以像真正的networking上的真机一样相互沟通。

在yaml中指定链接时,例如从文档中的示例中:

web: links: - db 

结果将是在web容器内,主机名db将parsing为db容器的虚拟IP。 你实际上可以在web容器内执行ping db ,你应该看到db容器的答案。

对于mysql,假设你像例子中那样命名了mysql容器db ,并像上面那样将你的应用程序连接到它上面,你只需要编写假定这个主机名的代码。 例如你要连接到jdbc:mysql://db:3306/databasename 。 端口取决于您使用的图像公开。

一旦你想让容器在不同的机器上运行,就会变得棘手,因为你需要一种方法来访问这些机器中的虚拟容器networking。 有代理,转发端口,覆盖networking等方式,但这超出了撰写的能力。

从代码的angular度来看,交互是一样的。

Docker中的MySQL公开了特定主机名和端口上的服务。 使用它的程序使用该主机名和端口。 Docker让你能够在MySQL之外configuration这个,但是Java代码是一样的。

是的,通过networking链接容器是标准function。 正如Peter Lawrey所提到的那样,您只需在Java中将数据库连接configuration为正常,并使用要连接的服务或者泊坞窗容器的名称。

 version: "2" services: web: image: myapp networks: - myapp db: image: mysql networks: - myapp networks: myapp: driver: bridge 

然后你有一个networking连接

 $ 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