How does traefik handel requests/respones?

I need help understanding the concept of traefik reverse proxy when using docker.

Assuming I got a webserver (let’s call it service-1) which is usually running on Port 8081.
Without any proxy I would access it this way: http://localhost:8081

According to the traefik docs, the following configuration should me to a access this service by using the a URL in form of http://localhost/my-service:

service-1:
  image: "service1"
  container_name: "simple-service-1"
  labels:
    - "traefik.enable=true"
    - "traefik.http.routers.service1.rule=Host(`localhost`) && Path(`my-service`)"
    - "traefik.http.routers.service1.entrypoints=web"
    - "traefik.http.services.service1.loadbalancer.server.port=8081"

Now, what I don’t understand is, how traefik handles responses from the server.


E. g. my server tries to load an e. g. image (or similar). Without the proxy this is done by performing a GET-Request: http://localhost:8081/img/image.jpg.

Now, when using traefik the webserver is not aware of that, thus performing a GET request of /img/image.jpg – which is wrong and not accessible.

If I rewrite the URL using redirectregex, the image is still no accessible: http://localhost/my-service/img/image.jpg (returns a Not found)
And I do not understand why.

I always thought of the concept that an URL in form of http://localhost/my-service/<path> is directly redirected (or stripped) by traefik to http://<docker-internal-ip>:8080/<path> – but apparently this is not the case. What did I miss?

Source: Docker Questions