Docker 入門、Dockerのインストール、Dockerの基本操作

【概要】Dockerは実行環境をパッケージとして扱うコンテナ化技術である。イメージを基にコンテナを作成し、各コンテナは独立して動作する。データの永続化にはボリュームを使用し、コンテナ間の通信はネットワークを使用する。Dockerfileに手順を記述してイメージをビルドでき、レイヤー構造により管理が可能である。

【目次】

  1. コンテナ化
  2. Dockerエンジン
  3. Dockerイメージ
  4. イメージのレイヤー構造
  5. Dockerfile
  6. Dockerコンテナ
  7. Dockerボリューム
  8. Dockerネットワーク
  9. Docker Desktopのインストール、Dockerエンジンの起動(Windows上)
  10. Docker Desktopのインストール、Dockerエンジンの起動(Ubuntu上)
  11. Dockerの基本操作

サイト内の関連ページ

1. コンテナ化

コンテナ化(Containerization)は、アプリケーションとその実行環境(ライブラリ、設定ファイル、実行環境など)を単一のパッケージとして統合し、異なる実行環境でも一貫した動作を保証する技術である。Dockerによるコンテナ化では、以下の利点がある。

2. Dockerエンジン

Dockerエンジン(Docker Engine)は、Dockerコンテナの作成と実行を管理するソフトウェア基盤である。Dockerエンジンは、以下の2つの主要な要素で構成される。

  1. Dockerデーモン(dockerd):コンテナのライフサイクル全体を管理するサーバープロセス
  2. Dockerクライアント(docker CLI):ユーザーのコマンドをDockerデーモンに伝達するコマンドラインインターフェース

3. Dockerイメージ

Dockerイメージとは、アプリケーションの実行環境を完全に定義したパッケージであり、実行に必要な全てのコンポーネント(ファイル、ライブラリ、依存関係)を含む。このイメージは、実行環境であるDockerコンテナを生成するためのテンプレートとして機能する。

Dockerイメージのプル(取得)

docker pull」コマンドは、Docker HubなどのDockerレジストリから、指定したイメージを効率的にダウンロードする。

次は、Ubuntu 24.04 LTS(Long Term Support:長期サポート版)のイメージを取得する例である。「docker images」コマンドにより、ローカル(手もとのパソコン)に保存されているDockerイメージの一覧を表示している。

docker pull ubuntu:24.04
docker images

Dockerイメージのビルド(Dockerfileからのイメージ作成)

docker build」コマンドは、カレントディレクトリのDockerfileを基にイメージを生成する。生成したイメージには、識別用の名前(例:myubuntu2404)とバージョン管理用のタグ(例:1.0)を設定できる。

docker build -t myubuntu2404:1.0 .
docker images

Dockerイメージの一覧表示

docker imagesコマンドにより、ローカル(手もとのパソコン)に保存されているDockerイメージの一覧を表示する。表示される情報には、各イメージのリポジトリ名、タグ、イメージID、作成日時、サイズが含まれる。イメージの詳細な構成情報を確認するには、docker image inspectコマンドにイメージIDを指定して実行する。

docker images

4. イメージのレイヤー構造

Dockerイメージは、複数のレイヤー(層)によって階層的に構成される。各レイヤーは、Dockerfileの個々のコマンド(FROM、RUN、COPYなど)の実行結果として生成される。

以下に、レイヤーが段階的に生成される具体例を示す。

FROM ubuntu:24.04          # ベースイメージのレイヤー
COPY ./app /app            # アプリケーションファイルのレイヤー
# システムパッケージのインストールのレイヤー
RUN apt-get update && apt-get upgrade -y && \
    apt-get install -y python3 python3-pip python3-dev wget curl git cmake gnupg software-properties-common build-essential

# Miniconda3のインストールのレイヤー
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh && \
    bash Miniconda3-latest-Linux-x86_64.sh -b -p /opt/conda && \
    rm Miniconda3-latest-Linux-x86_64.sh

# condaの初期設定とdev環境の作成のレイヤー
RUN /opt/conda/bin/conda init bash && \
    echo ". /opt/conda/etc/profile.d/conda.sh" >> /root/.bashrc

# コンテナ起動時のコマンド
CMD ["bash", "-c", ". /opt/conda/etc/profile.d/conda.sh && conda activate dev && \
     /opt/conda/envs/dev/bin/jupyter notebook --allow-root --ip=* --port=8888 --no-browser"]

レイヤーには、以下の特徴がある。

5. Dockerfileとは

Dockerfileは、Dockerイメージを作成するための手順を定義したテキストファイルである。ベースイメージの選択、実行コマンドの設定、ファイルのコピー指示、その他の構築手順を記述する。

以下に、2つの構成例を示す。

  1. 基本的な開発ツールをインストールする構成の例

次のDockerfileは、Ubuntu 24.04 LTS(Long Term Support:長期サポート版)のイメージを取得し、Python環境を構築している。Miniconda3を用いてPython 3.12環境を作成し、NumPy、Pandas等の科学技術計算ライブラリを導入している。Jupyter NotebookをPort 8888で起動するよう設定し、開発環境としてcmake、git等の基本ツールも導入している。

FROM ubuntu:24.04

# 環境変数の設定
ENV PATH=/opt/conda/bin:$PATH \
    SHELL=/bin/bash \
    DEBIAN_FRONTEND=noninteractive \
    ENV TZ=Asia/Tokyo

# システムパッケージのインストール
RUN apt-get update && apt-get upgrade -y && \
    apt-get install -y python3 python3-pip python3-dev wget curl git cmake gnupg software-properties-common build-essential

# Miniconda3のインストール
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh && \
    bash Miniconda3-latest-Linux-x86_64.sh -b -p /opt/conda && \
    rm Miniconda3-latest-Linux-x86_64.sh

# condaの初期設定とdev環境の作成
RUN /opt/conda/bin/conda init bash && \
    echo ". /opt/conda/etc/profile.d/conda.sh" >> /root/.bashrc

RUN /opt/conda/bin/conda create -n dev python=3.12 -y && \
    /opt/conda/bin/conda install -n dev -y numpy pandas matplotlib scikit-learn jupyter pylint pytest black && \
    echo "conda activate dev" >> /root/.bashrc

# Jupyterの設定
RUN mkdir -p /root/.jupyter && \
    /opt/conda/envs/dev/bin/jupyter notebook --generate-config && \
    echo "c.NotebookApp.ip = '*'" >> /root/.jupyter/jupyter_notebook_config.py && \
    echo "c.NotebookApp.port = 8888" >> /root/.jupyter/jupyter_notebook_config.py && \
    echo "c.NotebookApp.allow_root = True" >> /root/.jupyter/jupyter_notebook_config.py

# 作業ディレクトリの設定
WORKDIR /workspace

# Jupyterのポートを公開
EXPOSE 8888

# コンテナ起動時のコマンド
CMD ["bash", "-c", ". /opt/conda/etc/profile.d/conda.sh && conda activate dev && \
     /opt/conda/envs/dev/bin/jupyter notebook --allow-root --ip=* --port=8888 --no-browser"]

6. Dockerコンテナ

Dockerコンテナは、Dockerイメージから生成される独立した実行環境である。各コンテナは、他のコンテナやホストシステムから完全に分離され、独自のプロセス空間、ネットワーク環境、ファイルシステムを持つ仮想化環境である。

コンテナの作成と実行

次のコマンドは、公式レポジトリで提供されているUbuntu 24.04 LTSイメージを基に新しいコンテナを作成し、「cat /etc/os-release」コマンドを実行した後、自動的にコンテナを削除する(--rmオプション)操作である。

docker run --rm ubuntu:24.04 cat /etc/os-release

次のコマンドは、公式レポジトリで配布されているUbuntu 24.04 LTS(Long Term Support:長期サポート版)のイメージを基に、新しいコンテナをバックグラウンドで実行する。-itオプションにより対話的な操作を可能にし、--nameオプションでコンテナに一意の識別名を付与する。exitコマンドで接続を終了する。そのとき、コンテナは停止する。--rmオプションが指定されていないため、コンテナは停止後も保持される。

docker run --name ubuntu -it ubuntu:24.04 /bin/bash
exit

停止中のコンテナへの接続。「exit」で切断。

docker startコマンドにより、停止中のコンテナを実行する。docker execコマンドにより、実行中のコンテナに新しいプロセスとして接続し、exitコマンドで接続を終了する。そのとき、コンテナは停止せずに実行を継続する。

docker start ubuntu && docker exec -it ubuntu /bin/bash
exit

実行中あるいは停止中のコンテナの一覧表示

docker psコマンドにより、すべてのコンテナの状態を確認できる。-aオプションにより、停止中のコンテナも含めて表示する。

docker ps -a

7. Dockerボリューム

Dockerボリュームは、コンテナのライフサイクル(作成から削除まで)から独立してデータを永続的に保持する機能である。コンテナが削除された後もボリューム内のデータは安全に保持され、再利用が可能である。さらに、複数のコンテナ間でボリュームを共有することで、異なるコンテナ間でのデータアクセスを実現する。

ボリュームの操作

# データ永続化用のボリュームを作成
docker volume create app-data
# 作成したボリュームをマウントしてコンテナを起動
docker run --rm -v app-data:/data ubuntu:24.04 ls -al /data

8. Dockerネットワーク

Dockerネットワークは、コンテナ間の通信を管理する機能である。複数のコンテナ間の通信や、コンテナとホストシステム間の通信を実現する。

ネットワークの種類

  1. bridgeネットワーク:標準のネットワークドライバとして、同一ホスト上のコンテナ間通信を実現する
  2. hostネットワーク:ホストシステムのネットワークスタックを直接活用し、通信を実現する
  3. noneネットワーク:ネットワーク機能を無効化する
  4. overlayネットワーク:複数のDockerホスト間でのコンテナ通信を実現する

9. Docker Desktopのインストール、Dockerエンジンの起動(Windows上)

Docker Desktopにより、画面を用いてビジュアルに、Dockerコンテナ、Dockerイメージ、Dockerボリュームの一覧表示、状態確認、基本的な操作を行うことができる。

Docker Desktopの起動は、Windowsのスタートメニューから起動できる。Docker デスクトップを起動することにより、Dockerエンジンが起動する。

4.1 インストール

Dockerエンジンを構成するDockerデーモンとクライアントを含むDocker Desktopのインストール手順を示す。

インストールは、以下の2つの方法から選択可能である。

A)winget(Windowsパッケージマネージャー)を使用したインストール

  1. Windowsで、管理者権限コマンドプロンプトを起動(手順:Windowsキーまたはスタートメニュー > cmd と入力 > 右クリック > 「管理者として実行」)。
  2. winget(Windowsパッケージマネージャー)が利用可能か確認する。
    winget --version
    
    wingetのバージョン確認画面
  3. Docker Desktopのインストール。
    winget install --scope machine Docker.DockerDesktop
    

B)手動でのインストール

  1. Docker Desktopのダウンロード。
    • 公式サイト(https://docs.docker.com/desktop/features/wsl/#download)にアクセス
    • インストーラをダウンロードする
  2. インストールの実行。
    • ダウンロードしたインストーラを実行する
    • 画面の指示に従ってインストールを完了する
  3. 自動起動するように設定したい場合

    管理者権限コマンドプロンプトを起動(手順:Windowsキーまたはスタートメニュー > cmd と入力 > 右クリック > 「管理者として実行」)。

    次のコマンドを実行する。

    reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run" /v "Docker Desktop" /t REG_SZ /d "\"C:\Program Files\Docker\Docker\Docker Desktop.exe\"" /f
    

10. Docker Desktopのインストール、Dockerエンジンの起動(Ubuntu上)

1. 事前準備:既存のDockerの削除(必要な場合)

Docker Desktopとの競合を防ぐため、既存のdocker-cedocker.ioがインストールされている場合は、以下のコマンドで削除する必要がある。

sudo apt remove -y docker docker-engine docker.io containerd runc docker-ce docker-ce-cli
rm -r $HOME/.docker
sudo rm -f /usr/local/bin/com.docker.cli
sudo apt purge -y docker-desktop

2. aptがHTTPSでレポジトリを利用できるようにする設定

# パッケージリストの情報を更新
sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release

3. Docker Desktopリポジトリの追加

Dockerの公式GPG(GNU Privacy Guard)キーを追加し、セキュアなDocker公式リポジトリを登録する。

参考ページ: https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo tee /etc/apt/keyrings/docker.asc > /dev/null
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Dockerリポジトリの追加画面

4. Docker Engineのインストール

# パッケージリストの情報を更新
sudo apt update
sudo apt -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin

5. Docker Engineがインストールできたことの確認

以下のコマンドを実行し、エラーメッセージが表示されないことを確認する。

sudo docker run hello-world
Docker Engineの動作確認画面

6. 権限の設定、動作確認

以下のコマンドを実行し、エラーメッセージが表示されないことを確認する。

sudo usermod -aG docker $USER
docker run hello-world
docker --version
docker version
docker compose version
Docker権限設定の確認画面

7. Docker Desktopのインストール

参考ページ: https://docs.docker.com/desktop/setup/install/linux/ubuntu/

curl -LO https://desktop.docker.com/linux/main/amd64/docker-desktop-amd64.deb
sudo apt install -y ./docker-desktop-amd64.deb

8. Docker Desktopを起動し動作確認

以下のコマンドでDocker Desktopを起動し、正常に動作することを確認する。

Docker Desktopの画面が開くため、インターフェースを確認する。

docker desktop version
docker desktop start
Docker Desktopの起動画面

9. Docker Engineのシステム起動時の自動起動設定

sudo systemctl unmask docker.service
sudo systemctl enable docker
sudo systemctl is-enabled docker

10. トラブルシューティング

11. Dockerの基本操作

イメージ、コンテナに対するコマンド一覧

イメージ

コンテナ

イメージからのコンテナの作成、コンテナの開始・停止・削除、ローカルのイメージの確認

イメージの一覧表示画面

コンテナからイメージを作成

  1. docker commitにより、コンテナからイメージを作成する。

    コンテナIDを指定する必要がある。コンテナIDは、「docker ps -a」で調べておく。下の実行例では、イメージ名として「myubuntu2404:1.0」を指定している。「myubuntu2404:1.0」は、自分の使いたいイメージ名を指定すること。

    docker ps -a
    docker commit <コンテナID> myubuntu2404:1.0
    
    コンテナからイメージを作成する画面
  2. イメージが増えたことを確認する。
    docker images
    
    イメージが増えたことの確認画面
  3. 確認のため、いま作成したイメージを使い、コンテナを作成。起動。「exit」で切断。
    docker run -it myubuntu2404:1.0 /bin/bash
    exit
    
    作成したイメージからコンテナを起動する画面

Dockerfileを使い、イメージファイルを生成

  1. 空のディレクトリを作る。
  2. そのディレクトリの中に、Dockerfileを次のように作成して保存する。

    次のDockerfileは、Ubuntu 24.04 LTS(Long Term Support:長期サポート版)のイメージを取得し、Python環境を構築している。Miniconda3を用いてPython 3.12環境を作成し、NumPy、Pandas等の科学技術計算ライブラリを導入している。Jupyter NotebookをPort 8888で起動するよう設定し、開発環境としてcmake、git等の基本ツールも導入している。

    FROM ubuntu:24.04
    
    # 環境変数の設定
    ENV PATH=/opt/conda/bin:$PATH \
        SHELL=/bin/bash \
        DEBIAN_FRONTEND=noninteractive \
        TZ=Asia/Tokyo
    
    # システムパッケージのインストール
    RUN apt-get update && apt-get upgrade -y && \
        apt-get install -y python3 python3-pip python3-dev wget curl git cmake gnupg software-properties-common build-essential && \
        rm -rf /var/lib/apt/lists/*
    
    # Miniconda3のインストール
    RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh && \
        bash Miniconda3-latest-Linux-x86_64.sh -b -p /opt/conda && \
        rm Miniconda3-latest-Linux-x86_64.sh
    
    # condaの初期設定とdev環境の作成
    RUN /opt/conda/bin/conda init bash && \
        echo ". /opt/conda/etc/profile.d/conda.sh" >> /root/.bashrc
    
    RUN /opt/conda/bin/conda create -n dev python=3.12 -y && \
        /opt/conda/bin/conda install -n dev -y numpy pandas matplotlib scikit-learn jupyter pylint pytest black && \
        echo "conda activate dev" >> /root/.bashrc
    
    # Jupyterの設定
    RUN mkdir -p /root/.jupyter && \
        /opt/conda/envs/dev/bin/jupyter notebook --generate-config && \
        echo "c.NotebookApp.ip = '*'" >> /root/.jupyter/jupyter_notebook_config.py && \
        echo "c.NotebookApp.port = 8888" >> /root/.jupyter/jupyter_notebook_config.py && \
        echo "c.NotebookApp.allow_root = True" >> /root/.jupyter/jupyter_notebook_config.py
    
    # 作業ディレクトリの設定
    WORKDIR /workspace
    
    # Jupyterのポートを公開
    EXPOSE 8888
    
    # コンテナ起動時のコマンド
    CMD ["bash", "-c", ". /opt/conda/etc/profile.d/conda.sh && conda activate dev && \
         /opt/conda/envs/dev/bin/jupyter notebook --allow-root --ip=* --port=8888 --no-browser"]
    
  3. Dockerfileをもとにイメージを作成する。

    「docker build」コマンドは、カレントディレクトリのDockerfileを基にイメージを生成する。作成したイメージには、識別用の名前(例:myubuntu2404)とバージョン管理用のタグ(例:1.0)を設定できる。

    その後、「docker images」コマンドにより、ローカルに保存された全てのイメージを一覧形式で確認できる。

    docker build -t myubuntu2404:1.0 .
    docker images
    
  4. 作成されたイメージからのコンテナの作成と実行。
    docker run --name myubuntu -p 8888:8888 -it myubuntu2404 /bin/bash
    

未使用リソースの削除

リソース管理(Docker Desktopを使用)

Docker Desktopの設定でWSL 2に割り当てるリソースを適切に管理する。

メモリ使用量、ディスク容量の設定:Docker Desktop > Settings > Resources > WSL Integration

ローカルフォルダのマウント

ローカルフォルダをマウントする例。

docker run --rm -v %cd%/windows-file:/app ubuntu:24.04 ls /app

Docker上でサーバを起動。ポートマッピングを行う(ホストはUbuntu)

  1. 前準備。
    # パッケージリストの情報を更新
    sudo apt update
    
  2. サーバの起動。

    公式の「はじめよう」のページ(https://docs.docker.com/get-started/)により、サーバを起動してみる。

    次の操作では、ポート3000をポート80にマッピングしている。

    ローカルホストからのみアクセス可能にする場合は「127.0.0.1:3000:80」のようにする。

    docker run -d -p 3000:80 docker/getting-started
    
  3. SSHでリモート接続する。

    次の操作では、ポート8022をポート22にマッピングしている。

    docker run -p 8022:22 -it myubuntu2404:1.0 /bin/bash
    sudo adduser --uid 1234 --ingroup sudo --home /home/ai ai
    

Docker Composeの「はじめよう」を実行(ホストはUbuntu)

次のDocker Composeの「はじめよう」のページの記載通りに実行を進める。

https://docs.docker.com/compose/gettingstarted/

  1. 前準備。

    Docker Composeのインストールが終わっていること。ここでは、Docker Decktopに同封のDocker Composeを使用している。

  2. プロジェクトのディレクトリの作成。
    mkdir composetest
    cd composetest
    
  3. プロジェクトのディレクトリにapp.pyを作る。

    https://docs.docker.com/compose/gettingstarted/のapp.pyを使用。

  4. プロジェクトのディレクトリにrequirements.txtを作る。

    https://docs.docker.com/compose/gettingstarted/のrequirements.txtを使用。

  5. プロジェクトのディレクトリにDockerfileを作る。

    Dockerイメージファイルの生成のために使用される。app.pyが使用するソフトウエア(Python処理系など)が設定されている。

    https://docs.docker.com/compose/gettingstarted/のDockerfileを使用。

  6. プロジェクトのディレクトリにdocker-compose.ymlを作る。

    サービスの設定を行っている。

    https://docs.docker.com/compose/gettingstarted/のdocker-compose.ymlを使用。

  7. 「docker compose up」を実行することにより、アプリケーションのビルドと実行を行う。

    エラーメッセージが出ていないことを確認。

    docker compose up
    
  8. ポート番号8000で、Webサーバにアクセスし、結果を見る。
    curl http://localhost:8000