Docker撰写Nginx链接容器

时间:2018-05-04 07:00:37

标签: docker nginx proxy docker-compose

我有一个运行Nginx的docker compose容器。托管的网站只是一个.test域名,例如example.test

同样在容器中,Nginx运行位置代理并将其重定向到example.test:8000。但它无法连接到那个,因为它实际上是从同一系统(所有桥接网络)上的不同容器托管的。

如何让容器使用example.test域进行通信?

或者如果我无法让他们通过example.test进行通信,那么我该如何关联它们以便他们可以使用其泊坞号组合服务名称,例如apifrontend

Docker撰写:

version: '3'

services:
    db:
        image: postgres
        ports:
         - "5432:5432"
    django:
        build: ./api
        command: ["./docker_up.sh"]
        restart: always
        volumes:
          - ./api:/app/api
          - api-static:/app/api/staticfiles
        ports:
          - "8000:8000"
        depends_on:
          - db
        environment:
          - MODE=DEV

volumes:
  frontend-build:
  api-static:
  certificates:

第二个撰写文件(一起运行):

version: '3'

services:
    django:
        environment:
          - MODE=PROD
        #links:
        #  - hosting
    hosting:
        build: ./hosting
        restart: always
        network_mode: bridge
        volumes:
           - frontend-build:/var/www
        ports:
          - "80:80"
          - "443:443"
        environment:
          - MODE=PROD
        #links:
        #  - django

volumes:
    frontend-build:

使用这些当前设置我运行时会出错

  

错误:对于92b89f848637_opensrd_hosting_1无法启动服务托管:无法链接到/ opensrd_django_1,因为它不属于默认网络

编辑:改变了docker-compose.prod.yml:

networks:
    app_net:
        driver: bridge
        ipam:
            driver: default
            config:
              -
                subnet: 172.16.238.0/24

services:
    django:
        environment:
          - MODE=PROD
        networks:
            app_net:
            ipv4_address: 172.16.238.10    

但这给了我一个错误。

  

错误:撰写文件' ./ docker-compose.prod.yml'无效,因为:

     

networks.app_net值不允许使用其他属性(' config'意外)

     

networks.app_net.ipam包含无效类型,它应该是一个对象

3 个答案:

答案 0 :(得分:1)

所以我尝试了@ trust512和@DimaL给出的选项,但那些没有用。

但是,从我的撰写文件中删除网络和链接,删除现有的默认网络和构建的容器后,它工作正常,我无法使用dbdjango和{ {1}}。

唯一不同的是我将作曲家版本从3改为3.5。

这些是感兴趣的人的最终文件:

hosting

搬运工-compose.prod.yml:

version: '3.5'

services:
    db:
        image: postgres
        ports:
         - "5432:5432"
    django:
        build: ./api
        command: ["./docker_up.sh"]
        restart: always
        volumes:
          - ./api:/app/api
          - api-static:/app/api/staticfiles
        ports:
          - "8000:8000"
        depends_on:
          - db
        environment:
          - MODE=DEV

volumes:
  frontend-build:
  api-static:

答案 1 :(得分:0)

您可以使用pip list Package Version -------------- --------- certifi 2018.4.16 chardet 3.0.4 idna 2.6 pip 10.0.1 pysqlite 2.7.0 requests 2.18.4 requests-cache 0.4.13 urllib3 1.22 https://docs.docker.com/compose/compose-file/#external_links)或尝试将所有容器放在同一个虚拟网络上。

答案 2 :(得分:0)

据我所知,你只想让他们(django和nginx)链接到作曲?

然后原生解决方案将使用 external_links exampled here 并像这样使用它:

services:
    [...]
    hosting:
        [...]
        external_links:
          - django_1:example
        [...]

其中django_1代表您提供的撰写创建的容器名称,example是容器在Django容器中可见的别名。

其他方式您可以通过编辑/etc/hosts(如果您使用的是linux / mac)将 example.test 域指向特定地址 例如,通过添加像

这样的记录
172.16.238.10   example.test

上述地址指向您的django应用程序(容器)。

通过使用compose(/etc/hosts)记录的here

中的原生解决方案,可以在不改变extra_hosts的情况下实现上述目标

此外,如果您更喜欢django / nginx容器的静态IP地址,以防您坚持使用/etc/hosts od extra_hosts解决方案,则可以使用另一个本机解决方案,该解决方案可以设置静态IP对于所选服务,请选择正确的here

来自链接文档的经过调整的列表:

services:
  [...]
  django:
    [...]
    networks:
      app_net:
        ipv4_address: 172.16.238.10

networks:
  app_net:
    driver: bridge
    ipam:
      driver: default
      config:
      -
        subnet: 172.16.238.0/24