maxbucknell/eisenhardt

不包括电池的 Docker 环境,适用于 Magento 2。

0.2.2 2017-05-17 11:22 UTC

README

一个基于 Docker 的“不包括电池”的 Magento 2 开发环境最佳实践。

这意味着这仅包含服务器配置,并且在安装 Magento 时不做任何魔术处理。我们发现我们需要一个最佳实践的开发环境来处理我们已有的项目。因此,Eisenhardt 对您的项目配置并不挑剔。您只需要在项目的根目录中设置它。

Eisenhardt 是 Docker Compose 的一个非常薄的包装器。

安装

依赖项

通过 Composer 安装!

composer global require maxbucknell/eisenhardt

入门

这将引导您设置一个干净的 Magento 安装。要在现有项目中使用 Eisenhardt,请参阅下面的相关部分。

首先,创建一个 Magento 2 项目

composer create-project \
  --repository-url=https://repo.magento.com/ \
  magento/project-community-edition:~2.1.0 \
  --no-install \
  test-eisenhardt

这将在 test-eisenhardt 目录中创建一个 Magento 2 基础项目。切换到它,并设置 Eisenhardt

eisenhardt init test-eisenhardt.loc
eisenhardt start

现在我们可以开始安装 Magento。第一步是依赖项

eisenhardt run -- composer install

现在可能是确保权限正确的时候了

eisenhardt fix-permissions

并确保数据库存在

eisenhardt run -- mysql -hdatabase -uroot -proot
MySQL [(none)]> create database showoff;

然后进行安装。以下命令将完成所有操作,但如有需要,您可以随意更改。

eisenhardt run -- n98-magerun2 setup:install \
  --backend-frontname="admin" \
  --db-host="database" \
  --db-name="showoff" \
  --db-user="root" \
  --db-password="root" \
  --http-cache-hosts="varnish:6081" \
  --base-url="http://test-eisenhardt.loc/" \
  --language="en_US" \
  --timezone="UTC" \
  --currency="EUR" \
  --admin-user="magento.admin" \
  --admin-password="password123" \
  --admin-email="magento.admin@example.com" \
  --admin-firstname="Magento" \
  --admin-lastname="Admin"

如果您正在运行企业版,您可以使用以下参数配置消息队列框架

  --amqp-host="rabbitmq" \
  --amqp-port="5672" \
  --amqp-user="guest" \
  --amqp-password="guest" \
  --amqp-virtualhost="/" \

现在有一些最终的设置任务,这些任务是可选的,但鼓励您快速设置环境

eisenhardt run -d -- n98-magerun2 setup:static-content:deploy
eisenhardt run -- n98-magerun2 cache:flush
eisenhardt run -- n98-magerun2 setup:di:compile

在此之后,您的 Magento 2 安装应该准备好使用了,但您无法访问它。要这样做,请运行 eisenhardt info,并复制 webserver 容器的 IP 地址。在您的 hosts 文件中添加一个条目

<ip_address> test-eisenhardt.loc

如果您在浏览器中访问 test-eisenhardt.loc/,您应该看到主页。使用 magento.adminpassword123 登录管理。

要查看更多详细信息和可用选项,请参阅其余的文档。

eisenhardt init
eisenhardt start
eisenhardt info
# Edit your /etc/hosts file to point your base URL to the IP address of the webserver
# Edit your app/etc/env.php to point your database at `database`.
eisenhardt run -- n98-magerun2 db:import <path/to/database.sql>

命令参考

eisenhardt init

初始化一个新的 Eisenhardt 项目或更新现有的项目。

此命令应在您的 Magento 2 安装根目录中运行。

eisenhardt start

启动 Eisenhardt 环境,并使其可用于使用。

此命令在其目录树中搜索 Eisenhardt 环境,因此可以从 Magento 2 安装内的任何目录运行。

选项

eisenhardt info

打印关于 Eisenhardt 环境的一些有用信息。

此命令在其目录树中搜索 Eisenhardt 环境,因此可以从 Magento 2 安装内的任何目录运行。

eisenhardt run

在 Eisenhardt 环境中运行命令。

有许多需要与 Magento 安装集成的管理任务。这包括但不限于

  • 运行数据库转储。
  • 运行 cron 命令进行调试。
  • 通过 Composer 安装依赖项。

您可以通过在 PHP 容器内执行命令来实现此操作,但这并不是最佳做法。这将迫使您在应用容器内安装各种命令行工具。

eisenhardt run 通过创建一个新的容器并将其注入到 Eisenhardt 环境的网络中,并挂载应用服务器上的卷来解决这个问题。然后它运行任意命令,然后删除自身。

使用的容器是 maxbucknell/console,它具有与应用服务器相同的 PHP 配置。除此之外,它还预装了各种有用的工具,包括

  • MySQL 客户端 (n98-magerun2 db:con)
  • Redis 客户端 (redis-cli -h cache)
  • Composer (composer)
  • N98-Magerun2(《n98-magerun2》)
  • Git(《git》)
  • Curl(《curl》)
  • Vim(《vim》)
  • PV
  • Liquidprompt
  • Node.js(带有npm和Yarn)

许多配置也是从主机传递到容器中的。特别是Git配置(包括别名),以及SSH Agent套接字和Composer缓存。

如果您正在运行以标志作为参数的命令,这些标志将由eisenhardt实用程序解释。为了避免这种情况,您可以引用您的命令,或者将您的命令放在一个--之后,如下所示

# Prints the Magerun help, not eisenhardt help
eisenhardt run -- n98-magerun2 --help

有关更多详细信息,请参阅该镜像的页面。

选项

eisenhardt fix-permissions

将权限设置为接近正确安装的权限。

所谓正确,我们指的是以下内容

  • 所有文件和文件夹都属于主机用户(即您!)
  • 所有文件和文件夹都属于组`eisenhardt-www (10118)`
  • 所有文件的权限为744rwxr--r--
  • 所有文件夹的权限为755rwxr-xr-x
  • 所有文件夹都被设置为“粘性”,这意味着在其中创建的新文件将继承组和权限设置。
  • var/pub/对组有写权限。
  • bin/magento被设置为可执行。

此命令可能需要一段时间才能运行,因为它涉及到很多文件。如果您在Git配置中设置了core.fileModetrue,这可能会在您的文件上生成更改。您可以提交这些更改(它们是好的权限,Brent),或者告诉Git不要跟踪权限。

eisenhardt stop

停止Eisenhardt环境,就像您关闭了您的服务器一样。

现有环境的配置

如果您正在使用Eisenhardt设置现有的Magento 2安装,您需要更改的唯一内容是env.php

首先在项目根目录中运行eisenhardt init,然后运行eisenhardt start。您需要根据入门说明添加主机条目。然后正确设置env.php参数。

以下env.php基本上适用于所有Eisenhardt安装。您可以直接复制,或取相关部分。

完成之后,需要导入数据库。首先使用eisenhardt run -- n98-magerun2 db:create创建数据库,然后使用以下内容从转储中导入:

# path/to/db.sql needs to be within your project root or Docker will not find it.
eisenhardt run -- n98-magerun2 db:import path/to/db.sql

使用eisenhardt run -- n98-magerun2 c:f进行快速缓存刷新,然后您应该可以继续了。

注意:我们在此处包含队列配置,用于企业消息队列框架。如果您使用的是社区版,则可以删除它,但它可能不会造成任何损害而保留。

<?php
return array (
  'backend' =>
  array (
    'frontName' => 'admin',
  ),
  'queue' =>
  array (
    'amqp' =>
    array (
      'host' => 'rabbitmq',
      'port' => '5672',
      'user' => 'guest',
      'password' => 'guest',
      'virtualhost' => '/',
      'ssl' => '0',
    ),
  ),
  'db' =>
  array (
    'connection' =>
    array (
      'indexer' =>
      array (
        'host' => 'database',
        'dbname' => 'magento2',
        'username' => 'root',
        'password' => 'root',
        'model' => 'mysql4',
        'engine' => 'innodb',
        'initStatements' => 'SET NAMES utf8;',
        'active' => '1',
        'persistent' => NULL,
      ),
      'default' =>
      array (
        'host' => 'database',
        'dbname' => 'magento2',
        'username' => 'root',
        'password' => 'root',
        'model' => 'mysql4',
        'engine' => 'innodb',
        'initStatements' => 'SET NAMES utf8;',
        'active' => '1',
      ),
    ),
    'table_prefix' => '',
  ),
  'install' =>
  array (
    'date' => 'Thu, 10 Feb 1994 15:12:49 +1200',
  ),
  'crypt' =>
  array (
    'key' => 'd928820f82d3e459641d334a5f1b427e',
  ),
  'session' =>
  array (
    'save' => 'redis',
    'redis' =>
    array (
      'host' => 'session',
      'port' => '6379',
      'password' => '',
      'timeout' => '2.5',
      'persistent_identifier' => '',
      'database' => '1',
      'compression_threshold' => '2048',
      'compression_library' => 'gzip',
      'log_level' => '1',
      'max_concurrency' => '6',
      'break_after_frontend' => '5',
      'break_after_adminhtml' => '30',
      'first_lifetime' => '600',
      'bot_first_lifetime' => '60',
      'bot_lifetime' => '7200',
      'disable_locking' => '0',
      'min_lifetime' => '60',
      'max_lifetime' => '2592000',
    ),
  ),
  'resource' =>
  array (
    'default_setup' =>
    array (
      'connection' => 'default',
    ),
  ),
  'x-frame-options' => 'SAMEORIGIN',
  'MAGE_MODE' => 'developer',
  'cache_types' =>
  array (
    'config' => 1,
    'layout' => 1,
    'block_html' => 1,
    'collections' => 1,
    'reflection' => 1,
    'db_ddl' => 1,
    'eav' => 1,
    'full_page' => 1,
    'config_integration' => 1,
    'config_integration_api' => 1,
    'target_rule' => 1,
    'translate' => 1,
    'config_webservice' => 1,
    'compiled_config' => 1,
  ),
  'cache' =>
  array (
    'frontend' =>
    array (
      'default' =>
      array (
        'backend' => 'Cm_Cache_Backend_Redis',
        'backend_options' =>
        array (
          'server' => 'cache',
          'port' => '6379',
          'persistent' => '',
          'database' => 0,
          'password' => '',
          'force_standalone' => 0,
          'connect_retries' => 1,
        ),
      ),
    ),
  ),
  'http_cache_hosts' => 
  array (
    0 => 
    array (
      'host' => 'varnish',
      'port' => '6081',
    ),
  ),
);

常见任务

调试

有两个运行PHP-FPM的应用服务器,它们在很大程度上是相同的。它们之间的区别是其中一个安装了Xdebug。

这两个容器的名称分别是appserverappserver_debug。如果您需要调试,应切换到使用该容器。在大多数情况下不安装Xdebug可以避免与Xdebug相关的性能损失。

切换非常简单。只需发送一个IDE密钥为"docker"的Xdebug cookie,然后Web服务器将智能路由您的请求。由于其他一切都是共享的,因此此切换是完全透明的。

调试控制台命令

要调试控制台命令,您必须在eisenhardt run中传递-x标志。这将运行一个带有Xdebug的容器,并设置相关环境变量以通过IDE密钥"docker"触发XDebug。

在主机上运行MySQL

在主机上运行MySQL是一个常见的请求。这可能是因为性能原因,或者仅仅是方便。如果您想这样做,您需要将env.php中的数据库设置替换为以下部分

<?php

// ...
'db' => 
array (
  'connection' => 
  array (
    'indexer' => 
    array (
      'host' => `/sbin/ip route|awk '/default/ { print $3 }'`,
      'dbname' => '{DATABASE}',
      'username' => '{USER}',
      'password' => '{PASSWORD}',
      'model' => 'mysql4',
      'engine' => 'innodb',
      'initStatements' => 'SET NAMES utf8;',
      'active' => '1',
      'persistent' => NULL,
    ),
    'default' => 
    array (
      'host' => `/sbin/ip route|awk '/default/ { print $3 }'`,
      'dbname' => '{DATABASE}',
      'username' => '{USER}',
      'password' => '{PASSWORD}',
      'model' => 'mysql4',
      'engine' => 'innodb',
      'initStatements' => 'SET NAMES utf8;',
      'active' => '1',
    ),
  ),
  'table_prefix' => '',
),
// ...

这将根据Docker容器动态设置数据库主机为your主机IP。

RabbitMQ

RabbitMQ 会在很大程度上自行管理,但问题有时还是会发生。使用的容器包含管理控制台。可以通过访问 /eisenhardt/rabbitmq 并登录来访问它。默认情况下,用户名和密码都设置为 guest

邮件

在本地测试邮件是很常见的。Eisenhardt 包含 MailHog,它可以捕获发送到任何电子邮件地址的所有邮件,并在网页界面中显示它们。

可以直接访问 MailHog,但最好的方法是访问您的 Magento 网络服务器上的 /eisenhardt/mail,这将代理访问。

此外,所有邮件都保存在 .eisenhardt/mail 卷中,作为记录,也是直接检查来源的便捷方式。

技术细节

.eisenhardt 目录

当您运行 eisenhardt init 时,它会在您的 Magento 2 安装根目录下创建一个目录。这个目录包含一些卷、Docker Compose 的各种配置文件和一些服务器配置文件。

建议将此文件夹添加到您的项目中(它包含一个 .gitignore 文件)。这允许团队成员维护一致和共享的开发环境。

虽然可以编辑这些文件(例如,如果您的 MySQL 配置需要调整,因为您有特殊需求),但请注意,通过重新运行 eisenhardt init 更新 Eisenhardt 安装将不会尊重您的更改。

容器清单

Eisenhardt 提供了各种容器,它们都执行不同的功能。以下是完整的列表

  • varnish_webserver (nginx:alpine):您将访问的 web 服务器。负责 SSL 终止并发送到 Varnish。
  • nginx (nginx:alpine):PHP 前面的 web 服务器。
  • appserver (maxbucknell/php:7.0):通常运行 Magento 的容器。
  • appserver_debug (maxbucknell/php:7.0-xdebug):与 appserver 相似,但带有 Xdebug。
  • database (percona:5.6):数据库。
  • cache (redis:alpine):缓存后端。
  • varnis (maxbucknell/varnish:4):页面缓存后端。
  • session (redis:alpine):会话存储后端。
  • mailhog (mailhog/mailhog):捕获邮件的 SMTP 服务器。
  • rabbitmq (rabbitmq:management-alpine):消息队列后端。
  • elasticsearch (elasticsearch:5):Elastic Search 后端。
  • kibana (kibana:5):Elastic Search 的管理后端。

自定义容器

Varnish 和 PHP 是自定义容器。这些在 Docker Hub 上可用,但也包含在 Eisenhardt 的主要仓库中。进入 dockerfiles/ 目录,并运行 ./build.sh

Docker Compose 文件

Eisenhardt 被分割成许多不同的 YAML 文件。这允许以各种不同的配置启动环境。例如,端口号映射在另一个文件中配置(ports.yml),因此可以带或不带端口号映射启动环境。

  • base.yml:基础 YAML 文件,包含对于生产环境至关重要的服务。这里没有卷存在。
  • dev.yml:开发所需的服务,包括 appserver_debugmailhog
  • ports.yml:映射端口 :80:443:3306(RabbitMQ)、:15672(Mailhog)和 :1080

项目名称

Docker Compose 通过 "项目" 分组服务。项目通常是由单个 docker-compose up 调用启动的一组服务。项目需要一个名称,可以通过 -p 参数指定,但默认情况下将根据包含 *.yml 文件的目录名称生成。

Eisenhardt 根据 Magento 项目的目录名称设置其项目的自定义名称。如果让其自行处理,Docker Compose 将每次都将其项目命名为 "eisenhardt",因为 YAML 文件就存储在那里。

权限

默认情况下,Docker以root用户运行。这是可以的,因为这通常意味着它可以做它需要做的任何事情。当你处理由Docker容器生成的文件时,无论是提交还是删除,就会出现问题。

一个简单的 rm -rf pub/static 就会变得有问题。

因此,Eisenhardt的所有服务器都被配置为以非特权用户运行。对于Eisenhardt来说,实际的用户ID并不重要,因为所有文件都应该属于你的主机用户。Eisenhardt使用组权限来完成其任务。

Nginx以其典型的用户 nginx:nginx 运行。这个用户没有修改任何文件的能力,但所有文件都应该设置为世界可读。

PHP以自定义用户 eisenhardt-www:eisenhardt-www (10118:10118) 运行。这是一个自定义用户(为了统一Alpine和Debian之间的UID)。所有文件的组应该设置为这个,因为 pub/var/ 被设置为组可写。PHP只对其他所有文件有读取权限,因为那就是它需要的。

其他服务不与文件级别的Magento 2安装进行交互,所以它们的凭证不太重要。

当运行 eisenhardt run 时,会创建一个Docker容器。你的主机 /etc/passwd 被映射到容器中,并且它被配置为以你的用户ID运行。这意味着运行类似 eisenhardt run -- whoami 的命令将返回你的用户名。然而,我们还设置了容器内的用户为主组 10118eisenhardt-www。这意味着所有在 eisenhardt run 调用中创建的文件将保持一致的权限。

Eisenhardt附带一个命令 eisenhardt fix-permissions,用于设置上述描述的权限。按照这种模式通常不会出现权限问题。