我通过一个docker-compose文件部署了多个容器,如下所示
version: '3'
services:
module2:
restart: always
build:
dockerfile: Dockerfile
context: ./Module-2
ports:
- '16667:16667'
module3:
build:
dockerfile: Dockerfile
context: ./Module-3
ports:
- '16669:16669'模块2接受来自外部源的套接字请求,并按预期工作。当模块2尝试与模块3连接时,问题就开始了
模块2代码(JAVA)
private int socket_port = 16669;
private String server = "127.0.0.1";
public TextOutputSocket() {
}
public TextOutputSocket(String host, int socket_port) {
this.server = host;
this.socket_port = socket_port;
}
public void sendText(String textToSend) {
OutputStream os = null;
Socket sock = null;
try {
System.out.println("Connecting to " + server + ":" + socket_port);
sock = new Socket(server, socket_port);
os = sock.getOutputStream();模块3代码(GO)
ln, err := net.Listen("tcp", ":16669")
if err != nil {
fmt.Println(err)
// handle error
}每当我尝试发送请求时,模块2都会收到一个连接被拒绝的错误。
我觉得我对docker网络没有最好的理解,我想这就是问题所在。提前感谢您的帮助
发布于 2020-03-18 10:46:25
在您的例子中,当您启动docker-compose时,module2和module3 2容器将在同一个docker网络中,并且它们可以分别使用它们的DNS名称(即module2和module3 )相互连接。
因此,您应该像这样更新您的module2代码
private int socket_port = 16669;
private String server = "module3";
public TextOutputSocket() {
}
...请注意,您不需要进行像- '16667:16667'或- '16669:16669'这样的端口映射,就可以让这两个模块相互通信。
发布于 2020-03-18 10:49:05
首先,您需要了解docker容器是如何工作的。每个应用程序都部署在两个独立的容器中。因此,当尝试连接到不同的容器时,您需要提供该特定容器的ip或主机名。
这里您已经尝试连接到localhost的1669,而您应该做的是尝试连接到另一个容器。这可以通过设置module3容器的容器名称来完成,docker dns将为您解析ip地址。
将127.0.0.1简单替换为module3
https://stackoverflow.com/questions/60732720
复制相似问题