如何使用docker-compose在多个容器之间传递参数

您好,我想了解docker组成,以及如何传递容器之间的参数,以便我可以在我的应用程序中使用它。

我已经使用两个微服务构build了一个简单的Hello World应用程序

第一个微服务是使用java:

//java code hello.java public class hello { public static void main(String args[]) { System.out.println("hello world from java"); } } //Dockerfile for creating this image FROM java:7 COPY hello.java . RUN javac hello.java CMD ["java","hello"] 

同样的图像使用python我有两个文件:

hello.py

 print("hello from python") 

这个图像的Dockerfile是:

 FROM python:2.7 COPY hello.py . CMD ["python","hello.py"] 

我的docker – 撰写文件:

 javacl: build: . links: pythoncl pythoncl: build: ./pythonfolder 

我想要做的是传递参数,我将从java程序中的用户采取,然后想要将该parameter passing给python程序,然后显示它。 这只是一个示例应用程序,因为我想了解如何在容器之间传递参数

我已经看到了一个以Python应用程序为例的docker网站,但是任何人都可以使用一个java程序和一个python程序,然后可以简单地显示如何通过一个非常简单的示例来传递参数。

一个解决scheme是通过networking传递参数,因为所有的容器都有自己的networking堆栈,但是有没有其他方法来传递参数

我是新来的docker工人,任何帮助将是伟大的。

处理ipc有很多种方法。 这只是通过公开目的地容器中的端口(java服务器)和来自源容器(python客户端)的链接的一种方法。 我为你创造了一个例子。 在这种情况下,我正在从Python连接到Java。

我的文件夹结构如下所示:

 anovil@ubuntu-anovil:~/tmp/docker-ipc$ tree . . ├── docker-compose.yml ├── javacl │  ├── Dockerfile │  ├── Main.class │  ├── Main.java │  └── OneConnection.class └── pythoncl ├── client.py └── Dockerfile 2 directories, 7 files anovil@ubuntu-anovil:~/tmp/docker-ipc$ 

我的服务器( 源 )侦听并输出端口10001上得到的东西:

 anovil@ubuntu-anovil:~/tmp/docker-ipc$ cat javacl/Main.java import java.io.*; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; public class Main { public static void main(String[] args) throws Exception { final int myPort = 10001; ServerSocket ssock = new ServerSocket(myPort); System.out.println("Listening on port " + myPort ); while (true) { Socket sock = ssock.accept(); System.out.println("Someone has made socket connection"); OneConnection client = new OneConnection(sock); String s = client.getRequest(); } } } class OneConnection { Socket sock; BufferedReader in = null; DataOutputStream out = null; OneConnection(Socket sock) throws Exception { this.sock = sock; in = new BufferedReader(new InputStreamReader(sock.getInputStream())); out = new DataOutputStream(sock.getOutputStream()); } String getRequest() throws Exception { String s = null; while ((s = in.readLine()) != null) { System.out.println("got: " + s); } return s; } } anovil@ubuntu-anovil:~/tmp/docker-ipc$ 

我的客户端连接到主机:端口:10001上的java-server并发送“hello stackoverflow”:

 anovil@ubuntu-anovil:~/tmp/docker-ipc$ cat pythoncl/client.py #!/usr/bin/python #client example import socket import time print "Waiting for socket" time.sleep(3) client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_socket.connect(('java-server', 10001)) client_socket.send("hello") client_socket.send(" stackoverflow") client_socket.close() while 1: pass # do nothing anovil@ubuntu-anovil:~/tmp/docker-ipc$ 

每个容器只调用服务器和客户端,除了服务器公开其他容器的10001端口,这些docker文件如下所示:

 anovil@ubuntu-anovil:~/tmp/docker-ipc$ cat javacl/Dockerfile FROM java:7 COPY Main.class OneConnection.class / EXPOSE "10001" CMD ["java","Main"] anovil@ubuntu-anovil:~/tmp/docker-ipc$ cat pythoncl/Dockerfile FROM python:2.7 COPY client.py /client.py CMD python client.py anovil@ubuntu-anovil:~/tmp/docker-ipc$ 

然后在撰写文件中,javacl容器被赋予一个主机名来标识自己和pythoncl到javacl的链接,如下所示:

 anovil@ubuntu-anovil:~/tmp/docker-ipc$ cat docker-compose.yml javacl: build: ./javacl hostname: java-server pythoncl: build: ./pythoncl links: - "javacl" anovil@ubuntu-anovil:~/tmp/docker-ipc$ 

现在当你运行它时,

 anovil@ubuntu-anovil:~/tmp/docker-ipc$ docker-compose up Starting dockeripc_javacl_1 Starting dockeripc_pythoncl_1 Attaching to dockeripc_javacl_1, dockeripc_pythoncl_1 javacl_1 | Listening on port 10001 javacl_1 | Someone has made socket connection javacl_1 | got: hello stackoverflow ... 

服务器和客户端有意使得连续运行,以便我们可以分别检查它们:

 anovil@ubuntu-anovil:~/tmp/docker-ipc$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c96961f03d57 dockeripc_pythoncl "/bin/sh -c 'python c" 13 minutes ago Up 19 seconds dockeripc_pythoncl_1 9d0163aa34f5 dockeripc_javacl "java Main" 13 minutes ago Up 19 seconds 10001/tcp dockeripc_javacl_1 anovil@ubuntu-anovil:~/tmp/docker-ipc$ 

可以通过attachexeclogin到这些容器,看看会发生什么

您可以使不同容器中的程序使用networking进行通信。

你想要的是在你的两个程序之间实现某种远程过程调用。 最后,这不是一个Docker问题。