首页 > 解决方案 > 我想在 Docker 容器中发布 Laravel 应用程序,我应该在 Docker 中使用 Docker 还是使用 docker-compose 来添加所有服务?

问题描述

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

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

标签: laraveldockerdocker-compose

解决方案


我想在 Docker 容器中发布 Laravel 应用程序,

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

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

我应该在 Docker 中使用 Docker 还是 docker-compose 来添加所有服务?

Docker 中的 Docker 是用于 docker 开发的,有些人在 CI 管道中使用它,甚至在这里根据创建者的话谨慎使用它:

Docker-in-Docker 的主要目的是帮助 Docker 本身的开发。许多人使用它来运行 CI(例如使用 Jenkins),起初看起来不错,但他们遇到了许多“有趣”的问题,这些问题可以通过将 Docker 套接字绑定安装到您的 Jenkins 容器中来避免。

专业部署

现在我的问题是:发布这样一个多服务应用程序的最专业的方式是什么。

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

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

安全

数据库端口

    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

提供秘密的更好方法是将它们设置在.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

推荐阅读