您好我正在尝试了解docker compose以及如何在容器之间传递参数,以便我可以在我的应用程序中使用它。
我使用两个微服务构建了一个简单的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-compose文件:
javacl:
build: .
links: pythoncl
pythoncl:
build: ./pythonfolder
我想要做的是传递参数,我将从java程序中的用户那里获取参数,然后将该参数传递给python程序然后显示它。它只是一个示例应用程序,因为我试图了解如何在容器之间传递参数
我见过有一个python应用程序的docker网站作为例子,但任何人都可以使用java程序和python程序,然后可以通过一个非常简单的例子简单地显示如何传递参数。
一种解决方案是通过网络传递参数,因为所有容器都有自己的网络堆栈,但有传递参数的替代方法。
我是docker的新手,任何帮助都会很棒。
答案 0 :(得分:2)
有很多方法可以处理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$
我的服务器(source)侦听并输出端口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$
我的客户端连接到主机:端口上的java-server:10001并发送“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$
然后在compose文件中,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$
可以通过attach
或exec
登录这些容器,看看会发生什么
答案 1 :(得分:0)
您可以让不同容器的程序使用网络进行通信。
你想要的是在你的两个程序之间实现某种远程过程调用。最后,它不是Docker问题。