首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >容器无法连接其他容器

容器无法连接其他容器
EN

Stack Overflow用户
提问于 2021-09-29 07:31:55
回答 2查看 42关注 0票数 0

我想联系两个码头集装箱。我是Docker的新手,我尝试过很多不同的方式。

首先,我制作了两个不同的Dockerfile

myJavaAPI Dockerfile文件:

代码语言:javascript
复制
FROM java:8
WORKDIR /app
COPY . .
EXPOSE 4016:23503
CMD java -jar myJavaServerApi.jar

java API监听localhost:4016并提供来自127.0.0.1:23503的数据

其他Dockerfile:

代码语言:javascript
复制
FROM python:3.8

WORKDIR /app

COPY requirements.txt requirements.txt

RUN pip install -r requirements.txt

COPY . .

EXPOSE 23503:23503

CMD ["python","./myDaemonServer.py"]

myDaemonServer从23503获取连接并做一些工作。

我试着在我的机器上运行这两个文件,一切都运行得很好。但是当我创建Docker时,这两个容器无法通信,myDaemonServer看不到我的Java API。

我使用以下命令构建了我的镜像:

代码语言:javascript
复制
docker build -t dockerjava .

docker build -t dockerdaemon .

并通过以下方式运行:

代码语言:javascript
复制
docker run -d <ImageID>

首先我运行dockerjava,然后我运行dockerdaemon

此外,我尝试了此命令,但没有任何变化:

代码语言:javascript
复制
docker run -p --net=host <DockerImageIDs>

我如何解决这个问题?

编辑:守护进程(python文件)监听127.0.0.1:23503并从5002端口为其提供服务。

EN

回答 2

Stack Overflow用户

发布于 2021-09-29 07:50:59

两个Docker容器可以通过TCP进行通信。

为了便于配置,您可以使用单个docker-compose.yml:

代码语言:javascript
复制
version: '3.6'

services:

  myJavaServer:
    container_name: myJavaServer
    restart: always
    image: ...
    ports:
      - 80:80
      - 443:443
   
  myDaemonServer:
    container_name: myDaemonServer
    restart: always
    image: ...
    
networks:
  default:
    driver: bridge
    name: mynetwork

如果要使用单独的docker-compose.yml文件,则必须使用外部网络:

代码语言:javascript
复制
version: '3.6'

services:

  myJavaServer:
    container_name: myJavaServer
    restart: always
    image: ...
    ports:
      - 80:80
      - 443:443
    networks:
      - mynetwork

networks:
  mynetwork:
  external: true

对于守护进程:

代码语言:javascript
复制
version: '3.6'

services:

  myDaemonServer:
    container_name: myDaemonServer
    restart: always
    image: ...
    networks:
      - mynetwork

networks:
  mynetwork:
  external: true

如果使用两个docker-compose.yml文件,则可以使用命令docker network create ...https://docs.docker.com/engine/reference/commandline/network_create/创建外部网络

在您的容器中,您现在可以简单地使用名称:ping myJavaServer进行通信。或者http://myJavaServer:1234,不需要映射用于同一网络内的通信的端口(端口1234)。端口映射只有在将您的服务器暴露给外部世界(例如端口80/443)时才是必需的。

要启动这两个容器,可以在docker-compose.yml文件的目录中运行命令docker-compose up

票数 0
EN

Stack Overflow用户

发布于 2021-09-29 08:04:35

你可以用两种方法来解决这个问题,

  1. one是创建一个docker-compose.yml文件,您可以在其中指定networks,为您的应用程序提供以下示例docker-compose文件。

代码语言:javascript
复制
version: "3.3"
services:

  #  Java API
  myJavaAPI:
    image: "dockerjava"
    ports:
      - "4016:23503"
    restart: "no"
    networks:
      - localnetwork

  # Python Daemon
  myDaemonServer:
    image: "dockerdaemon"
    ports:
      - "23503:23503"
    restart: "no"
    depends_on:
      - myJavaAPI
    networks:
      - localnetwork

networks:
  localnetwork:

  1. 第二种方法是在调用java api的python代码中使用http://host.docker.internal:23503代替localhost:23503

但我建议您使用第一种方法,因为这是使容器相互连接的更简洁的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69372179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档