Skip to main content

Docker container linking

This blog post might be outdated!
This blog post was published more than one year ago and might be outdated!
· 2 min read
Stephan Hochdörfer

Linking Docker containers can be done in various ways. In my recent attempt of playing with Docker and our GitLab Review Apps setup, I experimented with different methods to figure out what would work best. These are the different options I played around with:

1. The low-level method

As you might know docker inspect can give you a ton of information on how a specific container is configured. Parsing the JSON response of docker inspect is surely possible but not needed. As it turns out you are able to query certain parts of the docker inspect output, like the IP address of the container. All you need to run a command like this:

docker inspect -f
'{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'
the-container-to-link

This will just return the configured IP address. You can use the return value of the above command when configuring environment variables of your container:

docker run -d -P
-e ENDPOINT=$(docker inspect -f '{{range .NetworkSettings.Networks}}
{{.IPAddress}}{{end}}' the-container-to-link)
--name app-container some/image:latest

If you really need the IP address and not a hostname for some reason this seems be a suitable approach.

2. Linking by name

You can link containers by passing the --link argument to the docker run command:

docker run -d -P -e ENDPOINT=the-container-to-link 
--link the-container-to-link --name app-container some/image:latest

3. docker-compose

You can define a separate docker-compose file docker-compose.prod.yaml like the one below:

version: "2"
services:
app:
image: some/image:latest

the-container-to-link:
image: the-container-to-link:latest

And then run it via:

docker-compose -f docker-compose.prod.yaml

Whilst the docker-compose version seems to be the simplest solution I still prefer the "linking by name" variant in our GitLab CI setup as this is one file less to maintain.