Отказ от ответственности: мои знания Docker и Traefik слабы. Я несколько раз пытался следовать документации Traefik, но обычно я просто путаюсь, возможно, потому, что я хочу разобраться с чем-то большим, чем самые простые случаи, но также я уверен, что мне не хватает некоторых основ.
В моей текущей настройке я могу создать веб-сервис Docker (порт 80), который Traefik v2 подхватывает, создает сертификат LE, перенаправляет с http:80 на https:443 и выставляет. Ниже приведен мой docker-compose.yml
для Traefik, а также один для примера сервиса, который работает.
Однако предположим, что моя веб-служба действительно хочет работать на порту, отличном от 80. Например, я хочу запуститьstatping, который работает на порту 8080. Возможно ли, учитывая текущую настройку SSL, подключить его так, чтобы я мог открыть точку входаhttp://statping.MYTLDи положитесь на Traefik, чтобы: 1. перенаправить наhttps://statping.MYTLD, 2. получить сертификат и 3. раскрыть мой statping Docker-контейнер? Может ли Traefik справиться с вызовом Acme http, даже если базовая служба не работает на порту 80? Я полагаю, что может, поскольку мой рабочий образец даже не раскрывает порт за пределами уровня контейнера.
Примечание: я хорошо знаком с Docker Compose, но, возможно, для такой службы, как statping, мне нужно придумать, как написать свой собственный DOCKERFILE, чтобы я мог заставить его работать на порту 80 вместо порта 8080?
Спасибо за любую информацию!
Трафик docker-compose.yml
:
version: "3.3"
networks:
traefik:
external: true
services:
traefik:
image: "traefik:v2.3"
container_name: "traefik"
command:
#- "--log.level=DEBUG"
- "--api.insecure=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--entrypoints.web.http.redirections.entryPoint.to=websecure"
- "--entrypoints.web.http.redirections.entryPoint.scheme=https"
- "--entrypoints.web.http.redirections.entrypoint.permanent=true"
- "--certificatesresolvers.myresolver.acme.httpchallenge=true"
- "--certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web"
# FOR TESTING.
#- "--certificatesresolvers.myresolver.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"
- "--certificatesresolvers.myresolver.acme.email=craig@wereallconnected.ca"
- "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
ports:
- "80:80"
- "443:443"
- "8080:8080"
volumes:
- "./letsencrypt:/letsencrypt"
- "/var/run/docker.sock:/var/run/docker.sock:ro"
Образец услуги docker-compose.yml
:
version: "3.3"
networks:
traefik:
external: true
services:
whoami2:
image: "traefik/whoami"
container_name: "simple-service2"
labels:
- "traefik.enable=true"
- "traefik.http.routers.whoami2.rule=Host(`whoami2.MYTLD`)"
- "traefik.http.routers.whoami2.entrypoints=websecure"
- "traefik.http.routers.whoami2.tls.certresolver=myresolver"
networks:
- traefik
restart: unless-stopped
решение1
Если контейнер предоставляет несколько портов или не предоставляет ни одного порта, то вам необходимо вручную указать, какой порт Traefik должен использовать для связи, с помощью метки
traefik.http.services.<service_name>.loadbalancer.server.port
(подробнее об этой метке читайте в специальном разделе о маршрутизации).
Таким образом, если whoami прослушивал 8080 и не открыл ровно один порт, вам следует указать метку:
"traefik.http.services.whoami2.loadbalancer.server.port=8080"