如何在 Traefik v1.7 中使用特定的 http 端口?

How to use a specific http port in Traefik v1.7?

为了在 docker 个容器中使用粘性会话,我使用的是 Traefik v1.7。 但我不会通过特定端口更改 http 端口 80,例如8081.

我在Traefik中使用80端口是可以的:

docker network create mynetwork -d overlay

docker service create --name mynginx --mode replicated --replicas 2 \ 
    --network mynetwork --publish "80:8085" nginx
    
docker service update 
    --label-add "traefik.docker.network=mynetwork" \
    --label-add "traefik.port=8085" \
    --label-add "traefik.frontend.rule=PathPrefix:/" \
    --label-add "traefik.backend.loadbalancer.stickiness=true" \
    mynginx
    
docker service create 
    --name traefik 
    -p8080:80 -p9090:8080 \
    --mount type=bind,source=/var/run/docker.sock,destination=/var/run/docker.sock \
    --mode=global \
    --network mynetwork \
    traefik \
    --docker \
    --docker.swarmmode \
    --docker.watch \
    --web \
    --loglevel=DEBUG

但是当我把端口80改成8081时,Traefik服务不工作了:

docker network create mynetwork -d overlay

docker service create --name mynginx --mode replicated --replicas 2 \ 
    --network mynetwork --publish "8081:8085" nginx
    
docker service update 
    --label-add "traefik.docker.network=mynetwork" \
    --label-add "traefik.port=8085" \
    --label-add "traefik.frontend.rule=PathPrefix:/" \
    --label-add "traefik.backend.loadbalancer.stickiness=true" \
    mynginx
    
docker service create 
    --name traefik 
    -p8080:8081 -p9090:8080 \
    --mount type=bind,source=/var/run/docker.sock,destination=/var/run/docker.sock \
    --mode=global \
    --network mynetwork \
    traefik:v1.7 \
    --docker \
    --docker.swarmmode \
    --docker.watch \
    --web \
    --loglevel=DEBUG

谢谢。

你不能,因为 traefik 暴露了端口 80。

如果您键入这些命令:

docker pull traefik:v1.7
docker image history traefik:v1.7

输出为:

IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
80ab7ee8304c        3 months ago        /bin/sh -c #(nop)  LABEL org.opencontainers.…   0B
<missing>           3 months ago        /bin/sh -c #(nop)  ENTRYPOINT ["/traefik"]      0B
<missing>           3 months ago        /bin/sh -c #(nop)  VOLUME [/tmp]                0B
<missing>           3 months ago        /bin/sh -c #(nop)  EXPOSE 80                    0B
<missing>           3 months ago        /bin/sh -c #(nop) COPY file:8e3cf7c133ac957e…   75MB
<missing>           8 months ago        /bin/sh -c #(nop) COPY dir:e700a731062c6a113…   1.16MB
<missing>           8 months ago        /bin/sh -c #(nop) COPY file:c1f4ee36c6a15bdd…   233kB

有一条 EXPOSE 80 行表示如果您从此映像创建容器,进程将侦听容器内的端口 80。

当你使用参数 -p 8080:80 时,你说 docker 打开主机上的 8080 端口并将其映射到容器内的 80 端口。这是有效的,因为进程正在监听 !

中的端口 80

否则,-p 8080:8081,docker 将容器内的 8080 映射到 8081,并且无法通过此端口访问,因为 traefik 正在侦听端口 80。

也许你想在主机上通过 8081 读取 traefik,然后使用 -p 8081:80。在所有情况下,第二个数字必须是 80,除非你可以通过 traefik 配置更改容器内的监听端口。

我已经通过以下方式解决了我的问题并使用了Traefik v2.3。 当访问80端口时,Traefik会显示服务whoami,当访问9086端口时,Traefik会显示服务mynginximage2.

version: "3.8"

services:
  traefik:
    image: traefik:v2.3
    deploy:
      mode: global
    networks:
      - traefik-net
    command:
      #- "--log.level=DEBUG"
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.mynginximage2_ep.address=:8086"
    ports:
      - 80:80
      - 9086:8086
      - 8080:8080
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
  whoami:
    image: "traefik/whoami"
    deploy:
      replicas: 2
    networks:
      - traefik-net
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.entrypoints=web"
      - "traefik.http.routers.whoami.rule=Host(`192.168.0.1`) || Host(`192.168.0.2`)"
      - "traefik.http.services.whoami-service.loadbalancer.server.port=80"
  mynginximage2:
    image: mynginximage2
    deploy:
      replicas: 2
    networks:
      - traefik-net
    #ports:
    #  - 9080:8086
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.mynginximage2.entrypoints=mynginximage2_ep"
      - "traefik.http.routers.mynginximage2.rule=Host(`192.168.0.1`) || Host(`192.168.0.2`)"
      - "traefik.http.services.mynginximage2-service.loadbalancer.server.port=8086"      
networks:
  traefik-net:
    external: true
    name: traefik-net