LoginSignup
5
3

More than 3 years have passed since last update.

wardenを利用して Magento2ローカル開発環境を構築する

Last updated at Posted at 2019-12-21

本記事は、Magento Advent Calendar 21日目の記事となります。

注: warden解説記事の最新版はこちらです!(2021/3)

本記事では、巷で話題となっているMagentoローカル開発環境を容易に構築できる、WardenというCLIツールの使い方を紹介したいと思います。

既に実用的でかつ大変便利なツールではあるものの、最近ではAdobe Magento社のDeveloperからもプルリクエストが飛んでいるようで、現在進行形で爆速進化中といった様子です。

Wardenがやってくれること。

・SSLの終端制御とProxy/Routingによる、コンテナへのルーティング
・.testドメインに対するDNSレスポンス
・ローカル環境でのSSL証明書の発行
・Magento2インスタンスの構築

仕組み

Wardenは下記の構成で管理されています。

メインのWarden用コンテナが4つ。 Magentoインスタンス用のコンテナが9つ。

◆メイン

・Dnsmasq ・・・ *.testドメインへの名前解決を担当。 (/etc/hostsを手動で変更する必要がなくなる)
・Traefik ・・・ アクセスされたドメイン名を元に、各MagentoインスタンスのVarnishコンテナにルーティング。
・Portainer ・・・ DockerコンテナをGUIから操作できる便利ツール (放置気味。。)
・Sshd ・・・ MysqlWorkBenchなどからコンテナにアクセスするための、SSHトンネル用コンテナ

◆Magento(持て余すほどのフル構成)

  • Varnish (ルーティング用にTraefie用のラベルが付けられている)
  • Nginx (Cookieの値をみて、PHP-FPMを使い分ける設定がされている)
  • PHP-FPM (n98-magerunが標準装備・Mailhogの設定済)
  • PHP-FPM(Xdebug用)
  • MariaDB (DockerHubの公式イメージ)
  • Redis (Session・Cacheの保存用)
  • ElasticSearch (検索・インデックス)
  • RabbitMQ (非同期のメッセージングサービス)
  • MailHog (メール送信テスト環境)

図にまとめてみるとこのような構成。

warden.png

基本的な動き

ユーザからのhttpsアクセスに対して、dnsmasqコンテナでドメインの名前解決を行い、
Varnishに付与されているラベルを元に、traefikコンテナで各Magentoインスタンスへのリクエストのルーティングを行なっています。

Magentoインスタンスをいくつ増やしても、traefikが自動的にコンテナの生成を検知し、リクエストのルーティングを行ってくれるため、前段のdnsmasq、traefikを一切管理しなくて良いのが良いところ。

xdebugの有効/無効の切り替えが容易

wardenでは、php-fpmコンテナを常時二つ稼働させており、片方はxdebugの設定がされています。

CookieにXDEBUG_SESSIONキーが挿入されていると、php-fpm(xdebug用)が使用されるようにnginxで制御されています。

php-fpm.png

Mailhogが捗る

デフォルトでPHP-FPMにMailhogの設定がされているため、Warden開発環境で送信されるメールは全てMailhogにプロキシーされます。

プロキシーされたメールは、https://mailhog.{project名}.test/ から確認可能。

使ってみるとこれがかなり便利。

スクリーンショット 2019-11-22 10.05.26.png

wardenの使い方↓

使い方 (mac向け)

まずはwardenのインストールと起動。

$brew install davidalger/warden/warden
$warden up

warden upコマンドで上記のメインとなる4コンテナが起動します。

$docker ps
CONTAINER ID        IMAGE                                   COMMAND                   CREATED             STATUS              PORTS                                                 NAMES
b4e8029d5655        jpillora/dnsmasq                        "webproc --config /e…"    23 hours ago        Up 23 hours         127.0.0.1:53->53/udp                                  dnsmasq
0030d07b863f        traefik:v1.7                            "/traefik --api --do…"    23 hours ago        Up 20 hours         127.0.0.1:80->80/tcp, 127.0.0.1:443->443/tcp          traefik
e671dabdd02e        portainer/portainer                     "/portainer"              23 hours ago        Up 23 hours         9000/tcp                                              portainer
ede5a56b6fef        panubo/sshd                             "/entry.sh /usr/sbin…"    23 hours ago        Up 23 hours         127.0.0.1:2222->22/tcp                                tunnel

正しく起動できていれば、下記URLでコンテナの稼働状況が確認できます。

Wardenの起動が完了したら、次はMagentoインスタンスを立ち上げていきます。

1.Magentoのソースコードが入ったディレクトリを作成

$composer create-project --repository-url=https://repo.magento.com/magento/project-community-edition magento2

2.環境設定の初期化: warden env-init [ProjectName] [EnvironmentType]
カレントディレクトリに、warden設定ファイルとなる.envが作成されます。

warden env-init project magento2

EnvironmentTypesは下記の3つがデフォルトで用意されています。(EnvironmentTypeは追加可能な様子)

  • local
  • Magento1
  • Magento2

3.SSL証明書の作成・設定: warden sign-certificate [ProjectName].test

warden sign-certificate project.test

4.Magentoインスタンスの起動

warden env up -d
warden sync start

5.コンテナが立ち上がったら、php-fpmコンテナに入ってMagentoのインストール (日本語用)

$warden shell (php-fpmコンテナに入る。⇩コンテナ内で実行)
$bin/magento setup:install \
    --backend-frontname=admin \
    --amqp-host=rabbitmq \
    --amqp-port=5672 \
    --amqp-user=guest \
    --amqp-password=guest \
    --db-host=db \
    --db-name=magento \
    --db-user=magento \
    --db-password=magento \
    --http-cache-hosts=varnish:80 \
    --session-save=redis \
    --session-save-redis-host=redis \
    --session-save-redis-port=6379 \
    --session-save-redis-db=2 \
    --session-save-redis-max-concurrency=20 \
    --cache-backend=redis \
    --cache-backend-redis-server=redis \
    --cache-backend-redis-db=0 \
    --cache-backend-redis-port=6379 \
    --page-cache=redis \
    --page-cache-redis-server=redis \
    --page-cache-redis-db=1 \
    --page-cache-redis-port=6379 \
    --es-hosts="elasticsearch" \
    --admin-firstname=admin \
    --admin-lastname=admin \
    --admin-user=admin \
    --admin-email=user@example.com \
    --admin-password=admin123 \
    --language=ja_JP \
    --currency=JPY \
    --timezone=Asia/Tokyo \
    --base-url=https://app.project.test/ \
    --use-rewrites=1 \
    --cleanup-database

6.各アプリケーションにアクセス

7.Magentoインスタンスの破棄

$warden env down -v #コンテナ・ボリューム・ネットワークの削除
$warden sync stop  #Mutagenセッションの終了

使用感

MailhogやX-Debug切り替えなど、細かい開発支援機能が散りばめられており、かなり便利な印象。

ファイル共有にMutagenを使用しており、Docker for MacでもVagrant使用時と変わらない速度感。

EnvironmentTypeを新たに追加することで、独自のMagentoインスタンス用のコンテナ群を構築することが可能です。

今回は触れませんでしたが、使用するPHPやVarnishのバージョンを指定することも出来るようです。

また、プロジェクト毎に使用したいコンテナを差し替えるといったことも出来るようになっているので、柔軟な開発環境が構築できそうです。

おまけ

MysqlWorkbenchの設定方法

MysqlWorkbenchの設定方法が少し分かりずらかったので、念のため共有させて頂きます。

mysql.png

SSH Hostname: tunnel.warden.test:2222
SSh Username: user
SSh Password: なし
SSH Key File: $HOME/.warden/tunnel/ssh_key
Mysql Hostname: project_db_1 (プロジェクトのdbコンテナ名)
Mysql ServerPort:3306
Username : magento
Password : magento

Livereloadの設定方法 (warden V2から利用可能)

1.env.phpに下記の内容を記載し、 bin/magento app:config:importを実行。

'system' => [
        'default' => [
            'design' => [
                'footer' => [
                    'absolute_footer' => '
                        <script id="__lr_script__">//<![CDATA[
                            document.write("<script src=\'/livereload.js?port=443\'/>");
                        //]]></script>
                    '
                ]
            ],
        ],
    ],

2.livereload.jsの埋め込みが確認できたら、下記のコマンドを実行。

warden shell
grunt clean
grunt exec:<theme_name>
grunt less:<theme_name>
grunt watch

便利コマンド

  1. show processlist watch -n 3 "warden db connect -A -e 'show processlist'"

各種コンテナのバージョン変更 (.env)

PHP_VERSION=7.1
MARIADB_VERSION=?
ELASTICSEARCH_VERSION=?
REDIS_VERSION=?
VARNISH_VERSION=?
RABBITMQ_VERSION=?
NODE_VERSION=?
5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3