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
ports
.
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 webapp
.
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
ports
too.
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 expose
and ports
nowadays and both are considered standard to use.