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

  • php
  • nginx
  • 队列容器(运行laravel地平线)
  • redis
  • 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
    

    最佳答案



    当我与Laravel一起工作时,我启动了Php Docker Stack软件包,用于将带有docker的Laravel部署到生产中,因为所有解决方案均按时集中在开发工作流上,但是与此同时,我转而从事Security的工作,并停止了它的开发,但您可以将其用作专业部署的起点,因为它将每个服务都分成了自己的容器。

    然后,将开发堆栈从生产堆栈扩展,而不是像其他许多堆栈中那样相反。



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



    专业部署



    这确实取决于您的客户端用户群的技术水平,但是您可以从docker compose开始,然后再升级到Docker Swarm甚至Even 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
    

    10-06 10:16
    查看更多