Skip to content

Docker Compose example

In this section, you will learn how to use Docker Compose to expose a service using the Docker provider.

Setup

Create a docker-compose.yml file with the following content:

version: "3.3"

services:

  traefik:
    image: "traefik:v2.11"
    container_name: "traefik"
    command:
      #- "--log.level=DEBUG"
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entryPoints.web.address=:80"
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"

  whoami:
    image: "traefik/whoami"
    container_name: "simple-service"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.rule=Host(`whoami.localhost`)"
      - "traefik.http.routers.whoami.entrypoints=web"
Networking

The Traefik container has to be attached to the same network as the containers to be exposed. If no networks are specified in the Docker Compose file, Docker creates a default one that allows Traefik to reach the containers defined in the same file. You can customize the network as described in the example below. You can use a pre-existing network too.

version: "3.3"

networks:
  traefiknet: {}

services:

  traefik:
    image: "traefik:v2.11"
    ...
    networks:
      - traefiknet

  whoami:
    image: "traefik/whoami"
    ...
    networks:
      - traefiknet

Replace whoami.localhost by your own domain within the traefik.http.routers.whoami.rule label of the whoami service.

Now run docker-compose up -d within the folder where you created the previous file.
This will start Docker Compose in background mode.

This can take a moment

Docker Compose will now create and start the services declared in the docker-compose.yml.

Wait a bit and visit http://your_own_domain to confirm everything went fine.

You should see the output of the whoami service.
It should be similar to the following example:

Hostname: d7f919e54651
IP: 127.0.0.1
IP: 192.168.64.2
GET / HTTP/1.1
Host: whoami.localhost
User-Agent: curl/7.52.1
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 192.168.64.1
X-Forwarded-Host: whoami.localhost
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Server: 7f0c797dbc51
X-Real-Ip: 192.168.64.1

Details

Let's break it down and go through it, step-by-step.

You use whoami, a tiny Go server that prints OS information and HTTP request to output as service container.

Second, you define an entry point, along with the exposure of the matching port within Docker Compose, which allows to "open and accept" HTTP traffic:

command:
  # Traefik will listen to incoming request on the port 80 (HTTP)
  - "--entryPoints.web.address=:80"

ports:
  - "80:80"

Third, you expose the Traefik API to be able to check the configuration if needed:

command:
  # Traefik will listen on port 8080 by default for API request.
  - "--api.insecure=true"

ports:
  - "8080:8080"

Note

If you are working on a remote server, you can use the following command to display configuration (require curl & jq):

curl -s 127.0.0.1:8080/api/rawdata | jq .

Fourth, you allow Traefik to gather configuration from Docker:

traefik:
  command:
    # Enabling Docker provider
    - "--providers.docker=true"
    # Do not expose containers unless explicitly told so
    - "--providers.docker.exposedbydefault=false"
  volumes:
    - "/var/run/docker.sock:/var/run/docker.sock:ro"

whoami:
  labels:
    # Explicitly tell Traefik to expose this container
    - "traefik.enable=true"
    # The domain the service will respond to
    - "traefik.http.routers.whoami.rule=Host(`whoami.localhost`)"
    # Allow request only from the predefined entry point named "web"
    - "traefik.http.routers.whoami.entrypoints=web"

Using Traefik OSS in Production?

If you are using Traefik at work, consider adding enterprise-grade API gateway capabilities or commercial support for Traefik OSS.

Adding API Gateway capabilities to Traefik OSS is fast and seamless. There's no rip and replace and all configurations remain intact. See it in action via this short video.