Use Caddy with Docker to proxy localhost services
2024-02-19
Introduction
I wanted to setup a reverse proxy to some local services running on my host with Caddy running on a Docker container. Caddy is versatile and super-easy to setup for basic tasks like these. Why? Because I don't want to install Caddy on my host. I've created an example Docker compose file and a sample Caddyfile.
What's included?
- A 
Caddyfile - A 
docker-compose.yamlfile 
Caddyfile
This is a simple Caddyfile setting up an HTTP host on port 8085 with the following configuration:
/dbproxying couchdb running on localhost, port 5984/apiproxying an API running on localhost, port 5050- proxying a frontend running on localhost, port 3000
 
As you may see host.docker.internal is a trick to get the IP of the host running the Docker container.
Nevertheless, it needs on more step, shown on the docker-compose.yaml file below.
http://localhost:8085 {
    handle_path /db* {
        reverse_proxy host.docker.internal:5984
    }
    handle_path /api* {
	reverse_proxy host.docker.internal:5050
    }
    handle_path /* {
        reverse_proxy host.docker.internal:3000
    }
}
docker-compose.yaml
These lines instruct the Docker to pass the host IP to the Caddy container, resolving as host.docker.internal:
extra_hosts:
  - host.docker.internal:host-gateway
Here's the docker-compose.yaml file:
version: "3.9"
services:
  develop-reverse-proxy:
    image: caddy:latest
    ports:
      - "8085:8085"
    extra_hosts:
      - host.docker.internal:host-gateway
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
Instructions
- Save 
Caddyfile and docker-compose.yamlin a folder - Inside this folderm run `docker compose -f ./docker-compose.yaml up'
 
have fun!
Crafted with ❤ in Crete. © 2022-2024