初学者向け：Dockerfileの基本構造と主な命令を解説した、未来の自分への備忘録

## はじめに
Dockerfileとは、Dockerイメージを作成するためのテキストファイルで、コンテナを構築する際に必要となります。

:::note warn
***コンテナのベースとなるOSや必要なソフトウェア、設定を定義します。***
:::

本記事では、Dockerfileの基本構造や記述例を紹介し、未来の自分への備忘録としても活用できるように、初学者の方でも簡単に始められるよう解説します。

## Dockerfileとは？
Dockerfileは、テキストファイル形式で記述され、Dockerイメージを作成するためのビルド指示を定義します。

![スクリーンショット 2024-12-09 21.17.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/edde0cf0-384f-8126-2212-057f8c0bacd6.png)
引用画像：https://qiita.com/gon0821/items/f9e3bcbb6cb01d4ef7fa

**Dockerfileを基に```docker build```コマンドを実行すると、指定された内容に基づいてカスタマイズされたDockerイメージが生成されます。**

## Dockerfileの基本構造
Dockerfileの記述は基本的に上から順に実行されます。

```dockerfile
# ベースとなるイメージを指定
FROM python:3.9-slim

# 作業ディレクトリを設定
WORKDIR /app

# 必要なファイルをコンテナにコピー
COPY requirements.txt .

# 必要なパッケージをインストール
RUN pip install -r requirements.txt

# アプリケーションコードをコピー
COPY . .

# コンテナ内で実行するコマンドを指定
CMD ["python", "app.py"]
```

:::note info
***上記のファイルは、主要な命令を含む簡単なDockerfileの例です。***
:::

### 主な命令の解説
#### 1. FROM

```FROM```命令は、使用するベースとなるDockerイメージを指定します。

```dockerfile
FROM python:3.9-slim
```

このイメージはコンテナの初期状態となり、すべての操作はこのベースイメージに基づいて行われます。

***ここでは、Python 3.9の軽量イメージ（```python:3.9-slim```）を使用しています。***

:::note warn
これは最小限のPython環境を提供し、アプリケーションの依存関係を追加でインストールすることを前提としています。
:::

#### 2. WORKDIR

```WORKDIR```命令は、コンテナ内で作業を行うディレクトリを指定します。

```dockerfile
WORKDIR /app
```

このディレクトリ内でファイル操作やコマンドの実行が行われるようになります。

ここでは、作業ディレクトリを```/app```に設定しています。

:::note warn
***この後、```COPY```や```RUN```コマンドでファイルを```/app```ディレクトリ内に操作します。***
:::

#### 3. COPY

```COPY```命令は、ホストのファイルやディレクトリをコンテナ内にコピーするために使用されます。

```dockerfile
COPY requirements.txt .
```

ここでは、ホストの```requirements.txt```ファイルをコンテナ内の現在の作業ディレクトリ（```/app```）にコピーしています。

***これにより、依存関係を後でインストールするために必要なファイルがコンテナに配置されます。***

```dockerfile
COPY . .
```

こちらも```COPY```命令ですが、今回はカレントディレクトリ（```.```）にあるすべてのファイルとディレクトリをコンテナ内のカレントディレクトリ（```/app```）にコピーしています。

:::note warn
***これにより、アプリケーションのコード全体がコンテナに取り込まれます。***
:::

#### 4. RUN

```RUN```命令は、コンテナビルド時にコマンドを実行するための命令です。

```dockerfile
RUN pip install -r requirements.txt
```

このコマンドはビルド時に実行され、実行結果がイメージに反映されます。

ここでは、```pip install -r requirements.txt```というコマンドを実行しています。

:::note
***このコマンドは、```requirements.txt```にリストされているPythonパッケージをインストールします。これにより、アプリケーションの必要なライブラリがインストールされます。***
:::

#### 5. CMD

```CMD```命令は、コンテナが起動されたときに実行するコマンドを指定します。

```dockerfile
CMD ["python", "app.py"]
```

これはコンテナ起動時に実行され、通常はアプリケーションのエントリーポイントを設定します。

ここでは、```python app.py```というコマンドを指定しています。

:::note warn
***コンテナが起動すると、```app.py```というPythonスクリプトが実行され、アプリケーションが動作を開始します。***
:::

## まとめ

ここまでお読みいただき、ありがとうございました！***記念すべき150本目の記事に選ばれたテーマは「Dockerfile」でした（笑）！***

:::note
***今回は、基本的な構成を理解することで、アプリケーションのDockerfileの基本構造と主な命令についての知識を体系的に整理しました！***
:::

今後もDocker周りの知識整理を続けていきますので、この内容が誰かの技術的な支えとなれば幸いです。

## おまけ：Dockerを使ったReactアプリ開発

通っているITスクールの課題で、ReactとDockerを使って複数のアプリを作成した際の備忘録記事です。

:::note warn
**自分のローカル環境で「***クソゲー***」を量産してしまいましたが、個人的にはDockerやReactに関する知識が身につき、良い個人開発の経験となりました（笑）。**
:::

https://qiita.com/free-honda/items/19cd99989c3a0f73c187

https://qiita.com/free-honda/items/8ddf1d41250a10465ea9

https://qiita.com/free-honda/items/580d12f18ff10d015a0e

https://qiita.com/free-honda/items/51d0a4a3d7a49a162fea

https://qiita.com/free-honda/items/c933ad7be8d1fd67fb65

https://qiita.com/free-honda/items/6f8738ce4187e4cebb7b