Docker nginx代理可以使用docker-compose v1,但不能使用v2吗?

时间:2017-05-03 20:53:13

标签: docker docker-compose jwilder-nginx-proxy

我正在尝试为我的docker容器设置https://msdn.microsoft.com/en-us/library/w4atty68(v=vs.110).aspx以使用简单的子域而不是端口。我喜欢使用docker-compose来启动我的容器,因为我对docker很新,所以我立即开始使用v2格式。

我花了很长时间弄清楚为什么这个非常受欢迎且看似简单易用的nginx代理容器对我来说不起作用。事实证明,它与我使用docker-compose v2有某种关系。

我将发布我首先使用的docker-compose.yml文件,这些文件由于某种原因无效:

version: '2'

services:
  nginx-proxy:
    image: jwilder/nginx-proxy:alpine
    container_name: nginx-proxy
    network_mode: bridge
    ports:
      - 80:80
      - 443:443
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
    environment:
      - ENABLE_IPV6=true
      - DEFAULT_HOST=domain.com

  whoami:
    image: jwilder/whoami
    network_mode: bridge
    environment:
      - VIRTUAL_HOST=whoami.local

这是测试它的示例Jenkins容器:

version: "2"

services:
  jenkins:
    image: jenkins:2.46.2-alpine
    restart: always
    hostname: jenkins.domain.com
    network_mode: bridge
    expose:
      - 8080
      - 50000
    ports:
      - 8080:8080
      - 50000:50000
    volumes:
      - /srv/jenkins:/var/jenkins_home
    environment:
      - VIRTUAL_HOST=jenkins.domain.com
      - VIRTUAL_PORT=8080

现在我将为我发布实际 开箱即用的配置:

nginx-proxy:
  image: jwilder/nginx-proxy:alpine
  container_name: nginx-proxy
  ports:
    - 80:80
    - 443:443
  volumes:
    - /var/run/docker.sock:/tmp/docker.sock:ro
  environment:
    - ENABLE_IPV6=true
    - DEFAULT_HOST=domain.com

whoami:
  image: jwilder/whoami
  environment:
    - VIRTUAL_HOST=whoami.local

对于Jenkins容器:

jenkins:
  image: jenkins:2.46.2-alpine
  restart: always
  hostname: jenkins.domain.com
  expose:
    - 8080
    - 50000
  ports:
    - 8080:8080
    - 50000:50000
  volumes:
    - /srv/jenkins:/var/jenkins_home
  environment:
    - VIRTUAL_HOST=jenkins.domain.com
    - VIRTUAL_PORT=8080

我看到的唯一真正的区别是删除了network_mode: bridge。我已经补充说,当我注意到v2时会创建单独的网络,但是使用v1(或简单的docker run),它们最终会在同一个网络上。使用network_mode: bridge似乎解决了这个问题。

除此之外,它只是docker-compose.yml文件中的结构更改,但必须存在一些其他差异才能阻止此设置工作。

由于V1已被弃用,我想使用v2格式...我需要更改什么才能使docker-compose v2像v1一样运行并让代理正常工作?

1 个答案:

答案 0 :(得分:2)

您需要确保容器位于同一网络上。在nginx-proxy中,如果它无法到达节点,则不会添加上游设置。你应该看到类似的东西:

$ docker exec -it nginx-proxy cat /etc/nginx/conf.d/default.conf
# ....
# whoami.local
upstream whoami.local {
                                ## Can be connect with "nginxproxy_default" network
                        # nginxproxy_whoami_1
                        server 172.19.0.3:8000;
}
# ....

如果上游部分为空,没有评论和server行,那么它无法找到通用的泊坞网络来到达集装箱,而且它无法路由流量

我通过以下撰写文件看到了这一点:

version: '2'

services:
  nginx-proxy:
    image: jwilder/nginx-proxy:alpine
    container_name: nginx-proxy
    ports:
      - 8080:80
      - 8443:443
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
    environment:
      - ENABLE_IPV6=true
      - DEFAULT_HOST=domain.com

  whoami:
    image: jwilder/whoami
    environment:
      - VIRTUAL_HOST=whoami.local

我可以用以下方式验证:

$ curl -H "Host: whoami.local" http://localhost:8080
I'm b066afdb6e45

使用Jenkins,当你使用一个单独的撰写文件(实际上是一个单独的撰写项目,当你在另一个目录名中时默认发生)时,它将获得一个单独的默认网络。我最简单的解决方案是使用外部网络。首先,您可以直接在docker中创建它:

$ docker network create proxynet

然后您的撰写文件将包含该外部网络:

version: '2'

networks:
  proxynet:
    external: true

services:
  nginx-proxy:
    image: jwilder/nginx-proxy:alpine
    container_name: nginx-proxy
    ports:
      - 8080:80
      - 8443:443
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
    networks:
      - proxynet
    environment:
      - ENABLE_IPV6=true
      - DEFAULT_HOST=domain.com

  whoami:
    image: jwilder/whoami
    environment:
      - VIRTUAL_HOST=whoami.local
    networks:
      - proxynet

你会对詹金斯做同样的事情:

version: "2"

networks:
  proxynet:
    external: true

services:
  jenkins:
    image: jenkins:2.46.2-alpine
    restart: always
    hostname: jenkins.domain.com
    networks:
      - proxynet
    expose:
      - 8080
      - 50000
    ports:
      - 8080:8080
      - 50000:50000
    volumes:
      - /srv/jenkins:/var/jenkins_home
    environment:
      - VIRTUAL_HOST=jenkins.domain.com
      - VIRTUAL_PORT=8080