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
    
  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 -y 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

4. Docker Engine のインストール

sudo apt -y update
sudo apt -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin

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

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

sudo docker run hello-world

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

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

sudo usermod -aG docker $USER
docker run hello-world
docker --version
docker version
docker compose version 

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

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 -y 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