【问题标题】:docker compose multiple projectsdocker 组合多个项目
【发布时间】:2020-01-09 18:10:11
【问题描述】:

我想为同一网络下的多个项目设置本地 DOCKER 环境。我想拥有将创建 Nginx 代理和 PHP 容器的主要 docker-compose 配置文件。还有许多带有自己的 Nginx 的子 docker-compose 文件。我希望所有子 Nginx 容器都监听主 PHP 容器。但由于某种原因,子 Nginx 容器失败并出现错误 host not found in upstream "app-php" in /etc/nginx/vhost.d/site.cong25

docker-compose:

version: '3.5'

services:
  app-nginx_proxy:
    build: ./nginx-proxy
    image: app/nginx-proxy:latest
    container_name: app-nginx_proxy
    ports:
      - "80:80"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
    networks:
      - appnetwork
  app-php:
    image: app/php:latest
    container_name: app-php
    build:
      context: ./php-fpm
      dockerfile: Dockerfile
    expose:
      - 9000
    volumes:
      - app_volume:/var/www/
    networks:
      - appnetwork
volumes:
  app_volume:
    driver: local
    driver_opts:
      type: bind
      device: "$PWD/../services"
      o: bind
networks:
  appnetwork:
    driver: bridge

和孩子docker-compose:

version: '3.5'

services:
  app-admin-nginx:
    build: ./nginx
    image: app-admin/nginx:latest
    container_name: app-admin-nginx
    volumes:
      - app_admin_volume:/var/www/app-admin
    networks:
      appnetwork:
        aliases:
          - app-admin.v2.local
    environment:
      - VIRTUAL_HOST=app-admin.v2.local
volumes:
  app_admin_volume:
    driver: local
    driver_opts:
      type: bind
      device: "$PWD/../services/app-admin"
      o: bind
networks:
  appnetwork:
    external: true

另外,site.conf:

server {
    listen 80;
    server_name app-admin.v2.local;

    root /var/www/app-admin/web;

    index index.html index.htm index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_log /var/log/nginx/abboom_admin_error.log;
    access_log /var/log/nginx/abboom_admin_access.log;

    error_page 404 /index.php;

    sendfile off;

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app-php:9000;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_index index.php;
    }

    location ~ /\.ht {
        deny all;
    }
}

如果我将所有配置移动到单个 docker-compose 文件中,一切正常,但使用单个文件并不灵活,因为我想为开发人员添加仅运行他们需要的应用程序而不是我们的所有应用程序的能力有

【问题讨论】:

  • 您是否尝试过使用以下语法:docker-compose -f path/to/first/yml/file -f path/to/second/yml/file up {container*}
  • 也许您也可以尝试使用links 属性:docs.docker.com/compose/compose-file/#links(例如:在您的 app-admin-nginx 服务中添加链接:-app-web)

标签: php docker nginx docker-compose


【解决方案1】:

您的主nginx 容器依赖于app-php 服务。您需要在nginx 之前启动app-php

您还需要确保这两个服务在同一个项目中运行,以便它们使用相同的网络。您可以使用 docker-compose 的 -p 选项。

https://docs.docker.com/compose/reference/overview/

用法:docker-compose [-f ...] [options] [COMMAND] [ARGS...]
docker-compose -h|--帮助

选项:-f、--file FILE 指定备用组合 文件 (默认:docker-compose.yml)
-p, --project-name NAME 指定备用项目名称 (默认:目录名)

您还可以使用自定义网络从同一网络中的不同撰写文件启动服务。

https://docs.docker.com/compose/networking/#specify-custom-networks

【讨论】:

  • 我首先使用 app-php 启动 docker-compose,然后才启动子容器,所以此时子 nginx 启动 app-php 已经启动并运行
  • 或者你的意思是我需要改变主文件中的顺序,在代理之前有 php?我不认为在这里订购很重要,但我会尝试
  • 你是在和app-php同一个项目中启动子nginx吗?默认情况下,compose 会在单独的命名空间中启动服务。即使您在两个 yaml 文件中都使用 appnetwork,但在运行时它们将是 projectname1_appnetworkprojectname2_appnetwork。因此,您需要在与 app-php 相同的命名空间中启动子 nginx 服务。您可以使用 docker-compose 的 -p 参数来设置项目名称。 docs.docker.com/compose/reference/overview
  • 它在不同的目录中,是的,我还发现 docker 在容器名称中添加了前缀,这就是为什么我使用该选项指定 `container_name:` 是创建没有该前缀的容器。但是让我尝试使用-p。我会告诉你的,谢谢
  • 非常感谢,问题确实出在网络名称中。我设置了container_name: 以防止向容器添加前缀,但我没有将name 添加到网络中。所以我将networks: appnetwork: driver: bridge 更改为networks: appnetwork: driver: bridge name: appnetwork,现在它正在工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-28
  • 1970-01-01
  • 2021-10-18
  • 2015-03-11
  • 2015-02-09
  • 1970-01-01
  • 2014-11-28
相关资源
最近更新 更多