DockerでPHPの環境を構築してみた(MacOS)

# はじめに
ども初めまして。リンクラフト株式会社のkitagawaと申します。
アドベントカレンダー20日目の記事を担当させていただきます。
現在関わっているプロジェクトで仮想環境を学ぶ機会があり、Dockerのことを思い出したかのように触ってみようと、この記事を書くことにしました。
今回はPHPの環境を構築したいと思います。(現在のプロジェクトで使用しているので)
基礎中の基礎にはなりますが、初めて触れる方のお役に立てればと思います。
間違っている箇所があるかもしれませんが、その際はご指摘いただけると幸いです。

# 今回のゴール
http://localhost:8888/ でindex.phpの情報が表示されることを目標とします。
※使用環境はMacOSです

# 簡単な流れ
1. Dockerをインストールする
2. Docker Composeに関するファイルの準備
3. アプリケーションを実行する
4. ブラウザ上で実行中のPHPの情報を表示されるか確認(これが出ればPHPがインストールできているということ)

# Dockerとは？
仮想化技術を利用してアプリケーションをコンテナと呼ばれる軽量な単位で実行するツールです。
これにより、異なる環境でもアプリケーションの動作を一貫させることができます。
「コンピューターの中にある「アプリケーションを入れる箱」みたいなもの。
Dockerはアプリケーションを入れる箱で、アプリケーションを入れることで、コンピューターの中でそのアプリケーションを動かすことができます。

# Dockerと仮想環境の違い

### Docker

- **コンテナ仮想化**： Dockerは、アプリケーションを実行するための軽量なコンテナを作成します。ホストOSのカーネルを共有し、その上で各コンテナが必要なライブラリやファイルを持ちます。
- **軽量で高速**： コンテナは仮想マシンよりもはるかに軽量であり、OSレベルの仮想化を行うため、テキストファイルなのでリソースの消費が少なく、起動や終了が迅速です。
- **ポータビリティと柔軟性**： Dockerコンテナはアプリケーションとその依存関係を含みますが、ホストOSのカーネルを共有するため、異なる環境での移行やデプロイが簡単に行えます。
- **インフラのコード化**： docker-compose.ymlファイルを読むと構成がわかる。誰でも同じコンテナを構築できる。受け渡しが簡単。

### 仮想環境
- **ハードウェア仮想化**： 仮想マシンは、ホストOS上で仮想的なハードウェアをエミュレートし、その上でゲストOSを実行します。この際、ハイパーバイザー（仮想化ソフトウェア）がハードウェア資源を仮想的に割り当てます。
- **重いリソース使用**： 各仮想マシンは完全なOSを含み、そのためメモリやディスク領域を大量に消費します。起動や終了にも時間がかかります。
- **ポータビリティ**： 仮想マシンは比較的高いポータビリティを持ちますが、OSのカーネルも含まれるため、異なる環境での移行やデプロイには手間がかかることがあります。
- **インフラのコード化**： 実現自体は可能だが様々なツールを入れないといけないため複雑。

# 知っておきたい用語
- Dockerfileとは
Dockerイメージを構築するためのテキストファイルです。これはコンテナ内の環境設定やアプリケーションの構成を定義するものであり、まさにDockerイメージを「コード化」したものと言えます。
Dockerfileには、イメージのベースとなるイメージ、ファイルのコピー、パッケージのインストール、ポートの公開、実行時のコマンドなどの命令が記述されます。これらの命令は、Dockerイメージを構築する際に順番に実行され、最終的にイメージが作成されます。
また、Dockerfileを使ってイメージをビルドすることで、全ての人が同じ環境を持つことができます。
<br>

- Dockerイメージとは
アプリケーションや環境、依存関係、ライブラリ、設定などが含まれたパッケージのようなものです。このイメージは、Dockerfileに定義された手順に基づいてビルドされ、Dockerコンテナを起動する際に使用されます。
Dockerコンテナを構築するための「テンプレート」のようなイメージ。
<br>

- Dockerhubとは
様々なイメージが置いてあるところです。
今回は使用していないが引っ張ってくるだけで環境が作れる便利なものです。
https://www.docker.com/products/docker-hub/
<br>

- Docker Composeとは
複数のコンテナを効率的に操作するためのツールです。
Docker Composeを使う場合、「docker-compose.yaml」という名前のファイルに、各コンテナに対する設定をあらかじめ定義しておきます。
その上で専用コマンドを実行することにより、定義した内容に従い複数コンテナを一括で同時に起動させることができます。
docker-compose.ymlを見るとインフラ構成が大体わかる。

# Dockerのインストール
ではここからいよいよスタートです。
まずは、Dockerをインストールします。
今回はMacOSでのやり方を記載しています。

1. [Docker公式サイト](https://www.docker.com/get-started)からDocker Desktopをダウンロードしてインストールします。
2. インストールが完了したら、Docker Desktopを起動します。

# Dockerで実際にPHPの環境を構築してみる
- プロジェクトディレクトリを作成する
(今回はファイル作成をコマンドでやっておりますが、エディター内で作成してもOKです)
```bash
mkdir php-docker
cd php-docker
```
<br>

- docker-compose.yml ファイルを作成する
```bash
touch docker-compose.yml
```
<br>

- docker-compose.yml ファイルを編集する
```bash
vi docker-compose.yml
```
<br>

- docker-compose.yml ファイルの内容
```yaml
version: '3.8'

services:
  php:
    image: php:8.2-apache
    ports:
      - "8888:80"
    volumes:
      - ./src:/var/www/html
```
<br>

- 編集後に保存して終了
etc → :wq
<br>

- php-docker配下にsrcディレクトリを作成する
```bash
mkdir src
cd src
```
<br>

- index.php ファイルを作成する
```bash
touch index.php
```
<br>

- Dockerコンテナを起動する
```bash
docker-compose up -d
```
<br>

- http://localhost:8888/ へアクセスしてPHPの情報が表示されるか確認


# 最後に
今回はPHPのみに焦点を当てましたがここからDB追加したりとかもできるみたいなので、Dockerって便利だなと感じました！
**「千里の道も一歩から」**
ということで、今後は活用していけるようにさらに深くまで学んでいこうと思います。
							
# 一緒に働く仲間を募集中です！
リンクラフト株式会社では、組織拡大に伴い積極的な採用活動を行っています。
少しでも興味がある方はぜひご連絡ください。

▽会社ホームページ
https://lincraft.co.jp/
▽Instagram
https://www.instagram.com/lincraft.inc/
▽ご応募はこちらより
https://lincraft.co.jp/recruit

※カジュアル面談も受付中です。ご希望の方はHPのお問い合わせフォームよりご連絡ください。