alasarr
alasarr

Reputation: 1605

How to refresh a container links

I've two dockers: one is a nginx frontend and the other is an expressjs application. Nginx is the entry point and it does a proxy to expressjs.

I do:

docker run -d --name 'expressjs' geographica/expressjs 

docker run -d --name 'nginx' --link expressjs nginx

After that when I update the image geographica/expressjs I need to recreated the expressjs container:

docker stop expressjs && docker rm expressjs && docker run -d --name 'expressjs' geographica/expressjs 

At this point, I also need to recreate the nginx container. How can I do it without recreating the nginx container?

It's a simplification of our problem, our real server has a nginx frontend and N applications, so each time we update one of the application we need to restart the nginx and stop the service for other applications.

Please, avoid docker-compose solutions. I wouldn't like to have a unique/huge docker-compose file for all the applications.

UPDATED:

I also think that something like that would be useful. https://github.com/docker/docker/issues/7468. having a docker link command to change container links at runtime. Unfortunately, it's not still available in 1.8.2.

Upvotes: 2

Views: 1470

Answers (1)

VonC
VonC

Reputation: 1323953

This was discussed in issue 6350:

If I explicitly do a docker restart the IP is correctly updated, however I was using "systemctl restart" which does a stop, kill and rm before a run

In that case ("stop - rm - run"), links are not refreshed:

docker does not assume that a container with the same name should be linked to

It doesn't always make sense to keep that "link", after all the new container could be completely unrelated.

My solution and my advice, is that:

  • you look into something a bit more robust like the Ambassador pattern that is just a fancy way of saying you link to a proxy that you never restart - to keep the docker links active.
    (also introduced here)
  • Another solution is to just docker create, docker start and docker stop instead of docker rm.
  • Lastly, my actual solution was to use something like SkyDNS or docker-gen to keep a central DNS with all the container names. This last solution it's the best for me because it allows me to move containers between hosts and docker linking can't work like that.

With next versions of docker, libnetwork will actually the way to go.
(see "The Container Network Model (CNM)", and "Docker Online Meetup #22: Docker Networking - video")

Upvotes: 2

Related Questions