Docker - Have new container communicate with pre-running container

◇◆丶佛笑我妖孽 提交于 2019-12-08 12:35:19

问题


I'm trying to setup some very simple networking between a pair of Docker containers and so far all the documentation I've seen is far more complex than for what I am trying to do.

My use case is simple:

Container 1 is already running and is listening on port 28016 Container 2 will start after container 1 and needs to connect to container 1 on port 28016.

I am aware I can set this up via Docker-Compose with ease, however Container 1 is long-lived and for this use case, I do not want to shut it down. Container 2 needs to start and automatically connect to container 1 via port 28016. Also, both containers are running on the same machine. I cannot figure out how to do this.

I've exposed 28016 in Container 1's dockerfile, and I'm running it with -p 28016:28016. What do I need to do for Container 2 to connect to Container 1?


回答1:


There are a few ways of solving this. Most don't require you to publish the ports.

Using a user defined network

If you start your long-running container in a user-defined network, because then docker will handle

docker network create service-network
docker run --net=service-network --name Container1 service-image

If you then start your ephemeral container in the same network, it will be able to refer to the long-running container by name. E.g:

docker run --name Container2 --net=service-network ephemeral-image

Using the existing container network namespace

You can just run the ephemeral container inside the network namespace of the long running container:

docker run --name Container2 --net=container:Container1 ephemeral-image

In this case, the service would be available via localhost:28016.

Accessing the service on the host

Since you've published the service on the host with -p 28016:28016, you can refer to that access using the address of the host, which from inside the container is going to be the default gateway. You can get that with something like:

address=$(ip route | awk '$1 == "default" {print $3}')

And your service would be available on ${address}:28016.




回答2:


Here are the steps to perform:

  1. Create a network: docker network create my-net
  2. Attach the network to the already running container: docker container attach <container-name> my-net
  3. Start the new container with the --network my-net or with docker-compose add a network property:

...
networks:
  - my-net

networks:
  my-net:
    external: true

The container should now be able to communicate using the container-name as a DNS host name



来源:https://stackoverflow.com/questions/46977959/docker-have-new-container-communicate-with-pre-running-container

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!