На главную | Автор

Traefik в Docker. Настройка, примеры и ошибки.

Для начала что такое traefik? Это обратный прокси (reverse-proxy) написанный на go. Более подробно про него написано в официально документации здесь

Как работает traefik

В качестве примера возьму практический сценарий, когда в качестве прокси используем nginx. И по каким-либо причинам нам нужно заменить его.

Неважно где у вас стоял nginx (на хосте или это был контейнер на портах хоста (форвардинг портов) ports:80,443 и т.д.). Убираем/выключаем nginx.

Подключаем traefik:

	
		version: 3
		services:
		traefik:
		    image: traefik:2.6
		    ports:
		      - "80:80"
		      - "443:443"
		    volumes:
		      - /var/run/docker.sock:/var/run/docker.sock
		      - ${PWD}/traefik.yml:/etc/traefik/traefik.yml
		    labels:
		      - "traefik.enable=true"
		      - "traefik.http.routers.traefik.rule=Host(`my-traefik-dashboard.example.ru`)"
		      - "traefik.http.routers.traefik.service=api@internal"
		      - "traefik.http.middlewares.auth.basicauth.users=mylogin:encodedpassword"
		      - "traefik.http.routers.traefik.middlewares=auth"
		    networks:
		      - mynetwork
	

Теперь все контейнеры внутри сети mynetwork будут доступны для нашего прокси и он сможет ими управлять и отображать их в своей панели

Первый важный момент: ваши образы контейнеров, которые будут внутри traefik сети (в данном случае mynetwork) должны иметь корректную директиву/инструкцию при сборке image -> HEALTHCHECK

Пример:

	
		HEALTHCHECK --interval=5s --timeout=10s --retries=3 CMD curl -sS 127.0.0.1 || exit 1
	

Если ваш HEALTHCHECK кривой, то traefik не увидит контейнер как сервис. И чтобы вы не делали, этот контейнер не сможет проксироваться через traefik

Второй важный момент: ваш образ/контейнер должен слушать какие либо порты (не путать с форвардингом! ports тут не причём!), и если этот порт отличается от порта по-умолчанию для traefika (это 80), то надо очевидно прописать этот порт в директивах routers для вашего контейнера

Пример, когда порт отличается внутри контейнера + в этом же примере показаны другие опции:

	
		version: 3
		services:
			traefik: ....
			myservice:
			    image: myimage:1.0
			    labels:
			      - "traefik.enable=true"
			      # необазятельная опция service, помогает задать название сервиса внутри traefik
			      # это нужно если на 1 контейнер вам понадобится сказать traefikу что этот контейнер обслуживает несколько сервисов
			      - "traefik.http.routers.myservice.service=my-service-name"
				  # эта опция включает шифрование или отключает (например https без этой опции может не заработать)
			      - 'traefik.http.routers.myservice.tls=true'
				  # эта опция задаёт правило по которому traefik поймёт что нужно направить запрос к этому сервису
				  # можно написать Host(`myservicehost.localhost`) || Host(`myservicehost2.localhost`) и т.д. Правила смотри в документации к routers
			      - "traefik.http.routers.myservice.rule=Host(`myservicehost.localhost`)"
				  # эта опция позволяет задать порт. Обрати внимание на `my-service-name`. Т.к выше
				  # этот ключ определяется, то далее по нему настраиваются опции сервиса.
			      - "traefik.http.services.my-service-name.loadbalancer.server.port=3000"
			    networks:
			      - mynetwork
	

Пример выше показывает как настроить/подключить конетйнер/сервис к traefik-у.

Необязательно 1 контенйер должен обслуживать только 1 порт (1 сервис). Можно на 1 контейнере запустить много портов, тогда важно будет прописать labels так:

	
		labels:
		      - "traefik.enable=true"
		      - "traefik.http.routers.myservice.service=my-service-name1"
			  - "traefik.http.services.my-service-name.loadbalancer.server.port=3001"
		      - "traefik.http.routers.myservice_1.rule=Host(`myservicehost.localhost`)"
		      # второй сервис
			  - "traefik.http.routers.myservice.service=my-service-name2"
			  - "traefik.http.services.my-service-name.loadbalancer.server.port=3002"
		      - "traefik.http.routers.myservice_2.rule=Host(`myservicehost2.localhost`)"
	

Важно чтобы внутри котнейнера прослушивались заданные для балансера порты. Далее открываем админку траефика и проверяем подтянулись ли сервисы.

Также у траефика есть интреграция с LE Оф. дока. Там же написано про Cloudflare API, что он может работать с CF api.