Thank you for reading this post, don't forget to subscribe!
Traefik – это обратный прокси с поддержкой Docker, который предоставляет встроенную панель мониторинга.
Проект Traefik предоставляет официальный образ Docker, который поможет быстро запустить Traefik в контейнере Docker.
Панель инструментов представляет собой отдельное веб-приложение, которое будет работать в контейнере Traefik по порту 8080.
Если нет необходимости в запароленном доступе к панели управления, то простейшая форма для запуска будет выглядеть следующим образом:
# docker -v
Docker version 19.03.1, build 74b1e89
# docker-compose -v
docker-compose version 1.22.0, build f46880fe
# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.170 test.ru nginx.test.ru nginx2.test.ru
cat docker-compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
version: '2.4' services: traefik: image: traefik volumes: - /var/run/docker.sock:/var/run/docker.sock command: --web --defaultentrypoints=http --entrypoints="Name:http Address::80" --docker --docker.endpoint="unix:///var/run/docker.sock" --docker.watch=true --docker.exposedbydefault=false ports: - 80:80 - 8080:8080 nginx: image: nginx:alpine container_name: webserver restart: unless-stopped labels: - traefik.frontend.rule=Host:nginx.test.ru - traefik.docker.network=traefik - traefik.port=80 - traefik.enable=true nginx2: image: nginx:alpine volumes: - /var/www/nginx:/usr/share/nginx/html container_name: webserver2 restart: unless-stopped labels: - traefik.frontend.rule=Host:nginx2.test.ru - traefik.docker.network=traefik - traefik.port=80 - traefik.enable=true<br /><br /></code><span style="font-family: georgia, palatino, serif;">В данном конфиге мы запускаем 3 сервиса, 1 - traefik, 2,3 - контейнеры nginx.</span> |
У traefik только 1 точка входа, это 80 порт. На порту 8080 будет доступна панель в которой визуально отображается какие сервисы доступны.
Для поднимаемых нами сервисов указаны следующие доменные имена: nginx.test.ru
и nginx2.test.ru,
они используют созданную ранее docker сеть traefik
и как мы видим, отвечают по одному 80 порту. Для того чтобы работал сервис работал ему прописывается пункт label где задаются параметры для traefik.
Ниже показан ответ curl по нашим сервисам:
curl nginx.test.ru
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html> |
curl nginx2.test.ru
test
================================
если необходимо включить базовую аутентификацию для сервиса и для dashboard traefik, то используем следующую строку:
traefik.frontend.auth.basic: "admin:$$apr1$$s8D70azI$$zyyC7/WNXteoQpYwVB3zd0"
пароль генерируем следующим образом:
echo $(htpasswd -nb admin admin) | sed -e s/\\$/\\$\\$/g
если отсутствует:
htpasswd
то ставим пакет httpd-tools
конфиг будет иметь следующий вид:
1 |
[root@centos7 ~]# cat docker-compose.yml<br />version: '2.4'<br /><br />services:<br /> traefik:<br /> image: traefik<br /> volumes:<br /> - /var/run/docker.sock:/var/run/docker.sock<br /> command:<br /> --web<br /> --defaultentrypoints=http<br /> --entrypoints="Name:http Address::80"<br /> --docker<br /> --docker.endpoint="unix:///var/run/docker.sock"<br /> --docker.watch=true<br /> --docker.exposedbydefault=false<br /> expose:<br /> - 8080<br /> ports:<br /> - 80:80<br /> labels:<br /> traefik.enable: true<br /> traefik.frontend.rule: "Host:traefik.test.ru"<br /> traefik.port: 8080<br /> traefik.docker.network: "traefik"<br /> traefik.frontend.auth.basic: "admin:$$apr1$$tajEjroD$$/j6Ntl6tnvRbdPWIyLe4m/"<br /><br /> nginx:<br /> image: nginx:alpine<br /> container_name: webserver<br /> restart: unless-stopped<br /> labels:<br /> traefik.enable: true<br /> traefik.frontend.rule: "Host:nginx.test.ru"<br /> traefik.port: 80<br /> traefik.docker.network: "traefik"<br /> traefik.frontend.auth.basic: "admin:$$apr1$$tajEjroD$$/j6Ntl6tnvRbdPWIyLe4m/"<br /><br /> nginx2:<br /> image: nginx:alpine<br /> volumes:<br /> - /var/www/nginx:/usr/share/nginx/html<br /> container_name: webserver2<br /> restart: unless-stopped<br /> labels:<br /> traefik.enable: true<br /> traefik.frontend.rule: "Host:nginx2.test.ru"<br /> traefik.port: 80<br /> traefik.docker.network: "traefik" |
Обязательно задаём expose 8080
EXPOSE сообщает контейнеру, какие порты следует использовать для внутренней сети Docker. Другие контейнеры могут использовать эту информацию для подключения к нему.
т.е. вы открываете порты, не публикуя их на хост-машине - они будут доступны только для связанных служб
================
если необходимо подключить ssl сертификат то необходимо создать дополнительный файл traefik.toml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
debug = false logLevel = "ERROR" defaultEntryPoints = ["https","http"] [entryPoints] [entryPoints.http] address = ":80" [entryPoints.http.redirect] entryPoint = "https" <span class="hljs-section"> [entryPoints.https]</span> address = ":443" <span class="hljs-section"> [entryPoints.https.tls]</span> <span class="hljs-section"> [entryPoints.https.tls.ClientCA]</span> files = <span class="hljs-section">["tests/clientca1.crt", "tests/clientca2.crt"]</span> optional = false <span class="hljs-section"> [[entryPoints.https.tls.certificates]]</span> certFile = "tests/traefik.crt" keyFile = "tests/traefik.key" [retry] [docker] endpoint = "unix:///var/run/docker.sock" domain = "test.ru" watch = true exposedByDefault = false |
в docker-compose.yaml прокидываем наш файл:
volume /opt/traefik/traefik.toml:/traefik.toml
подробнее тут:
https://docs.traefik.io/basics/#entrypoints