如何将一个Docker容器上的端口绑定到另一个Docker容器上的端口?

时间:2019-04-17 19:47:21

标签: docker port

我试图将Docker容器1(A)上的端口9000绑定到Docker容器2(B)上的端口9000。

我尝试了--net host选项,但这对我没有帮助。我需要两个容器都位于同一网络(172.17.0.x)上,并且它们的端口绑定类似于使用-p port标志将一个容器绑定到主机的方式。我尝试使用--expose flag在A和B上都设置侦听端口,但无法绑定它们。

docker run -p 8080:8080\ # to bind port 8080 on A to port 8080 on the host
    -it -d \
    --cap-add NET_ADMIN \
    --cap-add NET_RAW \
    --expose 9000 \ # listening port to communicate with B
    <image file>

docker run -p 8081:8081\ # to bind port 8081 on B to port 8081 on the host
    -it -d \
    --cap-add NET_ADMIN \
    --cap-add NET_RAW \
    --expose 9000 \ # listening port to communicate with B
    <image file>

我想将A的端口9000映射到B的端口9000(或任何其他端口) 谢谢!

2 个答案:

答案 0 :(得分:0)

那是不可能的。但是也不需要。如果两个容器都在同一网络上,它们可以互相看到,只需按IP或名称引用它们即可。

要添加重要名称,请使用--name my_memorable_name作为docker run的参数,然后就可以开始了。在其他任何Docker容器中使用该容器,您可以按名称引用该特定容器,例如:

curl http://my_memorable_name:8080

这将按预期工作。请记住,容器名称必须唯一。

答案 1 :(得分:0)

您要描述的内容无法与expose参数一起使用。 --net=host告诉您的容器在主机网络上运行,以该标记开头的所有容器中的所有端口暴露出来。

您可以创建一个docker网络并将两个容器都连接到它。

示例:

$ docker network create mynetwork --driver bridge
$ docker run -d --name containerA -p 8080:8080 --net=mynetwork <image>:tag
$ docker run -d --name containerB -p 8081:8081 --net=mynetwork <image>:tag

这将为containerAcontainerB创建一个DNS记录,该记录具有与容器相同的名称,该名称可以从用户定义网络中的任何容器中解析。

因此,现在,如果您想从containerB中访问containerA,只需使用容器的名称即可,例如:

curl http://containerB:8080

另一种解决方案是使用docker-compose:

version: '3'
services:
  containerA:
    image: <image>:<tag>
  containerB:
    image: <image>:<tag>

随着docker-compose也创建了一个用户定义的网络,您可以按照前面所述的方式访问容器。

在此处详细了解docker-compose和用户定义的网络: https://docs.docker.com/compose/overview/

https://docs.docker.com/network/bridge/