使用Java实现Docker容器之间的通信

7

我在任何帖子中都没有找到答案。

我使用一个容器来运行PHP项目,目前一切正常。我想要连接另一个容器上的Java程序。

我使用了"java:8"镜像,并进行了如下配置:

engine:
    build: ./docker/engine/
    volumes:
        - ".:/home/docker:rw"
        - "./docker/engine/php.ini:/usr/local/etc/php/conf.d/custom.ini:ro"
    links:
        - "db:db"
        - "java:java"
    working_dir: "/home/docker"
java:
    image: java:8
    tty: true
    ports:
        - "999:999"

在我的 Docker PHP 容器中(称为“引擎”),我有这个环境变量。
JAVA_1_ENV_CA_CERTIFICATES_JAVA_VERSION=20140324
JAVA_1_ENV_JAVA_DEBIAN_VERSION=8u72-b15-1~bpo8+1
JAVA_1_ENV_JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
JAVA_1_ENV_JAVA_VERSION=8u72
JAVA_1_ENV_LANG=C.UTF-8
JAVA_1_NAME=/recetteetudiant_engine_1/java_1
JAVA_1_PORT=tcp://172.17.0.3:999
JAVA_1_PORT_999_TCP=tcp://172.17.0.3:999
JAVA_1_PORT_999_TCP_ADDR=172.17.0.3
JAVA_1_PORT_999_TCP_PORT=999
JAVA_1_PORT_999_TCP_PROTO=tcp
JAVA_ENV_CA_CERTIFICATES_JAVA_VERSION=20140324
JAVA_ENV_JAVA_DEBIAN_VERSION=8u72-b15-1~bpo8+1
JAVA_ENV_JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
JAVA_ENV_JAVA_VERSION=8u72
JAVA_ENV_LANG=C.UTF-8
JAVA_NAME=/recetteetudiant_engine_1/java
JAVA_PORT=tcp://172.17.0.3:999
JAVA_PORT_999_TCP=tcp://172.17.0.3:999
JAVA_PORT_999_TCP_ADDR=172.17.0.3
JAVA_PORT_999_TCP_PORT=999
JAVA_PORT_999_TCP_PROTO=tcp
RECETTEETUDIANT_JAVA_1_ENV_CA_CERTIFICATES_JAVA_VERSION=20140324
RECETTEETUDIANT_JAVA_1_ENV_JAVA_DEBIAN_VERSION=8u72-b15-1~bpo8+1
RECETTEETUDIANT_JAVA_1_ENV_JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
RECETTEETUDIANT_JAVA_1_ENV_JAVA_VERSION=8u72
RECETTEETUDIANT_JAVA_1_ENV_LANG=C.UTF-8
RECETTEETUDIANT_JAVA_1_NAME=/recetteetudiant_engine_1/recetteetudiant_java_1
RECETTEETUDIANT_JAVA_1_PORT=tcp://172.17.0.3:999
RECETTEETUDIANT_JAVA_1_PORT_999_TCP=tcp://172.17.0.3:999
RECETTEETUDIANT_JAVA_1_PORT_999_TCP_ADDR=172.17.0.3
RECETTEETUDIANT_JAVA_1_PORT_999_TCP_PORT=999
RECETTEETUDIANT_JAVA_1_PORT_999_TCP_PROTO=tcp

Ping命令正常工作。但是我如何在Java中使用它?我尝试使用该命令。

root@639144f7c95f:/home/docker# echo $JAVA_1_PORT$RECETTEETUDIANT_JAVA_1_ENV_JAVA_HOME
tcp://172.17.0.3:999/usr/lib/jvm/java-8-openjdk-amd64
root@639144f7c95f:/home/docker# /recetteetudiant_engine_1/java_1
bash: /recetteetudiant_engine_1/java_1: No such file or directory
root@639144f7c95f:/home/docker# $JAVA_1_PORT$RECETTEETUDIANT_JAVA_1_ENV_JAVA_HOME     
bash: tcp://172.17.0.3:999/usr/lib/jvm/java-8-openjdk-amd64: No such file or directory
root@639144f7c95f:/home/docker# 

也许我需要分享一个卷?我能通过TCP协议使用Java吗?

如果您想在容器之间进行通信,请使用网络。 "java"容器将通过网络名称"java"从"engine"中可用。 - Nikolai Golub
你想链接Java二进制文件/命令吗?这是不可能的,或者说不推荐。你想链接到一个已经运行的Java进程吗?这是可以的。 - blacklabelops
我想要链接到Java进程,以便在引擎容器中执行我的.jar文件。如何使用Java进程在这个专用容器中实现?通过TCP协议吗? - chadyred
3个回答

0

你不能(或者说至少不应该)在TCP上使用Java,以你想要的方式,这似乎是要在基本上位于另一台机器上(或者在这种情况下是Docker容器中)调用Java可执行文件。也许有某种远程调用的方法可以实现这一点,但即使可能也仍然是错误的。只需将JRE添加到您的php容器中。或使您的jar像WS一样工作。 Docker容器不应该像container1具有Java可执行文件那样从那里调用它,而container2具有vi,container3 grep等...


我并不是Java的忠实粉丝 :) 我想要使用这个库,它是一个JAR文件http://yui.github.io/yuicompressor/,所以请在WS上安装,我不知道如何做...我认为Docker被分成了几个进程,所以我想我可以很容易地使用java:8映像,因为它已经存在并应该在同一网络中使用。我该怎样才能像用SSH那样直接从一个容器连接到另一个容器?好的,这比在PHP容器上安装JAR文件要麻烦得多... - chadyred

0
一些在容器之间“交互”的方式(具有一个共同卷):
  1. 在主机中进行编排。

    docker exec -t php command-prepare

    docker exec -t java-app-jdk java -jar yuicompressor.jar bla-bla

    docker exec -t php command-post

  2. 创建一个简单的应用程序来监听端口并在 Java Container 中启动命令(在我看来是最好的方法)。

  3. 创建“cron”来查看 JavaContainer 中的卷,例如:

    a)phpContainer 将文件放入卷并放置“指示器”文件

    b)javaContainer 查看“指示器”文件,并开始工作。发布完成后删除“指示器”文件并放置“工作日志”文件。

    c)phpContainer 等待一段时间,并获取“工作日志”文件。根据结果解析“工作日志”文件进行工作。

更新。 您还可以执行类似于 docker.spotter 的操作https://github.com/discordianfish/docker-spotter


0

您在compose文件中有2个容器。一个似乎托管了一个php应用程序,另一个安装了java。

从容器的“内部”来看,它的行为就像您拥有两台不同的计算机(它们不是计算机,而是容器):一台名为“engine”的主机和一台名为“java”的主机。

您希望连接到名为“engine”的“主机”并在那里运行Java。 Java应用程序安装在另一台“主机”上。

您尝试做的事情似乎没有意义。


目的是在容器中使用连接到php进程的java处理,我有一个jar文件可以缩小我的css,就像我的php框架项目中的库一样。这是为了分离进程,我不想在我的php容器上安装Java,但我会将Java库保留在php容器上,这是我想要执行的基本命令,简单的YUI库以jar格式存在。 - chadyred

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接