laravel - 我想在 Docker 容器中发布 Laravel 应用程序,我应该在 Docker 中使用 Docker 还是使用 docker-compose 来添加所有服务?
问题描述
我正在构建一个行为类似于 SaaS 应用程序的 Laravel 应用程序。为了让它工作,我有以下容器:
- php
- nginx
- 一个队列容器(运行 laravel Horizon)
- 雷迪斯
- 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
解决方案
我想在 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
推荐阅读
- node.js - Passport.js 谷歌登录由中间件重定向
- android - 重新安装应用程序后访问 Android 外部存储中的图像
- javascript - Mongoose 子架构(子文档)正在返回未定义的值
- python - tkinter:调整标签文本
- javascript - 创建银行客户计划
- python - 查找特定单词后一行的所有数字
- google-analytics - 谷歌分析总是为访问的每个页面启动新会话
- android - Firebase 实时数据库安全规则允许更新但未设置
- c++ - 新建项目时没有出现空白应用程序(C++/WinRT)?
- python-3.x - 箱线图不显示图