# Running Traefik - HTTP Reverse Proxy and Load Balancer - in Docker

## What is Traefik?

> Traefik (pronounced traffic) is a modern HTTP reverse proxy and load balancer that makes deploying microservices easy. Traefik integrates with your existing infrastructure components [...] and configures itself automatically and dynamically. Pointing Traefik at your orchestrator should be the only configuration step you need. -https://github.com/traefik/traefik

## Installing Docker

1. Log into the Linux based device
2. Run the following commands in the terminal
   # install prerequisites
   sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg-agent -y
   # add docker gpg key
   curl -fsSL https://download.docker.com/linux/$(awk -F'=' '/^ID=/{ print $NF }' /etc/os-release)/gpg | sudo apt-key add -
   # add docker software repository
   sudo add-apt-repository "deb [arch=$(dpkg --print-architecture)] https://download.docker.com/linux/$(awk -F'=' '/^ID=/{ print $NF }' /etc/os-release) $(lsb_release -cs) stable"
   # install docker
   sudo apt install docker-ce docker-compose containerd.io -y
   # enable and start docker service
   sudo systemctl enable docker && sudo systemctl start docker
   # add the current user to the docker group
   sudo usermod -aG docker $USER
   # reauthenticate for the new group membership to take effect
   su - $USER

## Running Traefik

1. Continue with the following commands in a terminal window
   # create a working directory
   mkdir ~/docker/traefik -p
   # create and edit config file
   nano ~/docker/traefik/traefik.yml
2. Paste the following default configuration into traefik.yml, replacing the hostname with the docker host

   ## traefik.yml

   # Docker configuration backend
   providers:
   docker:
   defaultRule: "Host(`{{ trimPrefix `/` .Name }}.<% dockerhost.fqdn %>`)"

   # API and dashboard configuration
   api:
   insecure: true

3. Press CTRL+O, Enter, CTRL+X to write the changes
4. Continue with the following commands in a terminal window
   # start the traefik container
   docker run -d --name=traefik -p 8080:8080 -p 80:80 -v ~/docker/traefik/traefik.yml:/etc/traefik/traefik.yml -v /var/run/docker.sock:/var/run/docker.sock traefik
5. Open a web browser and navigate to http://DNSorIP:8080
6. Welcome to the Traefik web dashboard

## Dynamic Container Ingress Testing

1. Continue with the following commands in a terminal window
   # start a basic whoami web service
   docker run -d --name whoami -p 40001:80 traefik/whoami
2. Back in the web browser, navigate to whoami.<% docker host %>
3. The Apache HTTPD server response should be displayed
4. Back in the Traefik dashboard the new whoami HTTP router should display
5. Let's try one more test
   # create an apache2 working directory
   mkdir ~/docker/apache2/htdocs -p
   # create a test html file
   echo '<html><body><h1>Hello world</h1><h3>Have you subscribed yet?</h3></body></html>' > ~/docker/apache2/htdocs/index.html
   # start a basic apache httpd server
   docker run -d --name httpd -p 40002:80 -v ~/docker/apache2/htdocs:/usr/local/apache2/htdocs/ httpd
6. Back in the web browser, navigate to httpd.<% docker host %>
7. The Apache HTTPD server response should be displayed
8. Back in the Traefik dashboard the new httpd HTTP router should display

Documentation: https://doc.traefik.io/traefik/