我正在构建一个行为类似于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
最佳答案
当我与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