The application can be accessed on GitHub at [dockersamples/easy-http-routing-with-traefik](https://github.com/dockersamples/easy-http-routing-with-traefik).
1. In the `compose.yaml` file, Traefik is using the following configuration:
```yaml
services:
proxy:
image: traefik:v3.1.2
command: --providers.docker
ports:
- 80:80
volumes:
- /var/run/docker.sock:/var/run/docker.sock
```
Note that this is essentially the same configuration as used earlier, but now in a Compose syntax.
2. The client service has the following configuration, which will start the container and provide it with the labels to receive requests at localhost.
```yaml {hl_lines=[7,8]}
services:
# …
client:
image: nginx:alpine
volumes:
- "./client:/usr/share/nginx/html"
labels:
traefik.http.routers.client.rule: "Host(`localhost`)"
```
3. The api service has a similar configuration, but you’ll notice the routing rule has two conditions - the host must be “localhost” and the URL path must have a prefix of “/api”. Since this rule is more specific, Traefik will evaluate it first compared to the client rule.
```yaml {hl_lines=[7,8]}
services:
# …
api:
build: ./dev/api
volumes:
- "./api:/var/www/html/api"
labels:
traefik.http.routers.api.rule: "Host(`localhost`) && PathPrefix(`/api`)"
```
4. And finally, the `phpmyadmin` service is configured to receive requests for the hostname “db.localhost”. The service also has environment variables defined to automatically log in, making it a little easier to get into the app.
```yaml {hl_lines=[5,6]}
services:
# …
phpmyadmin:
image: phpmyadmin:5.2.1
labels:
traefik.http.routers.db.rule: "Host(`db.localhost`)"
environment:
PMA_USER: root
PMA_PASSWORD: password
```
5. Before starting the stack, stop the Nginx container if it is still running.