我无法部署该项目。 docker-compose 和 nginx 的问题

Posted

技术标签:

【中文标题】我无法部署该项目。 docker-compose 和 nginx 的问题【英文标题】:I cannot deploy the project. Problem with docker-compose and nginx 【发布时间】:2020-09-06 11:59:54 【问题描述】:

yii2中有一个工作脚本,我无法部署它。 Docker 构建项目,一切都很好,但是如果我将 nginx 配置从 docker 替换为 nginx/sites-available/default,则会出现错误: nginx:在 /etc/nginx/sites-enabled/default:111 的上游“app:9000”中找不到 [emerg] 主机 我在论坛上读到我需要添加depends_on 指令: 取决于: -应用程序 但在这种情况下,错误开始出现在: docker-compose -f docker-compose.yml up -d

我替换了不同的版本 - 从“1”到“3.4”,仍然出现错误。这是最后一个: 错误:撰写文件“./docker-compose.yml”无效,因为: services.environment 不支持的配置选项:'XDEBUG_CONFIG' 无效的***属性“环境”。此 Compose 文件的有效***部分是:服务、版本、网络、卷和以“x-”开头的扩展。

您可能会看到此错误,因为您使用了错误的 Compose 文件版本。指定支持的版本(例如“2.2”或“3.3”)并将您的服务定义放在services 键下,或者省略version 键并将您的服务定义放在文件的根目录以使用版本1. 有关 Compose 文件格式版本的更多信息,请参阅 https://docs.docker.com/compose/compose-file/

该项目仅适用于 php-7.0

这是原始(来自项目)nginx 配置:

## FRONTEND ##
server 
    listen 80 default;

    root /app/frontend/web;
    index index.php index.html;

    server_name yii2-starter-kit.dev;

    charset utf-8;

    # location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|pdf|ppt|txt|bmp|rtf|js)$ 
    #    access_log off;
    #    expires max;
    # 

    location / 
        try_files $uri $uri/ /index.php?$args;
    

    client_max_body_size 32m;

    # There is a VirtualBox bug related to sendfile that can lead to
    # corrupted files, if not turned-off
    # sendfile off;

    location ~ \.php$ 
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass php-fpm;
        fastcgi_index index.php;
        include fastcgi_params;

        ## Cache
        # fastcgi_pass_header Cookie; # fill cookie valiables, $cookie_phpsessid for exmaple
        # fastcgi_ignore_headers Cache-Control Expires Set-Cookie; # Use it with caution because it is cause SEO problems
        # fastcgi_cache_key "$request_method|$server_addr:$server_port$request_uri|$cookie_phpsessid"; # generating unique key
        # fastcgi_cache fastcgi_cache; # use fastcgi_cache keys_zone
        # fastcgi_cache_path /tmp/nginx/ levels=1:2 keys_zone=fastcgi_cache:16m max_size=256m inactive=1d;
        # fastcgi_temp_path  /tmp/nginx/temp 1 2; # temp files folder
        # fastcgi_cache_use_stale updating error timeout invalid_header http_500; # show cached page if error (even if it is outdated)
        # fastcgi_cache_valid 200 404 10s; # cache lifetime for 200 404;
        # or fastcgi_cache_valid any 10s; # use it if you want to cache any responses
    


## BACKEND ##
server 
    listen 80;

    root /app/backend/web;
    index index.php index.html;

    server_name backend.yii2-starter-kit.dev;

    charset utf-8;

    client_max_body_size 16m;

    # There is a VirtualBox bug related to sendfile that can lead to
    # corrupted files, if not turned-off on Vagrant based setup
    # sendfile off;

    location / 
        try_files $uri $uri/ /index.php?$args;
    

    # location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|pdf|ppt|txt|bmp|rtf|js)$ 
    #     access_log off;
    #    expires max;
    # 

    location ~ \.php$ 
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass php-fpm;
        fastcgi_index index.php;
        include fastcgi_params;
    



## STORAGE ##
server 
    listen 80;
    server_name storage.yii2-starter-kit.dev;

    root /app/storage/web;
    index index.html;
    # expires max;

    # There is a VirtualBox bug related to sendfile that can lead to
    # corrupted files, if not turned-off
    # sendfile off;

    location / 
        try_files $uri $uri/ /index.php?$args;
    

    location ~ \.php$ 
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass php-fpm;
        fastcgi_index index.php;
        include fastcgi_params;
    


## PHP-FPM Servers ##
upstream php-fpm 
    server app:9000;


## MISC ##

### WWW Redirect ###
#server 
#    listen       80;
#    server_name  www.yii2-starter-kit.dev;
#    return       301 http://yii2-starter-kit.dev$request_uri;
#

原始(来自项目)docker-compose.yml

data:
  image: busybox:latest
  volumes:
    - ./:/app
  entrypoint: tail -f /dev/null

app:
  build: docker/php
  working_dir: /app
  volumes_from:
    - data
  expose:
    - 9000
  links:
    - db
    - mailcatcher
  environment:
    XDEBUG_CONFIG: "idekey=PHPSTORM remote_enable=On remote_connect_back=On"

nginx:
  image: nginx:latest
  ports:
    - "80:80"
  volumes:
    - ./:/app
    - ./docker/nginx/vhost.conf:/etc/nginx/conf.d/vhost.conf
  links:
    - app

mailcatcher:
    image: schickling/mailcatcher:latest
    ports:
      - "1080:1080"

db:
  image: mysql:5.7
  volumes:
    - /var/lib/mysql
  ports:
    - "3306:3306"
  environment:
    MYSQL_ROOT_PASSWORD: root
    MYSQL_DATABASE: yii2-starter-kit
    MYSQL_USER: ysk_dbu
    MYSQL_PASSWORD: ysk_pass

请帮助为 nginx 和 docker-compose 进行正确的配置。

yii2 新手。 我将非常感谢任何帮助和建议。

提前谢谢你!

【问题讨论】:

【参考方案1】:

在顶层没有version: 键的撰写文件是version 1 Compose file。这是 Compose YAML 文件格式的非常旧版本,不支持网络、卷或其他现代 Compose 功能。您应该选择版本 2 或 3。(版本 3 更面向 Docker 的 Swarm 编排器,因此对于单主机设置中的某些特定选项,您可能需要指定版本 2。)您需要指定***version: 密钥,然后您需要的服务进入*** services: 密钥。

version: '3.8'
services:
  app:  ... 
  nginx:  ... 
  mailcatcher:  ... 
  db:  ... 

这实际上将直接解决您当前的问题。正如Networking in Compose 中所讨论的,Compose(带有版本 2 或 3 配置文件)将为您创建一个default 网络并注册容器,以便它们的服务名称(如app)可用作主机名。您不需要links: 或其他配置。

在您显示的 Compose 文件中还有许多其他不必要的选项。您不需要将图像的WORKDIR 重复为容器的working_dir:;您不需要expose: 端口(与将ports: 发布到主机不同);将获取COPYed 的代码覆盖到来自主机的带有volumes: 的图像中并不是一个很好的做法。

在现代 Docker 中,您也倾向于不使用数据卷容器。相反,较新版本的 Compose 具有可以声明命名卷的 top-level volumes: key。例如,您可以将其用于后备数据库存储。

所有这些的最终结果将是一个 Compose 文件,例如:

# Specify a current Compose version.
version: '3.8'

# Declare that we'll need a named volume for the database storage.
volumes:
  mysql_data:

# The actual Compose-managed services.
services:
  app:
    build:
      # If the application is in ./app, then the build context
      # directory must be the current directory (to be able to
      #   COPY app ./
      # ).
      context: .
      dockerfile: docker/php/Dockerfile
    environment:
      XDEBUG_CONFIG: "idekey=PHPSTORM remote_enable=On remote_connect_back=On"

  nginx:
    # Build a separate image that will also
    #   FROM nginx
    #   COPY app /usr/share/nginx/html
    #   COPY docker/nginx/vhost.conf /etc/nginx/conf.d
    build:
      context: .
      dockerfile: docker/nginx/Dockerfile
    ports:
      - "80:80"

  mailcatcher:
    image: schickling/mailcatcher:latest
    ports:
      - "1080:1080"

  db:
    image: mysql:5.7
    volumes:
      # Use the named volume we declared above
      - mysql_data:/var/lib/mysql
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: yii2-starter-kit
      MYSQL_USER: ysk_dbu
      MYSQL_PASSWORD: ysk_pass

【讨论】:

以上是关于我无法部署该项目。 docker-compose 和 nginx 的问题的主要内容,如果未能解决你的问题,请参考以下文章

docker-compose 部署 Vue+SpringBoot 前后端分离项目

docker-compose 部署python项目

Docker-compose部署java项目

基于Docker-Compose 部署前后端分离单体项目(一)

使用Docker-Compose对项目进行部署

使用Docker-Compose对项目进行部署