【Docker学習ナレッジ編】概念と基本操作メモ1

## Dockerとは
Dockerはアプリや必要な環境をまとめて「コンテナ」としてパッケージ化し、どこでも同じように動かせる技術です。軽くて起動が速く、開発・テスト・本番で環境差をなくせます。クラウドやローカルでのデプロイにも便利です。

:::note info
分かりやすく理解するポイント
- コンテナという軽量な仮想環境を使って、アプリケーションとその必要なライブラリ・設定をまとめます。
- そのコンテナは、どんなサーバー（たとえば Windows / Linux / クラウド）でも同じように動きます。
- 仮想マシンと違って、OS 全体を仮想化するのではなく、ホストOS のカーネルを共有するので、軽量で高速です。
:::

## Hello World
Docker の最初の一歩として **「hello-world」** コンテナを動かす体験はとてもシンプルで学びやすいです。以下の手順でやってみましょう。:seedling:
- ターミナルを開く（コマンドプロンプト / PowerShell / Terminal など）
```bash
docker container run hello-world
```
:::note info
コマンド説明　
- docker container run : コンテナを起動するコマンド
- hello-world : Docker Hub（公式リポジトリ）にあるテスト用の最小イメージ
:::

## Docker イメージ
アプリケーションとその実行に必要なもの（OS、ライブラリ、設定、プログラム）をまとめた**ひな型ファイル** です。  

:::note info
抑えておくべき特徴
- イメージは「設計図」、コンテナは「その実物」
- イメージは変更されず、何度でも同じ環境のコンテナを作れる
- レイヤー構造でできていて効率的（キャッシュが使える）
- Docker Hub などからダウンロード可能（例: ubuntu, nginx, node）
::: 

- 使用例
  ```bash
    docker pull nginx  # イメージをダウンロード
    docker run nginx   # イメージからコンテナを起動
  ```
### :point_right: イメージとコンテナのライブサイクル

- 1️⃣イメージを作る / ダウンロードする
  - 公式や自作の Dockerfile で作成
  - Docker Hub から取得（例: docker pull nginx）
  
　　↓
- 2️⃣ イメージからコンテナを作成・起動する
  ```bash
  docker container run --name my-nginx -d -p 8080:80 nginx
  ```
  - イメージは変わらず、その設計図からコンテナという実体を作る
  - -d 意味： detached mode（デタッチドモード、コンテナを**バックグラウンド**で起動する）
  - -p 意味： ホスト側ポート:コンテナ側ポート
  
　　↓
- 3️⃣ コンテナが動作する（アプリやサービスが稼働）

　　↓
- 4️⃣ コンテナを停止する
  ```bash
  docker container stop my-nginx
  ```
　　↓
- 5️⃣コンテナを削除する
  ```bash
  docker container rm my-nginx
  ```
  :::note warn
  ※イメージは残っているので、また新しいコンテナを作れます。
  :::
　　↓
- 6️⃣イメージは残り続け、再利用可能
  ```bash
  docker container run --name another-nginx -d -p 8081:80 nginx
  ```

## Dockerコンテナを深掘り

- Bashとは
  - Bash（バッシュ）は、Linux や macOS などで広く使われるコマンドラインのシェル（対話型操作環 境）です。
  - コマンドを入力してファイル操作やプログラムの実行、自動処理（スクリプト）などができます。
  - 正式名称は「Bourne Again SHell」で、古いシェルの後継として作られました。
  - サーバー管理や開発の現場で基本スキルとして使われています。
<br>

- Ubuntuとは
  - Ubuntu（ウブントゥ）は、初心者から上級者まで使いやすい人気の**Linuxディストリビューション**です。
  - 無料で使え、デスクトップやサーバー用途で幅広く利用されています。
  - シンプルな操作性と豊富なソフトウェア、定期的なアップデートが特徴です。
  - 開発、学習、サーバー構築などさまざまな用途で世界中のユーザーに親しまれています。

###  :point_right:  BashでUbuntu環境を操作

- 1️⃣ Ubuntu コンテナを起動

  ```bash
   docker container run -it ubuntu
   docker image inspect ubuntu   #Ubuntu イメージの詳細情報を確認する コマンドです
  ```
  :::note info
  コマンド説明　
  - -it は対話モード（シェル操作用）
  - Ubuntu コンテナが起動し、その中の Bash に接続します。
  :::
　　↓
- 2️⃣ Ubuntu コンテナ内で操作

  ```bash
   ls        # ファイル一覧
   apt update    # パッケージリスト更新
   apt install nano  # nanoエディタをインストール
  ```
　　↓
- 3️⃣ 動作中のコンテナ内でコマンドを実行する
  ```bash
   docker container exec [OPTIONS] コンテナ名またはID コマンド [引数...]　
   
   # 例１：コンテナ内でルートディレクトリを一覧表示
   docker container exec my-ubuntu ls /  
   
   # 例２：コンテナ内で対話モードの bash を起動
   docker container exec -it my-ubuntu bash
   ```
   <br>
   
   - 補充：run / exec

| 項目 | docker run    | docker exec       |
| ------- | -------------------------------------- | ----------------------------- |
| 役割      | 新しいコンテナを作って起動する   | 既に動いているコンテナ内でコマンドを実行する                       |
| 主な用途    | コンテナの初回起動、新規環境の作成                      | 動作中のコンテナへの操作やデバッグ                            |
| 実行例     | `docker container run -it ubuntu bash` | `docker container exec -it mycontainer bash` |
| コンテナの有無 | コンテナがなければ作成して起動する        | 既存のコンテナが起動している必要がある     |

　　↓

- 4️⃣ コンテナに名前を付ける
  ```bash
   docker container run --name コンテナ名 [その他のオプション] イメージ名
   
   # 具体例
   # my-ubuntu という名前の Ubuntu コンテナを作成
   # 対話モード（-it）で bash シェルを起動
   docker container run --name my-ubuntu -it ubuntu bash
   ```
　　↓
- 5️⃣コンテナを整理する
  ```bash
   # 動作中のコンテナ一覧を表示
   docker container ls
   
   # 停止中も含めたすべてのコンテナ一覧を表示
   docker container ls -a
   
   # 停止中のコンテナを一括削除
   docker container prune

   # 特定のコンテナを停止
   docker container stop コンテナ名またはID

   # 特定のコンテナを削除
   docker container rm コンテナ名またはID

   # 停止済みコンテナをすべて削除（ID指定まとめて）
   docker container rm $(docker container ls -a -q)
   ```

## Dockerfile
- Dockerfileとは
  - DockerfileはDockerイメージを自動で作るための設計図となるテキストファイルです。
  - 中には「どのOSを使うか」「どんなソフトを入れるか」「どう動かすか」などの命令が書かれています。
  - このファイルを元に docker build コマンドでイメージを作成し、環境構築を自動化できます。
  - 開発や運用で同じ環境を簡単に再現できる便利なツールです。


###  :point_right:  Dockerfileから、イメージを作る
- 1️⃣ Dockerfileを用意する
   ```dockerfile
   # ベースイメージとして公式の Ubuntu 最新版（latestタグ） を使う、という指定
   # これが土台となるOS環境になる
   FROM ubuntu:latest

   # コンテナ内でコマンドを実行する命令。
   # apt-get update でパッケージ情報を最新に更新
   # apt-get install -y nginx で Webサーバーの nginx を自動インストールしている
   # -y は「はい」と自動応答してインストールを進めるオプション
   RUN apt-get update && apt-get install -y nginx

   # コンテナ起動時に実行されるデフォルトのコマンドを指定
   # nginx を起動し、-g "daemon off;" は nginx をフォアグラウンドで動かす設定
   # これによりコンテナが停止せず、nginx がずっと稼働し続ける
   CMD ["nginx", "-g", "daemon off;"]
   ```
　　↓
- 2️⃣ ターミナルでDockerfileのあるフォルダに移動する

   ```bash
   cd /path/to/Dockerfileがあるフォルダ
   ```
　　↓
- 3️⃣ イメージをビルドする

   ```bash
   # -t my-nginx-image ：イメージ名を指定
   # . ：カレントディレクトリ（Dockerfileの場所）
   # 「.（カレントディレクトリ）」がビルドコンテキストになる
   docker image build -t my-nginx-image .
   ```
　　↓
- 4️⃣ 作成したイメージを確認する

   ```bash
   docker image ls
   ```
　　↓
- 5️⃣ イメージからコンテナを起動する
   ```bash
   docker container run -d -p 8080:80 my-nginx-image
   ```
  :::note info
  Dockerfile の COPY 命令　
  ```dockerfile
  COPY <ローカルのパス> <コンテナ内のパス>
  ```
  - <ローカルのパス>：Dockerfile があるビルドコンテキスト内のファイルやフォルダのパス
  - <コンテナ内のパス>：コンテナ内でファイルを置く場所
  - 具体例
    - プロジェクト構成
    ```bash
    /project
      ├ Dockerfile
      └ index.html
    ```
    - Dockerfile
    ```dockerfile
    # index.html を Nginx のデフォルトのウェブルート /usr/share/nginx/html/ にコピー
    # コンテナ起動後にブラウザでアクセスすると自分の index.html が表示
    FROM nginx:latest
    COPY index.html /usr/share/nginx/html/
    ```
  :::

## Dockerイメージのレイヤー構造
- イメージは複数の「レイヤー（層）」で構成されている
  - Dockerイメージは、ファイルや変更内容ごとに 重ねるように積み重ねたレイヤーの集合 です
  - それぞれのレイヤーは「差分（変更・追加・削除）」を持ちます
- レイヤーの特徴
  - レイヤーは 読み取り専用
  - 新しいレイヤーは前のレイヤーの上に重ねられ、差分だけを保存するため効率的
  - 複数のイメージで同じレイヤーを共有できるので、ストレージとネットワークが節約される
- Dockerfile とレイヤーの関係
  - Dockerfile の命令（RUN, COPY, ADD など）ごとに新しいレイヤーが作成される
  - 例えば：
  ```dockerfile
  FROM ubuntu:latest
  RUN apt-get update
  RUN apt-get install -y nginx
  COPY index.html /usr/share/nginx/html/
  ```
  - ↑の場合、4つのレイヤーが積み重なります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4117390/fb855df5-336e-4cfa-8ef8-805ba1ed130c.png)