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

时间:2016-06-10 14:30:20

标签: java mysql docker docker-compose dockerfile

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

我想知道容器1是否可以与容器2交互,并且能够读取/写入mysql数据库

如果有可能,我该怎么做?

3 个答案:

答案 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