/dwfs

Primary LanguageShellGNU General Public License v3.0GPL-3.0

概要

Dockerの練習としてdebianのイメージからWordPressを構築したのでその際に参考にしたリンクなどを備忘としてまとめておきます。

how to setup

# .envファイルを作成する。必要に応じて値を変える。
cp .env.example .env

# ディレクトリを作成
mkdir -p $HOME/data
mkdir -p $HOME/data/database
mkdir -p $HOME/data/website

# 証明証の作成
#openssl version
#> OpenSSL 3.0.5 5 Jul 2022 (Library: OpenSSL 3.0.5 5 Jul 2022)

openssl genpkey -algorithm RSA -out nginx/ssl/server.key
openssl req -x509 -key nginx/ssl/server.key -out nginx/ssl/server.cert -subj "/C=JA/ST=Tokyo/L=Minato/O=Hayapenguin/CN=local.hayapenguin.com"

# dnsの設定。直接/etc/hostsを書き換えてもよい。
grep -q local.hayapenguin.com /etc/hosts || sudo echo "127.0.0.1 local.hayapenguin.com" | sudo tee -a /etc/hosts
docker compose up

https://local.hayapenguin.com/にアクセスできる。 自己証明書の警告が出るので無視をする。Chromeなどではthis is unsafeとタイプすれば良い。

参考実装

主にmariadbとnginxの公式のDockerfileを参考にしました。 テンプレートのDockerfileがあり、バージョンごとに可変な部分をパラメータとして与えて自動生成しています。 見る場合はテンプレートの方ではなく、生成物の方が良いと思います。

# mariadb-dockerの構造。説明に必要ない部分は除外している
.
├── 10.9 -- 各バージョンごとのDockerfile
│   ├── Dockerfile
│   ├── docker-entrypoint.sh
│   └── healthcheck.sh
├── Dockerfile.template -- テンプレート
├── docker-entrypoint.sh -- テンプレート
├── generate-stackbrew-library.sh
├── healthcheck.sh -- テンプレート
└── update.sh -- 自動生成用スクリプト

Docker全般

Docker EngineのAPIドキュメントを見てどういったことができるのかを大まかに把握して、Dockerfile, compose-fileのドキュメントを見て実際にDockerfile, compose.yamlでどう書くかを調べる感じで進めました。 dockerに限らずクライアントとバックエンドに分かれているサービスでバックエンドのAPIが公開されている場合は、クライアントツール側のドキュメントを読むよりバックエンドAPIのドキュメントを読む方が目的に早く到達できる所感があります。

Dockerfileのベストプラクティス

Shell Form vs Exec Form

RUN, ENTRYPOINT, CMDでそれぞれShell FormまたはExec Formを使うべきかの参考にしました。

network

volume

localマウントする際のdriver_optsがドキュメントに特に記述もないけれど、みんながtype:none, o: bindを使っているのが不思議で調べました。 unixに詳しい人がハック的な感じで使った解決策が広く広まったみたいな感じに思えます。

volumes:
  website:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "${VOLUME_PATH}/website"

env

Dockerでは複数の場所、タイミングでenvを指定できるので、最終的にどのenv値が適用されているが分かりづらかったです。

nginx

nginxのディレクティブの設定はモジュールごとに分かれている記述されていますが、どのディレクティブがどのモジュールに属しているかが分かりにくいのでディレクティブ一覧ページから探すのが良いと思います。

FastCGI

FastCGIについては公式のサンプルだけで充分でした。 一応CGIプログラムがどのような値が渡ってくることを期待しているのかを把握するためにCGIのRFCも軽く目を通しました。

SSL/TLS

https://nginx.org/en/docs/http/configuring_https_servers.html 公式の記事。

SSL/TLSについても公式の記事だけで充分でした。 あまり証明証周りについても調べました。 証明証の作成にopensslを使ったのですが、今思うとMacOS標準で入っているLibreSSLでも良かったかもです。

mariadb

mariadbの公式ドキュメントはかなり分かりづらいので読むのを断念しました。 その他のネット検索で出てくる記事も有益なものが見つけれなかったので先述のmariadbのDockerライブラリの実装を参考にしました。 またaptでのインストール前後で行われている処理も確認しにいきました。mariadb-10.5レポジトリのdebian/mariadb-server-10.5.preinstdebian/mariadb-server-10.5.postinstあたりをみました。

WordPress

WordPressの構築はWP-CLIで行いました。公式ドキュメントがしっかり書かれているのでほかは特に参考にしませんでした。

php-fpm

一応リンクは貼っていますが、あまりドキュメントを参考にしませんでした。 aptでインストールしてくる際にあるwww.confにあるコメントを見ながら必要に応じて設定値を変えました。

bash

Dockerfileやdocker-entrypoint.shなどでシェルスクリプトを書く機会が多かったので参考にしました。

Makefile

元々は初期化処理をMakefileの中で書いていて.envを読み込みたかったので参考にしました。結局/etc/hostsを書き換えたりちゃんとわかっていないと危ない処理が結構多かったのでMakefileからは削除して手順をREADME.mdに移行するのにあたって不要になりました。