【初心者向け】Webアプリ開発におけるDockerの始め方からデプロイまで

# 【初心者向け】Webアプリ開発におけるDockerの始め方からデプロイまで

## 目的
この投稿では、**初心者の方がDockerを使ってWebアプリケーションを開発・テストし、AWSにデプロイする方法**について解説します。また、WindowsユーザーとMacユーザーが共同で開発しやすい環境構築を意識し、最終的にはクラウドへのデプロイ方法までを網羅します。Dockerに初めて触れる方にもわかりやすいよう、例え話を交えながら進めていきますので、ぜひ参考にしてみてください！
(初学者向けに正確さよりも分かりやすさを優先している部分もあるのでご理解の程よろしくお願いします。)

## 対象
- Dockerを使ったことがない初心者の方
- WindowsとMacユーザーが一緒に開発を進める方法を探している方

## この記事を読んでできること
- Dockerを使ってOSの違いに関係なく開発環境を統一する方法がわかる
- Webアプリを共同で開発し、クラウドにデプロイする方法がわかる
- AWSにDockerを使ってアプリを公開するまでの流れが理解できる

## 目次
1. Dockerとは？
2. 開発環境のセットアップ
3. Dockerでの開発準備
4. アプリの開発フロー（スプリント方式）
5. Dockerイメージをクラウドに保存
6. AWSへのデプロイ手順
7. 継続的なデプロイ
8. まとめ

---

## 1. Dockerとは？

まず、Dockerはアプリケーションとその動作に必要な環境を「コンテナ」という箱に詰めて管理するツールです。Dockerを使うと、アプリケーションの動作に必要なものをひとまとめにして、どこでも同じように実行できるようになります。これはまるで、舞台セットを移動式の箱に収めて、どこに行っても同じ舞台が再現できるようなものです。例えば、イベントやコンサートを行う時、場所が変わってもセットや道具を箱に入れて持って行けば、全国どこでも同じパフォーマンスが再現できますよね。Dockerも同じように、どこでも同じ環境を再現することができます。

MacやWindowsでもLinux環境が再現できる
Dockerのもうひとつの特徴は、WindowsやMacのような異なるOSでも、Linux環境を再現できる点です。Dockerのコンテナは内部的にLinuxカーネルを利用して動作するため、WindowsやMac上でもLinuxをベースとした環境を仮想的に作り出せるのです。Linuxカーネルとは、コンピュータの基本的な制御や管理をする中枢部分で、Linuxシステムの基盤といえます。多くのWebアプリはLinuxベースで動かされることが多いので、Dockerを使うことで、WindowsやMac上でLinuxと同じ環境を手軽に作り出せます。

こうしたDockerの特性により、異なるOS環境やAWSのようなクラウド環境でも同じようにアプリケーションを動かせます。

---
### 2. 開発環境のセットアップ

#### **1. PythonとDockerのインストール**
まず、WindowsやMacでPythonとDockerをインストールします。これにより、OSに依存せずにアプリケーション開発ができ、どの環境でも共通した設定で作業できます。

- **Pythonのインストール**  
  Python公式サイト（https://www.python.org/downloads/ ）からPythonをインストールします。
  
  - **役割**：Pythonはアプリケーションの開発に使う主要な言語です。
  - **目的**：Flaskアプリケーションの開発や依存ライブラリの管理を行うためにPythonが必要です。

- **Dockerのインストール**  
  Docker公式サイト（https://www.docker.com/products/docker-desktop/ ）からDocker Desktopをインストールします。WindowsやMacでインストールすると、Linuxベースの仮想環境も用意され、Dockerでコンテナを起動できるようになります。

  - **役割**：Dockerは、アプリケーションの実行環境を同じ条件で提供し、異なるOS間でも同じように動かせるコンテナ環境を作成します。
  - **目的**：チーム全員が同じ設定で開発できるようにし、環境間の違いによるエラーを防ぐことができます。

#### **2. Gitリポジトリの作成**
GitHubにリポジトリを作成し、コードをチームで共有するための準備をします。

- **リポジトリ作成の手順**：
  - GitHubで新しいリポジトリを作成し、リポジトリのURLをコピーします。
  - ターミナル（またはコマンドプロンプト）で次のコマンドを実行してリポジトリをクローンします。
  
  ```bash
  git clone [リポジトリURL]
  cd [リポジトリ名]
  ```

  - **役割**：GitHubリポジトリは、複数の開発者がコードの変更を記録し、共有できる場所です。
  - **目的**：各メンバーがリポジトリにアクセスし、コードのバージョン管理と共有ができるようにします。
  - **便利な点**：すべてのメンバーが同じコードを使えるため、プロジェクトの進行がスムーズになります。

---

### 3. Dockerでの開発準備

Dockerを使って開発を進めるため、Dockerfileを使って環境を定義し、イメージを作成します。これによって、どの環境でも同じ設定でアプリケーションが動くようになります。

#### Dockerfileの作成

ここではFlaskを使って「Hello, World!」を表示する簡単なアプリを作成し、その環境をDockerで構築します。

1. **プロジェクトディレクトリを作成**  
   任意の場所にプロジェクトディレクトリを作成し、移動します。

   ```bash
   mkdir flask_docker_project
   cd flask_docker_project
   ```

2. **Flaskアプリケーションファイルの作成**  
   プロジェクトディレクトリ内に`app.py`というファイルを作成し、以下の内容を書き込みます。

   ```python
   # app.py
   from flask import Flask

   app = Flask(__name__)

   @app.route('/')
   def hello():
       return "Hello, World!"

   if __name__ == '__main__':
       app.run(host='0.0.0.0', port=5000)
   ```

   - **役割**：Flaskアプリケーションのエントリーポイントです。ルートURLにアクセスした際に「Hello, World!」と表示します。
   - **目的**：このコードで、Flaskの基本的な動作をDocker環境で確認できるようにします。

3. **requirements.txtの作成**  
   Flaskをインストールするための依存ファイル`requirements.txt`を作成し、以下の内容を記述します。

   ```txt
   Flask==2.0.3
   ```

   - **役割**：Flaskアプリケーションに必要なライブラリを定義するファイルです。
   - **目的**：Dockerfileでこのファイルを指定することで、自動的に必要なライブラリをインストールできます。

4. **Dockerfileの作成**  
   プロジェクトディレクトリに`Dockerfile`を作成し、以下の内容を記述します。

   ```Dockerfile
   # ベースイメージとしてPythonを使用
   FROM python:3.8-slim

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

   # 必要なファイルをコピー
   COPY . /app

   # パッケージのインストール
   RUN pip install -r requirements.txt

   # コンテナ起動時のデフォルトコマンド
   CMD ["python", "app.py"]
   ```

   - **役割**：Dockerfileは、アプリの実行に必要な設定とインストールを自動で行うためのファイルです。
   - **目的**：このファイルを使って、Flaskアプリの動作に必要なライブラリや環境設定をコンテナに適用します。

5. **Dockerイメージのビルド**  
   Dockerfileが準備できたら、以下のコマンドでイメージをビルドします。

   ```bash
   docker build -t flask_hello_app .
   ```

   - **役割**：このコマンドでDockerfileに基づいた環境を作成し、`flask_hello_app`という名前のイメージを作成します。
   - **目的**：Dockerイメージを作成することで、Flaskアプリケーションを起動するための環境が準備できます。

6. **コンテナの起動と確認**  
   ビルドしたイメージを使って、以下のコマンドでコンテナを起動します。

   ```bash
   docker run -d -p 5000:5000 flask_hello_app
   ```

   - **役割**：`docker run`コマンドで、作成したイメージからコンテナを起動します。
   - **目的**：コンテナが正しく起動すると、ローカルのポート5000でアプリケーションにアクセスできるようになります。

7. **動作確認**  
   ブラウザで「http://localhost:5000」にアクセスし、「Hello, World!」と表示されることを確認します。

   - **役割**：この動作確認によって、Dockerで作成したFlaskアプリケーションが正常に動作していることがわかります。
   - **目的**：ローカル環境で正しく動作するか確認した上で、次のステップであるクラウドへのデプロイに進みます。

---
### 4.Windowsへ同様の開発環境を共有して、開発を行ってもらう方法

WindowsとMacのメンバーが同じDocker環境で開発を進めるため、GitHubとDocker Hubを利用して環境を共有します。以下はその手順です。

#### 1. GitHubを使ったコード共有

プロジェクトファイルをGitHubリポジトリにアップロードし、各メンバーがリポジトリをクローンして使用します。

1. **リポジトリのクローン**
   - WindowsユーザーはGitHubリポジトリからプロジェクトをクローンします。コマンドプロンプトやターミナルで以下のコマンドを実行します。

   ```bash
   git clone [リポジトリURL]
   cd flask_docker_project
   ```

2. **プロジェクトファイルの確認**
   - `app.py`、`requirements.txt`、`Dockerfile`などのファイルがリポジトリ内にあることを確認します。

#### 2. Docker Hubを使った共通イメージの共有

ローカルで動作確認ができたDockerイメージをDocker Hubにアップロードし、チームメンバー全員が同じイメージを使って開発を進められるようにします。

1. **Docker Hubからイメージをプル**
   - Windowsユーザーは、以下のコマンドでDocker Hubからイメージを取得します。

   ```bash
   docker pull [Docker Hubのユーザー名]/flask_hello_app:latest
   ```

2. **Dockerコンテナの起動**
   - イメージが取得できたら、以下のコマンドでコンテナを起動し、Flaskアプリケーションを確認します。

   ```bash
   docker run -d -p 5000:5000 [Docker Hubのユーザー名]/flask_hello_app:latest
   ```

3. **動作確認**
   - Windowsのブラウザで「http://localhost:5000」にアクセスし、「Hello, World!」が表示されればセットアップ完了です。

#### 3. GitHubを通じたコードの更新と同期

チームメンバー間で最新のコードを共有し、更新する方法を紹介します。

- **変更のプッシュ**
  - 開発メンバーがコードを変更したら、以下のコマンドでGitHubに変更をプッシュします。

  ```bash
  git add .
  git commit -m "変更内容の説明"
  git push origin main
  ```

- **リポジトリから最新コードを取得**
  - 他のメンバーは、以下のコマンドでリポジトリの最新コードを取得し、環境を同期します。

  ```bash
  git pull origin main
  ```

これで、WindowsユーザーもDocker HubとGitHubを活用し、同じ開発環境でプロジェクトに参加できるようになります。

---

### 5. Dockerイメージをクラウドに保存

ローカルでビルドしたDockerイメージをDocker HubやAmazon ECRに保存して、チームメンバーや本番環境でも使用できるようにします。

#### Docker Hubへのプッシュ手順

1. **Docker Hubにログイン**
   ```bash
   docker login
   ```
   - **役割**：Docker Hubは、イメージを保存・共有するリモートのストレージです。
   - **目的**：Docker Hubにログインすることで、イメージをリモートにアップロードできます。
  
2. **イメージにタグを付ける**
   ```bash
   docker tag my_app_image [ユーザー名]/my_app_image:latest
   ```
   - **役割**：タグを付けることで、Docker Hub上でのイメージ名を指定できます。
   - **目的**：イメージを他のユーザーや本番環境で利用しやすくします。

3. **イメージをDocker Hubにプッシュ**
   ```bash
   docker push [ユーザー名]/my_app_image:latest
   ```
   - **役割**：プッシュすることで、ローカルのイメージがDocker Hubに保存され、他の環境からもアクセスできるようになります。
   - **目的**：リモートでイメージを共有し、チームでの一貫した環境が可能になります。

---

### 6. AWSへのデプロイ手順

AWSのEC2インスタンスにイメージをデプロイする手順を確認します。

#### EC2インスタンスの準備とDockerのインストール
AWSコンソールでEC2インスタンスを立ち上げ、SSHで接続し、Dockerをインストールします。

```bash
# パッケージの更新
sudo yum update -y

# Dockerのインストール
sudo amazon-linux-extras install docker

# Dockerの起動
sudo service docker start

# Dockerコマンドを実行できるようにユーザーを追加
sudo usermod -aG docker ec2-user
```

- **役割**：これらのコマンドでEC2上にDockerをインストールし、コンテナを起動できる環境を整えます。
- **目的**：AWS上でも同じDockerイメージを使って、アプリケーションを稼働させる準備をします。

---

### 7. 継続的なデプロイ

アプリの更新や修正を繰り返しデプロイする方法を紹介します。

1. **ローカルでの修正・テスト**
   アプリに変更を加えた後、ローカルでテストを行います。

2. **Dockerイメージの再ビルドとDocker Hubへのプッシュ**
   修正したコードを含む新しいイメージをビルドし、Docker Hubに再度プッシュします。
   
   ```bash
   docker build -t my_app_image .
   docker push [ユーザー名]/my_app_image:latest
   ```

3. **AWSでのイメージ更新と再起動**
   AWS EC2インスタンスでイメージを再プルし、コンテナを再起動します。

   ```bash
   docker pull [ユーザー名]/my_app_image:latest
   docker-compose down
   docker-compose up -d
   ```

- **役割**：この流れにより、変更内容を素早く本番環境に反映できます。
- **目的**：継続的に改善・修正が反映されるので、開発スピードが上がります。

---

## 8. まとめ

Dockerを使うと、チーム全員が同じ環境で開発でき、AWSで本番と同じように動かせるようになります。また、アジャイル方式の開発により、早期リリースが可能になります。DockerとAWSを組み合わせることで、初心者でも開発からデプロイまでをスムーズに行えるようになります。