Docker Tip #37: What Do Links Do in Docker Compose?
Docker is a few years old now, and if you're dealing with older Docker projects, you may run into links. Here's what it is.
You may see this out in the wild if you take on legacy or older Dockerized apps.
Here’s what a legacy v1 Docker Compose file might look like:
redis: expose: - "6379" webapp: links: - "redis"
In the above example,
redis is exposing port 6379. This won’t publish it back to the Docker host, but it will make it available to any containers who happen to link
redis (such as the
webapp container in this example).
Back in the day Docker didn’t have networking, so the
links property along with
expose is how you let 2 containers communicate. This also ensured that
redis would get started if you started
webapp directly because
links also doubled as a way to start dependent containers.
Then if you wanted to publish the port on the Docker host, you could still use
Here’s the updated v2 version of the above:
version: "2" services: redis: expose: - "6379" webapp: depends_on: - "redis
In the above example, we no longer need to use
links because Docker Compose will automatically create a network for our Compose project and containers on that network will be able to talk freely with each other.
We also added in a
depends_on property which will ensure
redis gets started if it’s not already running if we directly start
Technically we don’t even need to add
expose because the official Redis Docker image has
EXPOSE 6379 in its Dockerfile. I just added it here to be explicit in the example.
Like usual, if you wanted to publish the port on the Docker host you could use
Moving forward you should use networks and
depends_on and avoid using
links all together because it is considered legacy and may be deprecated. You can continue using
ports nowadays and both are considered standard to use.