如何在Docker Compose文件中引用Traefik v2的自签名SSL证书?

14

在docker-compose YAML文件中,Træfik v2自签名证书的参考文档非常有限。以下是您可以为Let's Encrypt执行的操作:

https://github.com/containous/blog-posts/blob/master/2019_09_10-101_docker/docker-compose-07.yml#L11-L14

version: "3.3"

services:
  traefik:
    image: "traefik:v2.0.0"
    command:
      - --entrypoints.web.address=:80
      - --entrypoints.websecure.address=:443
      - --providers.docker
      - --api
      - --certificatesresolvers.leresolver.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory
      - --certificatesresolvers.leresolver.acme.email=your@email.com
      - --certificatesresolvers.leresolver.acme.storage=/acme.json
      - --certificatesresolvers.leresolver.acme.tlschallenge=true

但是我尝试查看文档,没有找到在docker-compose文件中引用自签名证书的方法,而不需要toml文件。
我尝试了以下内容:
version: "3.3"

services:
  traefik:
    image: "traefik:v2.0.0"
    command:
      - --entrypoints.web.address=:80
      - --entrypoints.websecure.address=:443
      - --providers.docker
      - --api
      - --providers.docker.tls.cert=/etc/certs/server.crt
      - --providers.docker.tls.key=/etc/certs/server.key

但是我遇到了以下错误:

无法检索docker客户端和服务器主机的信息: 连接期间出错: 获取 https://%2Fvar%2Frun%2Fdocker.sock/v1.24/version: http: server gave HTTP response to HTTPS client" providerName=docker

以下是我使用的资源,它们没有提供任何方法在docker-compose YAML文件中设置自签名证书以启用Træfik v2的HTTPS:

我在这个页面上看到了这个:https://docs.traefik.io/https/tls/#user-defined

tls:
  certificates:
    - certFile: /path/to/domain.cert
      keyFile: /path/to/domain.key

但是这是针对文件YAML配置文件的,我需要将其转换为docker-compose YAML文件等效文件,就像他们在Let's Encrypt中所做的那样。


请查看此评论。 它使用卷,但我建议使用secrets和config。如果需要更多帮助,我可以发布一个示例docker-compose文件。 - Brayden C
1个回答

18
目前看来似乎无法实现。有人在Træfik社区论坛上发布了一个非常相似的问题。
你所传递的证书作为标志(providers.docker.tls.cert和providers.docker.tls.key)只有在Træfik通过安全的TCP端点而不是文件套接字监听Docker事件时才有用,而这并不是你想要的。
如果能把所有配置都放在一个docker-compose文件中就太棒了,但不幸的是,自签名相关的配置必须存储在单独的文件中。
以下是示例记录:

文件 docker-compose.yml

traefik:
  image: traefik:v2.1
  command:
    - --entrypoints.web.address=:80
    - --entrypoints.websecure.address=:443
    - --providers.docker=true
    - --providers.file.directory=/etc/traefik/dynamic_conf
    - --providers.file.watch=true
  ports:
    - 80:80
    - 443:443
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock:ro
    - ./certs/:/certs/:ro
    - ./traefik.yml:/etc/traefik/dynamic_conf/conf.yml:ro

web:
  image: nginx:1.17.8-alpine
  labels:
    # http with redirection
    - traefik.http.middlewares.redirect-middleware.redirectscheme.scheme=https
    - traefik.http.routers.web-router.entrypoints=web
    - traefik.http.routers.web-router.rule=Host(`your-domain.net`)
    - traefik.http.routers.web-router.middlewares=redirect-middleware
    # https
    - traefik.http.routers.websecure-router.entrypoints=websecure
    - traefik.http.routers.websecure-router.tls=true
    - traefik.http.routers.websecure-router.rule=Host(`your-domain.net`)

文件 traefik.yml

tls:
  certificates:
    - certFile: /certs/awx.afone.priv.crt
      keyFile: /certs/awx.afone.priv.key

我可以将这个与Let's Encrypt结合使用,用于某些端点,并且使用自己的证书用于其他端点吗? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接