金欠高校生はdockerを使ってみたい！

# Dockerとは

Dockerは、コンテナ仮想化技術を使ってアプリケーションをパッケージ化し、簡単に配布・移動・実行できるようにするプラットフォームです。
コンテナはアプリケーションとその依存関係をカプセル化し、異なる環境でも一貫性のある動作を可能にします。
dockerの基本的な使い方について個人的にまとめてみました。

### Dockerの考え方

1. **イメージ (Image)**
    Dockerイメージは、アプリケーションやその実行に必要なすべての依存関係、設定、コードなどを含むパッケージです。イメージは不変であり、コンテナのベースとなります。

2. **コンテナ (Container)**
    イメージから生成される実行可能な状態で、プロセスが分離された環境です。コンテナは軽量で、異なる環境でも同じように動作します。

3. **Docker Hub**
    Dockerイメージを保存・共有するためのクラウドベースのレジストリ。公開イメージやプライベートなイメージを保存できます。
    自分が使いたい環境を先人の方々が作って公開してくださってたりします。

### Linux上でDockerを始める

1. **Dockerのインストール:**
   DockerをLinuxにインストールするには、公式の手順に従います。
   > https://docs.docker.com/engine/install/ubuntu/
   
   ここでは、Ubuntu環境に構築します。

   ```bash
    sudo apt-get update
    sudo apt-get install ca-certificates curl gnupg
    sudo install -m 0755 -d /etc/apt/keyrings
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    sudo chmod a+r /etc/apt/keyrings/docker.gpg
    sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
   ```

2. **Dockerコマンドの基本**
   - `docker pull <イメージ名>`: Docker Hubからイメージをダウンロードします。
   - `docker run <イメージ名>`: イメージからコンテナを作成して実行します。
   - `docker ps`: 現在実行中のコンテナを表示します。
   - `docker images`: ローカルに保存されているイメージの一覧を表示します。

3. **ex. Nginxコンテナの作成**
   以下は、NginxをDockerで実行するシンプルな例です。

   ```bash
   docker pull nginx         # Nginxイメージをダウンロード
   docker run -d -p 8080:80 nginx  # ポート8080でNginxコンテナをバックグラウンドで実行
   ```

   これで、[http://localhost:8080](http://localhost:8080) にアクセスすると、Nginxのデフォルトページが表示されるはずです。

4. **Docker Compose**
   Docker Composeを使用すると、複数のコンテナを定義し、それらを簡単に起動・管理できます。
   `docker-compose.yml` ファイルを作成して、`docker-compose up` コマンドで一括起動できます。
   例えば、APIとデータベースを同時に起動できたりします

#### 注意点:
- Dockerは権限を持つ操作を行うため、通常は `docker` グループにユーザを追加して利用します。以下のコマンドで追加できます。

  ```bash
  sudo usermod -aG docker $USER
  ```

  ユーザを `docker` グループに追加したら、一度ログアウトして再ログインしてください。

# Dockerの基本コマンド

1. **`docker pull` - イメージのダウンロード:**
   Docker Hubからイメージをダウンロードします。

   ```bash
   docker pull <イメージ名>
   ```

   例えば、Nginxの公式イメージをダウンロードするには:

   ```bash
   docker pull nginx
   ```

2. **`docker run` - コンテナの作成と実行**
   イメージからコンテナを作成して実行します。

   ```bash
   docker run [オプション] <イメージ名>
   ```

   例えば、ポート8080でNginxを実行するには

   ```bash
   docker run -d -p 8080:80 nginx
   ```

   - `-d`: バックグラウンドで実行。
   - `-p 8080:80`: ホストのポート8080をコンテナのポート80にマッピング。

3. **`docker ps` - 実行中のコンテナの表示**
   現在実行中のコンテナを表示します。

   ```bash
   docker ps
   ```

4. **`docker images` - ローカルのイメージの表示:*
   ローカルに保存されているイメージの一覧を表示します。

   ```bash
   docker images
   ```

5. **`docker exec` - 実行中のコンテナに入る**
   実行中のコンテナ内でコマンドを実行します。

   ```bash
   docker exec -it <コンテナIDまたはコンテナ名> <コマンド>
   ```

   例えば、Nginxコンテナに入るには

   ```bash
   docker exec -it mynginx bash
   ```

   - `-it`: インタラクティブモードで入る。

6. **`docker stop` - コンテナの停止**
   実行中のコンテナを停止します。

   ```bash
   docker stop <コンテナIDまたはコンテナ名>
   ```

### Docker Composeの活用

1. **`docker-compose.yml` ファイルの作成**
   プロジェクトのルートディレクトリに `docker-compose.yml` ファイルを作成します。

   ```yaml
   version: '3'
   services:
     web:
       image: nginx
       ports:
         - "8080:80"
   ```

2. **`docker-compose up` - コンテナの一括起動**
   `docker-compose.yml` ファイルに基づいて、一括でコンテナを起動します。

   ```bash
   docker-compose up -d
   ```

   - `-d`: バックグラウンドで起動。

3. **`docker-compose down` - コンテナの停止と削除**
   起動しているコンテナを停止し、関連するリソースを削除します。

   ```bash
   docker-compose down
   ```

# 終わりに

dockerとdocker-composeを活用することでローカルの環境を汚さずに開発できるだけでなくプロジェクトの他のメンバーのパソコンでも同じ環境をコマンド１つで構築できるようになります！