reach-digital/docker-devbox

Reach Digital Docker+本地混合开发环境。

安装次数: 22,501

依赖: 0

建议者: 0

安全性: 0

星星: 19

关注者: 5

分支: 4

公开问题: 4

语言:VCL

类型:magento2-component

v4.2.0 2024-07-16 09:40 UTC

README

Docker用于服务,PHP本地运行。无需同步,无心理负担,无性能损失。 phpnginxhttpshttp/2varnishmysqlelasticsearchrabbitmqmailhog

理由

Docker易于使用,Docker可扩展,我们热爱Docker,但Docker的卷挂载速度较慢,我们不能忍受缓慢。

所有Docker开发箱的问题在于它们需要在VM内部运行PHP。VM中的PHP的问题是文件需要在VM中可用,但它还需要在VM外部有文件,因为像PHPStorm这样的程序不接受网络驱动器。

同步比不同步慢。 docker-syncunisonmutagen 提供了良好的同步解决方案,但总是比不同步慢。

然而,同步需要额外的硬盘空间和额外的心理负担:我的文件是否已同步?我的同步是否损坏?是否有同步冲突?为什么那个文件会出现在这里?我应该在哪里执行我的PHP CLI脚本?我应该在哪里运行node CLI?为什么我的系统这么慢?同步很糟糕。

目标

  • 对于没有任何后端技能的前端开发者来说,应该能够轻松地设置开发环境。
  • 后端开发者应该能够添加或升级服务。
  • 后端开发者应该能够通过版本控制将更改传播到团队的其他成员。

原则

  • 无魔法:尽可能少的CLI工具将自动“修复”事情。不要使用现有工具的包装器:docker等。例外:PHP本地运行,需要设置。
  • 声明式:开发者应该定义最终状态,而不是运行升级脚本(因此,使用docker)。
  • 最小化:尽可能少地使用CPU周期和内存。

要求

  • 最近的OSX

全局安装(仅一次)

清理您的系统

由于我们在本地运行一些事情,现在可能是清理一些东西的好时机。

  • 运行 brew doctor 并确保您没有错误。
  • 运行 brew update 以更新到最新版本。

您不应该有任何服务正在运行,例如。

  • php:使用 brew list | grep php 找到它们,使用 brew uninstall —f <packages> 卸载它们。使用强制标志,您将删除所有已安装的公式版本。
  • httpd禁用Apache,它是OSX本地自带的。 https:/// 不应返回任何内容。
  • mysql:卸载或禁用mysql,或者至少确保它不在默认的MySQL端口上运行。
  • nginx:卸载

查看 ~/.bash_profile~/.zshrc 并确保它不包含对 $BREW_PREFIX/Cellar/php* 的任何引用。

安装PHP和php-fpm服务

由于我们正在运行混合docker+本地系统,我们需要设置PHP以本地运行。为此提供了一个install.sh脚本,您可以在克隆此存储库后在本地上运行它。

您也可以直接从GitHub运行它(这存在一些安全风险)

# Cleans existing brew php (will not remove Valet stuff) + installs php on macOS
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/ho-nl/docker-development-box/master/install.sh)"

将安装多个php-fpm服务,每个版本一个(端口:9072、9073、9074等),以及每个版本带有xdebug的服务(端口:9172、9173、9174等)。

切换PHP版本

您可以使用brew link来切换CLI PHP版本。例如,切换到8.2:

brew unlink php@8.2 && brew link --force --overwrite php@8.2

现在应该显示正确的版本(使用php -v检查)。如果不行,可能仍然有版本已链接,或者您的~/.bash_profile需要清理,或者您需要重新打开CLI。

为了方便地在版本之间切换,您可以设置别名,如下所示:

alias link-php74='brew unlink php@7.4 && brew link --force --overwrite php@7.4'
alias link-php81='brew unlink php@8.1 && brew link --force --overwrite php@8.1'
alias link-php82='brew unlink php@8.2 && brew link --force --overwrite php@8.2'

安装Docker

  1. 安装Docker for Mac的最新版本。
  2. 启动Docker
  3. 从备份中排除~/Library/Containers
  4. brew install ctop:可以用来显示容器指标。
  5. 打开Docker -> 预设
  6. 将内存设置为6-8 GB

安装nfs

下面-mapall=501:20部分指的是您的用户ID(501)和组ID(staff 20)。如果您的用户ID不是501,您可能需要调整您的用户ID。您可以通过运行id来检查。

  1. sudo nano /etc/exports添加:/System/Volumes/Data -alldirs -mapall=501:20 localhost
  2. sudo nano /etc/nfs.conf添加:nfs.server.mount.require_resv_port = 0
  3. sudo nfsd restart

基于本文

安装本地证书

  • 下载原始.pem文件(打开原始,然后按CMD + S)
  • ./hitch/*.localhost.reachdigital.io.pem
  • 打开keychain.app,添加此文件(您可以将此文件拖放到keychain app的登录选项卡下)。
  • 打开证书并信任证书(通过右键单击条目,选择“获取信息”,然后在“信任”部分选择“始终信任”)

您现在已经完成了全局安装 🎉

项目安装

这涵盖了最初将docker-devbox支持添加到Magento项目的操作;如果您的项目已经添加了docker-devbox支持,请参阅项目的README。

  • 在项目中安装(并提交)此包:composer require reach-digital/docker-devbox ^4.0.0
  • 安装static-content-deploy 补丁并删除现有的静态链接内容:rm -rf pub/static/*/*
  • 将提供的docker-compose.example.yml文件复制到docker-compose.yml
    • 将来更新docker-devbox包时,您可能需要检查示例文件中的更改,并将其包含在您项目的副本中。
  • 根据您的项目需求更改docker-composer.yml,并将此文件作为项目的一部分提交
    • 更改FPM_PORTFPM_XDEBUG变量以适应nginx服务的正确PHP版本
  • 您可以使用env.php作为您本地env.php的基础,它与所有docker服务兼容
    • 更改crypt.key值(从现有的生产环境或从最初生成的env.php中获取,如果这是一个全新的项目)
    • 更改基本URL(system.default.web.*.base_url

使用方法

  • 启动:docker-compose up -d
  • 日志:ctop
  • 停止:docker-compose down

您现在已设置所有服务 🎉。请参阅以下各个服务以设置URL、缓存等。

删除数据(mysql/elasticsearch)

  • docker-compose down
  • rm -rf var/.esdata/*
  • rm -rf var/.mysqldata/*
  • docker-compose up -d

请确保MySQL初始化数据目录大约需要一分钟或两分钟时间 - 在这段时间内,它将不接受连接。

mysql、elasticsearch、rabbitmq、mailhog等的设置

如何使用Xdebug?

  • Web: 当您安装了Xdebug助手并且PHPStorm正在监听连接时,Xdebug默认应该可以正常工作。
  • 命令行:您可以在~/.bash_profile~/.zshrc中添加以下别名,这将自动检测您的活动PHP版本,并允许您使用类似phpd bin/magento ...的方式调试。
    alias phpd="XDEBUG_SESSION=1 php -c \$(brew --prefix)/etc/php/\$(php -v | head -n1 | cut -c 5-7)/php-xdebug.ini"
    
  • 测试:在PhpStorm中创建一个本地解释器,您正在寻找的PHP版本应该会被建议。配置🐞 Xdebug路径:以启用xdebug(从安装脚本的输出中)。路径可能是类似/usr/local/Cellar/php/7.4.3/pecl/20190902/xdebug.so的路径。您可以在您的php-xdebug.ini中查找确切的路径。

如何设置我的cron?

默认设置

日志在哪里可以找到?

  • 对于所有其他服务,启动ctop并在键盘上按<-
  • phplogs: tail -f `brew --prefix`/var/log/php*(可能为空,因为它只会输出真正的错误)

如何设置URL/https?

仅通过hitch使用https。Docker容器不支持http,只支持https。

bin/magento config:set --lock-env web/unsecure/base_url https://blabla.localhost.reachdigital.io/
bin/magento config:set --lock-env web/secure/base_url https://blabla.localhost.reachdigital.io/
# You can use any domain that points to 127.0.0.1, you can't use https:// because Magento can't handle that.
# *.localhost.reachdigital.io always resolves to 127.0.0.1

如何设置多个网站?

为了使我们的nginx设置能够与多个网站一起工作,我们需要将nginx环境参数MAGE_RUN_TYPEstore更改为website

为了定义我们的网站或商店视图代码,我们必须添加一个新的配置文件,例如nginx-map.conf$MAGE_RUN_CODE是相关的website_codestoreview_code

map $http_host $MAGE_RUN_CODE {
    default '';
    example-dutch.localhost.reachdigital.io 'example_dutch';
    example-german.localhost.reachdigital.io 'example_german';
}

将文件路径添加到nginx卷中,例如

    volumes:
      - ./nginx-map.conf:/etc/nginx/conf.d/map.conf:ro

现在您的网站或商店视图应该可用。

有关更多信息,请参阅magento文档:https://experienceleague.adobe.com/docs/commerce-operations/configuration-guide/multi-sites/ms-nginx.html

如何使用和设置Varnish?

默认使用https://www.varnish-software.com/缓存。

bin/magento setup:config:set --http-cache-hosts=127.0.0.1:6081
bin/magento config:set --lock-config system/full_page_cache/caching_application 2
  • 您可以使用bin/magento cache:cleancache:flush来刷新Varnish。
  • 您可以使用CMD+SHIFT+R绕过Varnish的任何页面。
  • 您可以使用端口6082和docker-devbox-varnish-secret作为共享密钥来连接到Varnish管理界面。

如何设置Redis?

php bin/magento setup:config:set --cache-backend=redis --cache-backend-redis-db=0 --cache-backend-redis-port=6379
php bin/magento setup:config:set --session-save=redis --session-save-redis-db=2 --session-save-redis-port=6379

bin/magento损坏时,如何直接刷新Redis?docker-compose exec redis redis-cli flushall

如何设置ElasticSearch?

bin/magento config:set --lock-config catalog/search/enable_eav_indexer 0
bin/magento config:set --lock-config catalog/search/engine [elasticsearch7 OR  elasticsuite]
bin/magento config:set --lock-env catalog/search/elasticsearch6_server_port 9200
bin/magento config:set --lock-env catalog/search/elasticsearch6_server_hostname localhost

如何设置MailHog?

截至Magento 2.4.6,不再需要第三方SMTP发送模块。以下配置更改将确保邮件被发送到Mailhog

bin/magento config:set --lock-env system/smtp/disable 0
bin/magento config:set --lock-env system/smtp/transport smtp
bin/magento config:set --lock-env system/smtp/host localhost
bin/magento config:set --lock-env system/smtp/port 1025

对于2.4.6之前的magento版本,请参阅https://github.com/ho-nl/docker-development-box/tree/741d193a68200c976cd13987a986d7063a984b1d?tab=readme-ov-file#how-do-i-set-up-mailhog

Mailhog网络界面在https://:8025/

如何设置RabbitMQ?

bin/magento setup:config:set --amqp-host=localhost --amqp-port=5672 --amqp-user=guest --amqp-password=guest
https://:15672

如何设置Ngrok?

Ngrok通过安全隧道将本地服务器暴露给公网。

https://:4551
Update base urls with tunnel url shown on webpage.

默认情况下,启动了一个未注册的会话,这将限制每分钟的连接数。使用环境参数添加您的authtoken将为您提供更多功能和更长的会话时间。

  - PARAMS=http -region=eu --authtoken=<token> nginx:80

如何设置Sphinx?

暂无支持。

如何直接通过SSH连接到我的容器?

  1. 打开ctop
  2. ⮐ 在您的服务上
  3. 执行shell

请注意,容器尽可能精简,因此并非所有常见工具都可用,但您应该能够应对。

我想为服务创建一个自定义配置。

所有设置都是通过docker-compose.yml文件进行的。您在那里可以看到配置文件的路径。

  1. 更改到您的自定义配置文件路径。
  2. 运行docker-compose down && docker-compose up -d
  3. 更改应该已应用,检查ctop以确认您的容器是否能够启动。

如何重启php-fpm?

pkill php-fpm

提交

提交通过https://github.com/conventional-changelog/commitlint进行验证

Gittower:Gittower无法正确读取您的PATH变量,因此提交验证不工作。使用gittower .来打开此仓库。

故障排除

Compose文件'./docker-compose.yml'无效

错误:Compose文件'./docker-compose.yml'无效,因为:对于services.mailhog不支持配置选项'platform'

请更新Docker以修复此错误。此错误发生是因为您的Docker版本过低,不支持platform选项。此选项用于docker-development-devbox的较新版本,以启用对Intel和Apple Silicon MacBook的支持。

docker-composer和/或ctop无法连接到Docker守护进程

错误:无法连接到Docker守护进程。您可能需要启动Docker for Mac。

这可能发生在您从旧版本的Docker升级后。在较新版本的Docker中,可以通过连接到守护进程的套接字文件已移动到~/.docker/run/docker.sock。像ctopdocker-composer这样的程序使用/var/run/docker.sock的符号链接,它可能仍然指向旧路径。

要更正此问题,请运行以下命令

sudo ln -sf ~/.docker/run/docker.sock /var/run/docker.sock