Моя конфигурация - Docker Swarm.
MyWebApp работает в контейнере и имеет доступ к порту 8100.
По некоторым причинам мне нужно, чтобы при доступе по URL-адресу использовался не порт, а контекст URL, например myhost.com/mywebapp.
Маршрутизация должна выполняться Traefik.
Я пытался использовать Path, PathPrefix, PathPrefixStrip, использовал настройку Traefik, в любом случае тот же результат, я могу получить доступ только к MyWebApp, давая порт в URL-адресе, невозможно использовать контекст /mywebapp.
#startscript.sh
docker swarm init
docker network create -d overlay proxy
docker stack deploy -c docker-compose.traefik.yml traefik
docker stack deploy -c docker-compose.webapps.yml webapps
traefik.toml
accessLogsFile = "/dev/stdout"
logLevel = "DEBUG"
defaultEntryPoints = ["http", "https"]
[entryPoints]
[entryPoints.http]
address = ":80"
# [entryPoints.http.redirect]
# entryPoint = "https"
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]
[[entryPoints.https.tls.certificates]]
CertFile = "/run/secrets/cert.pem"
KeyFile = "/run/secrets/key.pem"
[web]
address = ":8085"
[docker]
endpoint = "unix:///var/run/docker.sock"
domain = "myhost.com"
watch = true
swarmmode = true
exposedbydefault = false
[file]
докер-Compose-traefik.yml
version: '3.3'
networks:
proxy:
external:
name: proxy
configs:
traefik_toml_v2:
file: ./traefik.toml
secrets:
traefik_cert:
file: ./tls/cert.pem
traefik_key:
file: ./tls/key.pem
services:
traefik:
image: traefik
deploy:
replicas: 2
placement:
constraints:
- node.role == manager
volumes:
- /var/run/docker.sock:/var/run/docker.sock
networks:
- proxy
ports:
- target: 80
protocol: tcp
published: 80
mode: ingress
- target: 443
protocol: tcp
published: 443
mode: ingress
- target: 8085
protocol: tcp
published: 8085
mode: ingress
configs:
- source: traefik_toml_v2
target: /etc/traefik/traefik.toml
mode: 444
secrets:
- source: traefik_cert
target: cert.pem
uid: "0"
mode: 400
- source: traefik_key
target: key.pem
uid: "0"
mode: 400
докер-Compose-webapps.yml
version: '3.3'
networks:
proxy:
external: true
net:
driver: overlay
attachable: true
services:
whoami:
image: emilevauge/whoami
networks:
- proxy
deploy:
replicas: 2
resources:
limits:
memory: 1G
labels:
#This is working - i can access with: http://myhost/whoami
- traefik.frontend.rule=PathPrefixStrip:/whoami
- traefik.docker.network=proxy
- traefik.port=80
- traefik.enable=true
mywebapp:
image: myregistry/myrepos:my_image
networks:
- proxy
- net
ports:
- 8100:8100
volumes:
- ~/dev/myconf:/home/developer/dev/myconf
command: mywebapp.bin --http-address=0.0.0.0 --http-port=8100
deploy:
replicas: 2
resources:
limits:
memory: 1G
labels:
- traefik.enable=true
#This is NOT working - i canNOT access with: http://myhost/webapp
#Access is only possible with: http://myhost:8100
#WHAT I HAVE TO DO THAT i can forward/redirect http://myhost:8100 to http://myhost/webapp????
# - traefik.frontend.rule=Host:myhost.com;Path:/mywebapp
# - traefik.port=8100
#I tried both, with servicename and without servicename, in both cases access to http://myhost/webapp is not possible, only to http://myhost:8100
- traefik.webapps_mywebapp.frontend.rule=Host:myhost.com;Path:/mywebapp
- traefik.webapps_mywebapp.port=8100
- traefik.docker.network=proxy