Dockerって何からスタート！(自分なりのアウトプット)

#Dockerって何??
開発者やシステム管理者が、コンテナでアプリケーションを **構築（build）、実行（run）、共有（share）**するためのプラットフォームのことを指します。
###イメージとコンテナについて
コンテナとは、ホストマシン(例: 自分のpc)の上に仮想的に利用する箱みたいなもの。ホストマシンとは別の世界を作る感じ。
イメージとは、コンテナの実行に必要な概念としてのパッケージ（ファイルやメタ情報の集合体）である。
[参考サイトイメージとコンテナの違いについて](https://blog.codecamp.jp/programming-docker-image-container)
文字より下記の写真の内容のほうがわかるかもです!!
![Dockerの内容.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670418/0a581c26-9b23-b9d6-3d59-b833e1c567ea.png)


#実際のコードを利用して
今回はPHPのDockerファイルとdocker-compose.ymlの情報を解説していきます！
その前にDockerfileとdocker-compose.ymlの違いについて
・Dockerfileには個々のコンテナを構築するために必要な細かい手順（どんなツールをインストールするかなど）を記載する場所
・docker-compose.yamlには個々のコンテナの起動定義（どんな感じで起動していくか）を記載する場所
・要は、Dockerfileは個々のコンテナに関する説明書、docker-compose.ymlはコンテナ全体に関する説明書
コマンド操作については、他の方の投稿内容を参考サイトとして使用します。
[Dockerコマンド一覧](https://qiita.com/nimusukeroku/items/72bc48a8569a954c7aa2)

##Dockerfileの記述

```Dockerfile:info/php/Dockerfile
FROM php:8.0-fpm-buster
#この記述でphp8.0のベースイメージを指定して利用しますよといった命令文
LABEL maintainer="ucan-lab <yes@u-can.pro>"
#LABEL命令はイメージに対してメタデータを追加します。
SHELL ["/bin/bash", "-oeux", "pipefail", "-c"]
#シェル形式のコマンドに使用

# timezone environment
ENV TZ=UTC \
  # locale
  LANG=en_US.UTF-8 \
  LANGUAGE=en_US:en \
  LC_ALL=en_US.UTF-8 \
  # composer environment
  COMPOSER_ALLOW_SUPERUSER=1 \
  COMPOSER_HOME=/composer
#ENV命令は環境変数を設定します。

COPY --from=composer:2.0 /usr/bin/composer /usr/bin/composer
#新しいファイルまたはディレクトリをコンテナのパスにコピーします。--from オプションを付けると別のイメージのファイルを指定できます。(マルチステージビルド)composer のインストールがとてもシンプルになっています。

RUN apt-get update && \
  apt-get -y install git libicu-dev libonig-dev libzip-dev unzip locales libfreetype6-dev libjpeg62-turbo-dev libpng-dev && \
  apt-get clean && \
  rm -rf /var/lib/apt/lists/* && \
  locale-gen en_US.UTF-8 && \
  localedef -f UTF-8 -i en_US en_US.UTF-8 && \
  mkdir /var/run/php-fpm && \
  docker-php-ext-install intl pdo_mysql zip bcmath && \
  docker-php-ext-configure gd --with-freetype --with-jpeg &&\
  composer config -g process-timeout 3600 && \
  composer config -g repos.packagist composer https://packagist.org && \
  docker-php-ext-install -j$(nproc) gd exif
#RUN命令は現在のイメージの上に任意のコマンドを実行した結果をコミットします。Laravelに必要なライブラリー等のインストールを行っています。


COPY ./infra/php/php-fpm.d/zzz-www.conf /usr/local/etc/php-fpm.d/zzz-www.conf
COPY ./infra/php/php.ini /usr/local/etc/php/php.ini
#ホスト側に置いているPHPの設定ファイルのコピーをしているだけです。

WORKDIR /work/laravel
#WORKDIR命令はワークディレクトリを設定します。
```


##docker-compose.ymlの記述

app, web, db の3つのコンテナを定義しています。

```docker-compose.yml
version: "3.3"
#docker-composeのバージョン
volumes:
  php-fpm-socket:
  db-store:
#名前付きボリューム(ボリュームとは、データを永続化できる場所のことである。外部HDDのようなイメージ。)をマウント(利用できる状態にすること)しています。
#unixソケット(php-fpm-socket)のボリュームは app コンテナと web コンテナで共用したいのでマウントしてます。
#unixソケットとは、まず、ソケットの意味「受け口、接合部」の意味。「UNIXドメインソケット」とは、LinuxなどのUNIX系OS（オペレーティングシステム）で実行されるプロセス間のデータ通信の終点に使われるインターフェースのことをいう。
#データベース(db-store)のデータはコンテナを破棄しても残しておきたいのでボリュームとして定義しています。
services:
  app:
    build:
      context: .
      dockerfile: ./infra/php/Dockerfile
    volumes:
      - php-fpm-socket:/var/run/php-fpm
      - ./laravel:/work/laravel
    environment:
      - DB_CONNECTION=mysql
      - DB_HOST=db
      - DB_PORT=3306
      - DB_DATABASE=${DB_NAME:-laravel_local}
      - DB_USERNAME=${DB_USER:-phper}
      - DB_PASSWORD=${DB_PASS:-secret}
#app(アプリケーションサーバ)コンテナの定義です。PHPを実行します。
#build で ./infra/php/Dockerfile を指しています。
#volumes で名前付きボリュームとホストパスをコンテナにマウントしてます。
#../Laravel:/work/backendはLaravelのソースコードをマウントしてます。
#environmentで環境変数を定義している。 

  web:
    build:
      context: .
      dockerfile: ./infra/nginx/Dockerfile
    ports:
      - ${WEB_PORT:-80}:80
    volumes:
      - php-fpm-socket:/var/run/php-fpm
      - ./laravel:/work/laravel
#web(ウェブサーバ)コンテナの定義です。PHP以外の静的コンテンツを返却します。
#ports ポートを公開します。(HOST:CONTAINER)
#volumes で名前付きボリュームとホストパスをコンテナにマウントしてます。
#nginxのデフォルトのポート番号は 80 番です。

  db:
    build:
      context: .
      dockerfile: ./infra/mysql/Dockerfile
    ports:
      - ${DB_PORT:-3306}:3306
    volumes:
      - db-store:/var/lib/mysql
    environment:
      - MYSQL_DATABASE=${DB_NAME:-laravel_local}
      - MYSQL_USER=${DB_USER:-phper}
      - MYSQL_PASSWORD=${DB_PASS:-secret}
      - MYSQL_ROOT_PASSWORD=${DB_PASS:-secret}
#db(データベース)コンテナの定義です。
#build で ./infra/mysql/Dockerfile を指しています
#ports ポートを公開します。
#volumes で名前付きボリュームとホストパスをコンテナにマウントしてます。
#MySQLのデフォルトのポート番号は 3306 番です。
#environmentで環境変数を定義している。 
```

#参考にしたサイト
[この方](https://qiita.com/ucan-lab/items/5fc1281cd8076c8ac9f4#docker-composeyml)の内容で解説していただいており、そちらを主に参考に使用しました。
ほとんど、この方の情報を基に書いたので感謝しかないですが、これを自分のものにしていきたいです。