2022-04-15 13:44:08 +00:00
---
title: "Traefik Docker Documentation"
2024-01-02 16:56:06 +00:00
description: "Learn how to use Docker Compose to expose a service with Traefik Proxy."
2022-04-15 13:44:08 +00:00
---
2023-04-05 12:16:06 +00:00
# Docker Compose example
2019-08-06 15:46:04 +00:00
2024-01-02 16:56:06 +00:00
In this section, you will learn how to use [Docker Compose ](https://docs.docker.com/compose/ "Link to Docker Compose" ) to expose a service using the Docker provider.
2019-08-06 15:46:04 +00:00
## Setup
2024-01-02 16:56:06 +00:00
Create a `docker-compose.yml` file with the following content:
2019-08-06 15:46:04 +00:00
```yaml
--8< -- " content / user-guides / docker-compose / basic-example / docker-compose . yml "
```
2022-11-30 14:04:05 +00:00
??? Networking
The Traefik container has to be attached to the same network as the containers to be exposed.
2023-04-05 12:16:06 +00:00
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 ](https://docs.docker.com/compose/networking/#specify-custom-networks "Link to docs about custom networks with Docker Compose" ) as described in the example below.
You can use a [pre-existing network ](https://docs.docker.com/compose/networking/#use-a-pre-existing-network "Link to Docker Compose networking docs" ) too.
2022-11-30 14:04:05 +00:00
```yaml
version: "3.3"
networks:
traefiknet: {}
services:
traefik:
2022-12-05 15:58:04 +00:00
image: "traefik:v3.0"
2022-11-30 14:04:05 +00:00
...
networks:
- traefiknet
whoami:
image: "traefik/whoami"
...
networks:
- traefiknet
```
2024-01-02 16:56:06 +00:00
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.
!!! info "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:
```text
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
```
2019-08-06 15:46:04 +00:00
## Details
2024-01-02 16:56:06 +00:00
Let's break it down and go through it, step-by-step.
You use [whoami ](https://github.com/traefik/whoami "Link to the GitHub repo of whoami" ), a tiny Go server that prints OS information and HTTP request to output as service container.
2019-08-06 15:46:04 +00:00
2024-01-02 16:56:06 +00:00
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:
2019-08-06 15:46:04 +00:00
```yaml
command:
# Traefik will listen to incoming request on the port 80 (HTTP)
- "--entrypoints.web.address=:80"
ports:
- "80:80"
```
2024-01-02 16:56:06 +00:00
Third, you expose the Traefik API to be able to check the configuration if needed:
2019-08-06 15:46:04 +00:00
```yaml
command:
# Traefik will listen on port 8080 by default for API request.
2019-09-12 14:22:03 +00:00
- "--api.insecure=true"
2019-08-06 15:46:04 +00:00
ports:
- "8080:8080"
```
!!! Note
2023-04-05 12:16:06 +00:00
If you are working on a remote server, you can use the following command to display configuration (require `curl` & `jq` ):
2019-08-06 15:46:04 +00:00
```bash
curl -s 127.0.0.1:8080/api/rawdata | jq .
```
2024-01-02 16:56:06 +00:00
Fourth, you allow Traefik to gather configuration from Docker:
2019-08-06 15:46:04 +00:00
```yaml
traefik:
command:
2023-04-05 12:16:06 +00:00
# Enabling Docker provider
2019-08-06 15:46:04 +00:00
- "--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"
```
2022-09-09 15:17:53 +00:00
{!traefik-for-business-applications.md!}