gpt4 book ai didi

laravel - 我想在 Docker 容器中发布 Laravel 应用程序,我应该在 Docker 中使用 Docker 还是使用 docker-compose 来添加所有服务?

转载 作者:行者123 更新时间:2023-12-02 20:59:50 29 4
gpt4 key购买 nike

我正在构建一个行为类似于 SaaS 应用程序的 Laravel 应用程序。为了让它工作,我有以下容器:

  • php
  • nginx
  • 一个队列容器(运行 laravel Horizo​​n)
  • 雷迪斯
  • mysql
  • 可能会变得更多...

  • 为了开发,我为我的本地代码库创建了共享。现在我的问题是:发布这样一个多服务应用程序的最专业的方式是什么。我知道这不仅仅是创建一个运行所有服务的 ubuntu 容器。

    这是我目前的 docker-compose.yml
    version: "3.7"

    services:

    store:
    restart: unless-stopped
    image: redis:4.0.11-alpine
    volumes:
    - redis-data:/data

    database:
    restart: unless-stopped
    image: mysql:5.7.27
    command: --default-authentication-plugin=mysql_native_password
    ports:
    # So you can use a database client on your host machine
    - 3306:3306
    environment:
    - MYSQL_ROOT_PASSWORD=secret
    volumes:
    - mysql-data:/var/lib/mysql

    php:
    restart: unless-stopped
    # image: php:7.3.10-fpm-alpine
    build:
    context: .
    dockerfile: ./docker/dockerfiles/PHP/Dockerfile
    working_dir: /code
    volumes:
    - code-sync:/code:nocopy
    - terminal-history:/root/
    - ./docker/config/php-fpm/xdebug.ini:/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
    - ./docker/config/php-fpm/www.conf:/usr/local/etc/php-fpm.d/www.conf

    queue:
    image: custom-laravel_php
    entrypoint: php artisan horizon
    working_dir: /code
    volumes:
    - code-sync:/code:nocopy

    webserver:
    restart: unless-stopped
    image: nginx:1.15.0-alpine
    depends_on:
    - database
    - store
    # - certbot
    - php
    ports:
    # Exposing both http and https
    - 80:80
    - 443:443
    volumes:
    - code-sync:/code:nocopy
    - ./docker/config/default.conf:/etc/nginx/conf.d/default.conf

    volumes:
    mysql-data:
    redis-data:
    terminal-history:
    code-sync:
    external: true

    最佳答案

    I would like to ship a Laravel app in a Docker container,



    当我在 Laravel 专业工作时,我启动了 Php Docker Stack ,这是一个将 Laravel 和 docker 部署到生产环境中的 Composer 包,因为所有解决方案都按时集中在开发工作流程中,但同时我转向安全部门工作,并停止了它的开发,但您可以将其用作专业部署的起点,因为它将每个服务分隔到自己的容器中。

    然后从生产堆栈扩展开发堆栈,而不是在许多其他堆栈中看到的相反方式。

    should I use Docker in Docker or docker-compose to add all services?



    Docker 中的 Docker 用于 docker 开发,有些人在 CI 管道中使用它,甚至在这里根据 the words of the creator 谨慎使用它:

    The primary purpose of Docker-in-Docker was to help with the development of Docker itself. Many people use it to run CI (e.g. with Jenkins), which seems fine at first, but they run into many “interesting” problems that can be avoided by bind-mounting the Docker socket into your Jenkins container instead.



    专业部署

    Now my question is: what is the most professional way to ship such a multi-service application.



    这实际上取决于您的客户端用户群的技术水平,但您可以从 docker compose 开始,然后升级到 Docker Swarm 甚至 Kubernetes。

    尝试提供来自上游私有(private)注册表的所有镜像,而不是像在其中一些镜像中那样在本地构建它们。

    安全

    数据库端口
        ports:
    # So you can use a database client on your host machine
    - 3306:3306

    这个 3306:3306 相当于 0.0.0.0:3306:3306 ,因此如果您希望数据库仅在 localhost 中可用,您应该改为 127.0.0.1:3306:3306 ,但是如果您的数据库只需要对堆栈中的其他容器可用,那么您可以完全删除端口,而是您可以使用 docker compose 服务名称从代码中调用数据库,在您的情况下为 database

    数据库密码
    environment:
    - MYSQL_ROOT_PASSWORD=secret

    提供 secret 的更好方法是将它们设置在项目根目录的 .env 文件中,然后在 docker-compose.yml 中使用变量:
    environment:
    - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD? Missing password for mysql root user.}

    或者只需将 environment: 上的 docker-compose.yml 替换为项目根目录中的 .env 文件:
    env_file:
    - ./.env

    关于laravel - 我想在 Docker 容器中发布 Laravel 应用程序,我应该在 Docker 中使用 Docker 还是使用 docker-compose 来添加所有服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60952221/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com