6

我们正在努力通过 SSL 设置具有单端口和 jwilder/nginx-proxy 的多个网站托管,我们能够在没有 ssl 的情况下部署解决方案并且它工作正常,但是当我们尝试使用 SSL 将它放在 HTTPs 调用上失败时。我们的 docker-compose 文件如下:

码头工人-compose.yml

site1:
  build: site1
  environment:
    VIRTUAL_HOST: site1.domainlocal.com
    VIRTUAL_PROTO: https
  restart: always

site2:
  build: site2
  environment:
    VIRTUAL_HOST: site2.domainlocal.com
    VIRTUAL_PROTO: https
  restart: always

site3:
  build: site3
  environment:
    VIRTUAL_HOST: site3.domainlocal.com
    VIRTUAL_PROTO: https
  restart: always

nginx-proxy:
  image: jwilder/nginx-proxy:alpine
  ports:
    - "80:80"
    - "443:443"
  volumes:
    - /var/run/docker.sock:/tmp/docker.sock:ro
    - certs:/etc/nginx/certs:ro

  restart: always
  privileged: true

PS:“certs”文件夹与 docker-compose 文件保存在同一文件夹中。

使用 openssl 使用自签名证书

文件夹结构如下:

Main_folder-|
            |- docker-compose.yml
            |
            |- certs/.csr and .key files
            |
            |- site1/Dockerfile + Nodejs
            |- site2/Dockerfile + Nodejs
            |- site3/Dockerfile + Nodejs

请提出问题的可能原因和解决方案。

docker ps 的输出:

CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                                      NAMES
c71b52c3e6bd        compose_site3   "/bin/sh -c 'node ..."   3 days ago          Up 3 days           80/tcp                                     compose_site3_1
41ffb9ec3983        jwilder/nginx-proxy   "/app/docker-entry..."   3 days ago          Up 3 days           0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   compose_nginx-proxy_1
a154257c62ec        compose_site1   "/bin/sh -c 'node ..."   3 days ago          Up 3 days           80/tcp                                     compose_site1_1
3ed556e9287e        compose_site2   "/bin/sh -c 'node ..."   3 days ago          Up 3 days           80/tcp                                     compose_site2_1

4

2 回答 2

5

所以在花了这么多时间之后,我终于能够解决这个问题。因此,对于与 jwilder/nginx-proxy 的 ssl 集成,不需要以域名称命名证书和密钥,而是可以是任何名称,只需在 docker-compose 文件中提及证书名称(我发现了这种方法只需点击和试用)。因此,您的 docker compose 文件应如下所示:

site1:
  build: site1
  environment:
    VIRTUAL_HOST: site1.domainlocal.com
    CERT_NAME: mycertificate
  volumes:
    - /etc/ssl/certs:/etc/ssl/certs:ro
  restart: always

site2:
  build: site2
  environment:
    VIRTUAL_HOST: site2.domainlocal.com
    CERT_NAME: mycertificate
  volumes:
    - /etc/ssl/certs:/etc/ssl/certs:ro
  restart: always

site3:
  build: site3
  environment:
    VIRTUAL_HOST: site3.domainlocal.com
    CERT_NAME: mycertificate
  volumes:
    - /etc/ssl/certs:/etc/ssl/certs:ro
  restart: always

nginx-proxy:
  image: jwilder/nginx-proxy:alpine
  ports:
    - "80:80"
    - "443:443"
  environment:
    DEFAULT_HOST: domainlocal.com #default host
    CERT_NAME: mycertificate # Wildcard Certificate name without extension  
  volumes:
    - /var/run/docker.sock:/tmp/docker.sock:ro
    - /etc/ssl/certs:/etc/nginx/certs  #certificate path in docker container

  restart: always
  privileged: true

只需使用“docker-compose up --build”构建并运行 compose,恭喜您现在位于安全层。

于 2017-10-06T11:28:46.170 回答
1

您的证书应以“.crt”扩展名结尾,而不是“.csr”。还要确保为域正确命名,匹配 VIRTUAL_HOST 变量。根据文档

证书和密钥应以具有 .crt 和 .key 扩展名的虚拟主机命名。例如,具有 VIRTUAL_HOST=foo.bar.com 的容器应该在 certs 目录中有一个 foo.bar.com.crt 和 foo.bar.com.key 文件。

于 2017-10-04T00:37:00.420 回答