Dockerを用いたWordPress環境構築 | 42Tokyo Inception

# はじめに
42TokyoのLevel5の課題、Inceptionという課題についての記事です。
この課題では、Dockerを用いてWordPressのサイトを立ち上げます。

後半の課題になると記事を書いている人が少なくなってくるので、初めて記事を書いてみることにしました。
何から初めたら良いか分からないという方を対象にしています。
技術的な説明はほぼないですが、在校生やDocker初心者の方への道標になればと思います。



42Tokyoについて

https://42tokyo.jp/


# 課題に取り組む流れ
[1. 課題要件の確認、Dockerについて勉強 ](#1-課題要件の確認dockerについて勉強 )
[2. Dockerfileの記述](#2--dockerfileの記述)
[3. mariadb,nginx,WordPressの仕様について調査](#3-mariadbnginxwordpressの仕様について調査)
[4.  docker-compose.yml, Makefileの記述](#4-docker-composeyml-makefileの記述)
[5. まとめ](#5-まとめ)


### 1. 課題要件の確認、Dockerについて勉強
まずはじめに課題要件を確認すると思いますが、最初は何言ってるか分からなくて大丈夫です。
Dockerを使って、サイトを立ち上げる課題ということが分かったらDockerの勉強を初めましょう。

この2つが圧倒的おすすめです！！

- 「[仕組みと使い方がわかる Docker＆Kubernetesのきほんのきほん](https://www.amazon.co.jp/%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%A8%E4%BD%BF%E3%81%84%E6%96%B9%E3%81%8C%E3%82%8F%E3%81%8B%E3%82%8B-Docker%EF%BC%86Kubernetes%E3%81%AE%E3%81%8D%E3%81%BB%E3%82%93%E3%81%AE%E3%81%8D%E3%81%BB%E3%82%93-Compass-Books%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E5%B0%8F%E7%AC%A0%E5%8E%9F-ebook/dp/B08T961HKP/ref=sr_1_5?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2213R1NH784B7&keywords=docker&qid=1701082655&sprefix=docke%2Caps%2C166&sr=8-5)」
> イラストが豊富で初心者に優しい。何も分からなくてもとりあえずのイメージが掴めます 

- 　「[実践 Docker - ソフトウェアエンジニアの「Docker よくわからない」を終わりにする本](https://zenn.dev/suzuki_hoge/books/2022-03-docker-practice-8ae36c33424b59)」

https://zenn.dev/suzuki_hoge/books/2022-03-docker-practice-8ae36c33424b59
> 図が豊富かつ、基礎からしっかりと解説しているのでおすすめです。しかも無料！！

私はどちらも手を動かさずに読むだけで勉強しましたが、一度もdockerを触れたことがないという方はハンズオン形式なので手を動かしてみると良いと思います！


#### 作業環境について
個人PCで最後まで完成させてからVMで最終調整すると良いと思います。
私は42VMを使用しましたが、設定が面倒くさかったです。

### 2.  Dockerfileの記述
ここから実際に設定を行っていきます。

Alpine/Debian以外のimageを使用することは禁止されているため、Alpine/Debianを入れたcontainerの中にmariadb, nginx, WordPressの環境を作成する感覚です。

まず、ベースイメージとなるAlpine/Debianを入れます。
詳細な設定はともかく、mariadbをinstallして実行する記述だけ書けたら、`docker image build`を使用してimageを作成し、`docker container run`を使用してmariadbコンテナが作られているか確認してみましょう。

mariadbの設定が出来たら何となくやり方が分かってくるので、そこからは順番に作っていきます。
私はmariadb→nginx→wordpressの順番で作成しました。

コンテナごとに、docker-compose.ymlやMakefileも少しずつ書き足していきましょう。

#### Dockerfile
Dockerfileの記述に当たって気を付けたほうが良い点が何点かあるので、以下のような記事の内容について調べてみると良いと思います。

- [Dockerfile を書くベストプラクティス　(公式マニュアルの翻訳)](https://docs.docker.jp/develop/develop-images/dockerfile_best-practices.html)
- [DockerfileでのENTRYPOINTとCMDの関係を整理する](https://tech.enechange.co.jp/entry/2022/10/25/100000)

### 3. mariadb,nginx,WordPressの仕様について調査

Dockerfileを記述していくにあたって、初めはDockerの勉強をすれば良いのかと思いますがそうではありません。
Dockerfileにはこれらのサービスの設定を書き込むので、コマンドや使用するサービスについて調べる必要があります。

これを調べるのが、非常に楽しくないです。。
最初はqiitaなどのまとめ記事がわかりやすいですが、結局公式ドキュメントを見てました。
以下参考になったサイトです。ここでは解説はしませんが、これらのサイトに出てくる単語などを調べると課題が進むと思います。

#### mariadb
- [MySQL reference manual](https://dev.mysql.com/doc/refman/8.0/ja/)
- [MySQLでのユーザー作成からデータ挿入まで (SHIFT Group 技術ブログ)](https://note.com/shift_tech/n/nf7d2f4591eaf)
- [よく使うMariaDB か MySQLのSQLコマンドメモ](https://qiita.com/pugiemonn/items/247dccb6dc56e373ba92)
- /etc/mysql/ 内のconfigファイルを参考にする

#### wordpress
- [WordPress install](https://wordpress.org/download/)
- [WordPress PHP環境](https://wordpress.com/ja/support/php-environment/)
- [WP-CLI](https://wp-cli.org/ja/)
- [php-fpm](https://www.php.net/manual/ja/install.fpm.configuration.php)
- [nginxとphp-fpmの通信設定について(qiita)](https://qiita.com/kouki_o9/items/113002580945e94b1456)
- [nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築する(qiita)](https://qiita.com/kotarella1110/items/634f6fafeb33ae0f51dc)
- [php-fpm の設定を理解してサイトのパフォーマンスを向上させる](https://hackers-high.com/linux/php-fpm-config/)
- [ネコでもわかる！さくらのVPS講座 ～第八回「WordPressサイトを公開しよう」(さくらインターネット)](https://knowledge.sakura.ad.jp/11101/)
- /etc/php/x.x/ 内のconfファイルを参考にする


#### nginx
- [NGINX 公式 Full Example Configuration](https://www.nginx.com/resources/wiki/start/topics/examples/full/)
- [NGINX 公式 FastCGI Example](https://www.nginx.com/resources/wiki/start/topics/examples/fastcgiexample/)
- [Nginx 入門](http://www2.matsue-ct.ac.jp/home/kanayama/text/nginx/all.html)
- [NGINXでのSSL(HTTPS)設定について](https://cn.teldevice.co.jp/blog/p39750/)
- [nginx連載4回目: nginxの設定、その2 - バーチャルサーバの設定（第3回、第5回も参考）](https://heartbeats.jp/hbblog/2012/04/nginx04.html)
- [Docker nginxのコンテナすぐに終了してしまう現象](https://yinm.hatenadiary.jp/entry/2017/05/04/220439)
- [nginx で オレオレ証明書をする(qiita)](https://qiita.com/snowmoon/items/9c96ee0fa6ed096e8940)
- [cURL, OpenSSLコマンドでTLSのバージョンを指定する方法(qiita)](https://qiita.com/Esfahan/items/53399964cb76cdb87e60)
- [Linuxのファイル操作に慣れよう　ファイルやディレクトリのオーナー・グループを設定しよう (CTC)](https://www.school.ctc-g.co.jp/columns/hamada3/hamada313.html)
- /etc/nginx/sites-available内のdefaultファイルを参考にする


#### bonus / adminer
- [php マニュアル](https://www.php.net/manual/ja/features.commandline.options.php)
- [adminer.org](https://www.adminer.org/)



### 4. docker-compose.yml, Makefileの記述
今回の課題ではdocker-composeやその他の起動、削除など実行に関わるコマンドはMakefileにまとめて記述を行います。
4ステップ目になっていますが、こちらは適宜付け足していくのがおすすめです。


docker-compseについてはたくさん記事があるので特に心配はありません。
何回も長いdockerコマンドを打つのは大変なので、Makefileを駆使して、作業を効率化することがポイントです。
- [Compose ファイル構築リファレンス](https://docs.docker.jp/compose/compose-file/build.html)
- [docker-compose.ymlのbuild設定はとりあえずcontextもdockerfileも埋めとけって話(qiita)](https://qiita.com/sam8helloworld/items/e7fffa9afc82aea68a7a)
- [docker-compose, docker compose](https://www.konosumi.net/entry/2023/02/26/142508)



### 5. まとめ
最後にもう一度課題要件を確認しましょう。何か見落としていることが必ずあります。
またレビューに向けて、今まで勉強したことを整理をしておくと良いと思います。

# Tips
- build が出来ないとき →　ターミナルのログをみる
- upした後 →　`docker 〇〇 ls`系のコマンドで状況を確認する
- build, upでエラーが出ていないがうまく行かない →　`docker logs コンテナ名`
- `docker logs`でエラーを見つけた場合　→　container内を`docker exec コンテナ名 -it /bin/bash`で確認
- COPY, No such a file~系のエラー → パス間違い、ディレクトリが存在しないことが大抵
- ps, lsなど確認するコマンドは頻繁に使用するので、makeルールを作る
- ENTRYPOINT, CMDの書き方に注意
- /etc/hosts
- PID=1問題
- レビュー時に必要な作業や、くり返し使用する作業などmakeルールを作って効率化する
- 42VMはnginxが初期設定で動いているためkillすること
- 42VMはlogin名でuserを作成し、sudo権限を与えておく
- [ubuntu docker install](https://docs.docker.com/engine/install/ubuntu/)


# 最後に
インターンや大学で使用していたDockerがどのように機能しているかが分かりとても勉強になりましたが、調べるのがただ大変な部分もあった課題でした。。
初めて記事を書きましたが、アウトプットすることも大事だなと思いました。
最後まで読んでいただきありがとうございました！


# 作ったもの
本リポジトリの制作物の安全性や課題としての完成度は保証できないのでご了承ください。

https://github.com/ryhara/Inception


# その他参考にしたサイト・書籍
https://amzn.asia/d/7l6Dfyb

https://zenn.dev/suzuki_hoge/books/2022-03-docker-practice-8ae36c33424b59

https://hub.docker.com/search?q=&type=image&image_filter=official

https://matsuand.github.io/docs.docker.jp.onthefly/

https://docs.docker.jp/index.html

私が調べた中では、唯一、42Tokyo内でInceptionについて書かれていたnoteです。大変お世話になりました。

https://note.com/syamashi/n/ndb5655f55ef8

完成後に見つけたのですが、こちらのサイトも詳しく書かれています

https://tuto.grademe.fr/inception/