Search code examples
dockertraefik

Traefik configuration with Docker not working


I am trying to set up a sample application with the Traefik reverse proxy in Docker.

I am using Traefik v2.2 for this project which has significant differences from Traefik.v1.0.

Here is my docker-compose.yml file:

version: '3'

services:
  traefik:
    # The official v2 Traefik docker image
    image: traefik:v2.2
    # Enables the web UI and tells Traefik to listen to docker
    command:
      - --api.insecure=true
      - --providers.docker=true
      - --providers.docker.exposedbydefault=false
      - --entrypoints.web.address=:80
    ports:
      # The HTTP port
      - "89:80"
      # The Web UI (enabled by --api.insecure=true)
      - "8089:8080"
    volumes:
      # So that Traefik can listen to the Docker events
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
  whoami:
    # A container that exposes an API to show its IP address
    image: containous/whoami
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.rule=Host(`whoami.localhost`)"
      - "traefik.http.routers.whoami.entrypoints=web"

I can access Traefik's dashboard when I go to localhost:8089 on my web browser, but I cannot access the whoami application when I type in the whoami.localhost address on my web browser. I'm just wondering if there is anything I need to change before I can access it, or do I need to change the host from whoami.localhost to localhost:3000 since that's the port I want to access the application in.


Solution

  • One problem I am spotting is that you exposed container port 80 of the traefik container to the host port 89. If you type in whoami.localhost in your web browser, your browser is going to search for an application on host port 80 at that address (since localhost maps natively to port 80), but it is not going to find anything there, because it can only be found at port 89. From my understanding, you should be able to access the application via the command line with the command curl -H Host:whoami.localhost http://127.0.0.1:89. Unfortunately, I am unsure how the URL whoami.localhost:89 is handled by your browser respectively by your DNS.

    You can to modify the docker-compose.yml file this way:

    version: "3"
    
    services:
      traefik:
        # The official v2 Traefik docker image
        image: traefik:v2.2
        # Enables the web UI and tells Traefik to listen to docker
        command:
          - --api.insecure=true
          - --providers.docker=true
        ports:
          # The HTTP port
          - "89:80"
          # The Web UI (enabled by --api.insecure=true)
          - "8089:8080"
        volumes:
          # So that Traefik can listen to the Docker events
          - /var/run/docker.sock:/var/run/docker.sock
      whoami:
        # A container that exposes an API to show its IP address
        image: containous/whoami
        labels:
          - traefik.http.routers.whoami.rule=Host(`whoami.localhost`)
    

    And then you can access the application on your command terminal by typing in:

    curl -H Host:whoami.localhost http://127.0.0.1:89
    

    Note: whoami.localhost can be whoami.docker.localhost or app.localhost or whatever you want. The thing here is that you should localhost attached to the end, except if you're adding a Fully Qualifies Domain name (FQDN).

    That's all.

    I hope this helps