Docker 入門、Dockerのインストール、Dockerの基本操作
【概要】Dockerは実行環境をパッケージとして扱うコンテナ化技術である。イメージを基にコンテナを作成し、各コンテナは独立して動作する。データの永続化にはボリュームを使用し、コンテナ間の通信はネットワークを使用する。Dockerfileに手順を記述してイメージをビルドでき、レイヤー構造により管理が可能である。
【目次】
- コンテナ化
- Dockerエンジン
- Dockerイメージ
- イメージのレイヤー構造
- Dockerfile
- Dockerコンテナ
- Dockerボリューム
- Dockerネットワーク
- Docker Desktopのインストール、Dockerエンジンの起動(Windows上)
- Docker Desktopのインストール、Dockerエンジンの起動(Ubuntu上)
- Dockerの基本操作
【サイト内の関連ページ】
1. コンテナ化
コンテナ化(Containerization)は、アプリケーションとその実行環境(ライブラリ、設定ファイル、実行環境など)を単一のパッケージとして統合し、異なる実行環境でも一貫した動作を保証する技術である。Dockerによるコンテナ化では、以下の利点がある。
- 実行環境の一貫性:異なる環境間での動作の差異を解消し、安定した実行環境を実現する
- アプリケーションの分離:各コンテナで異なるバージョンのライブラリやフレームワークを独立して使用でき、バージョン依存の課題を解決する
- 環境間の移植性:OS、クラウド環境など、多様な実行環境において同一の動作を実現する
- システムリソースの効率性:仮想マシン(Virtual Machine:VM)と比較して、メモリ使用量とディスク使用量を削減する
2. Dockerエンジン
Dockerエンジン(Docker Engine)は、Dockerコンテナの作成と実行を管理するソフトウェア基盤である。Dockerエンジンは、以下の2つの主要な要素で構成される。
- Dockerデーモン(dockerd):コンテナのライフサイクル全体を管理するサーバープロセス
- 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つの構成例を示す。
- 基本的な開発ツールをインストールする構成の例
次の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ネットワークは、コンテナ間の通信を管理する機能である。複数のコンテナ間の通信や、コンテナとホストシステム間の通信を実現する。
ネットワークの種類
- bridgeネットワーク:標準のネットワークドライバとして、同一ホスト上のコンテナ間通信を実現する
- hostネットワーク:ホストシステムのネットワークスタックを直接活用し、通信を実現する
- noneネットワーク:ネットワーク機能を無効化する
- 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パッケージマネージャー)を使用したインストール
- Windowsで、管理者権限でコマンドプロンプトを起動(手順:Windowsキーまたはスタートメニュー >
cmdと入力 > 右クリック > 「管理者として実行」)。 - winget(Windowsパッケージマネージャー)が利用可能か確認する。
winget --version
- Docker Desktopのインストール。
winget install --scope machine Docker.DockerDesktop
B)手動でのインストール
- Docker Desktopのダウンロード。
- 公式サイト(https://docs.docker.com/desktop/features/wsl/#download)にアクセス
- インストーラをダウンロードする
- インストールの実行。
- ダウンロードしたインストーラを実行する
- 画面の指示に従ってインストールを完了する
- 自動起動するように設定したい場合
管理者権限でコマンドプロンプトを起動(手順: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-ceやdocker.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
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
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. トラブルシューティング
docker.service not foundエラーDockerのインストール状態を正確に確認するため、
docker versionコマンドを実行する。permission deniedエラーsudo usermod -aG docker $USERを実行後、システムからログアウトし、再ログインしてからインストールを実行する。
11. Dockerの基本操作
イメージ、コンテナに対するコマンド一覧
イメージ
- Dockerfileからイメージの構築 build <Dockerfileについての指定>
- コミット(コンテナからイメージの作成) commit <コンテナ> <レポジトリ:タグ>
- 一覧表示 images
- 情報取得 inspect <イメージ>
- 読み込み load
- 保存 save <イメージ>
- イメージの削除 rmi
コンテナ
- 実行開始 run <イメージ>[<コマンド>]
- 停止中のコンテナを実行状態に start <コンテナ>
- 実行中のコンテナを停止 stop <コンテナ>
- 実行中のコンテナでコマンドの起動 exec <コンテナ>
- 実行中のコンテナの破棄 kill <コンテナ>
- 一覧表示 ps -a
- ポートマッピングの表示 port <コンテナ>
- コンテナの削除 rm <コンテナ>
イメージからのコンテナの作成、コンテナの開始・停止・削除、ローカルのイメージの確認
- イメージからのコンテナの作成と開始
Ubuntu 24.04 LTS(Long Term Support:長期サポート版)のイメージからコンテナを作成して開始する。
docker run --name myubuntu -p 8888:8888 -it ubuntu:24.04 /bin/bash
次の実行画面では、Linuxコマンドのpwd、lsを実行した後、「exit」で切断している。
各オプションの説明。
--name myubuntu:コンテナに識別用の名前を付与する-it:対話的な操作を可能にし(-i)、疑似TTY(端末)を割り当てる(-t)-p 8888:8888:Jupyter Notebookのためにポート8888のマッピングを行うubuntu:24.04:使用するベースイメージである/bin/bash:コンテナ起動時に実行するコマンドである
- 停止中のコンテナへの接続。「exit」で切断。
docker startコマンドにより、停止中のコンテナを実行する。docker execコマンドにより、実行中のコンテナに新しいプロセスとして接続し、exitコマンドで接続を終了する。そのとき、コンテナは停止せずに実行を継続する。docker start myubuntu && docker exec -it myubuntu /bin/bash exit
- 実行中のmyubuntuコンテナを停止(Exited)する。
docker stop myubuntu
- 停止中のmyubuntuコンテナを実行中(Up)にする。
docker start myubuntu
- 実行中あるいは停止中のコンテナの一覧表示。
docker ps -a
- 単一コンテナの停止と削除。
docker rm -f <コンテナID>
- すべてのコンテナの停止と削除(コマンドプロンプト用)。
for /f "tokens=*" %i in ('docker ps -a -q') do docker rm -f %i - すべてのコンテナの停止と削除(バッチファイル用)。
for /f "tokens=*" %%i in ('docker ps -a -q') do docker rm -f %%i - イメージの一覧表示。
docker images
コンテナからイメージを作成
- docker commitにより、コンテナからイメージを作成する。
コンテナIDを指定する必要がある。コンテナIDは、「docker ps -a」で調べておく。下の実行例では、イメージ名として「myubuntu2404:1.0」を指定している。「myubuntu2404:1.0」は、自分の使いたいイメージ名を指定すること。
docker ps -a docker commit <コンテナID> myubuntu2404:1.0
- イメージが増えたことを確認する。
docker images
- 確認のため、いま作成したイメージを使い、コンテナを作成。起動。「exit」で切断。
docker run -it myubuntu2404:1.0 /bin/bash exit
Dockerfileを使い、イメージファイルを生成
- 空のディレクトリを作る。
- そのディレクトリの中に、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"] - Dockerfileをもとにイメージを作成する。
「docker build」コマンドは、カレントディレクトリのDockerfileを基にイメージを生成する。作成したイメージには、識別用の名前(例:myubuntu2404)とバージョン管理用のタグ(例:1.0)を設定できる。
その後、「docker images」コマンドにより、ローカルに保存された全てのイメージを一覧形式で確認できる。
docker build -t myubuntu2404:1.0 . docker images
- 作成されたイメージからのコンテナの作成と実行。
docker run --name myubuntu -p 8888:8888 -it myubuntu2404 /bin/bash
未使用リソースの削除
- 未使用リソースの一括削除。
docker system prune -a
- 未使用コンテナの削除。
docker container prune
- 未使用イメージの削除。
docker image prune
リソース管理(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)
- 前準備。
# パッケージリストの情報を更新 sudo apt update
- サーバの起動。
公式の「はじめよう」のページ(https://docs.docker.com/get-started/)により、サーバを起動してみる。
次の操作では、ポート3000をポート80にマッピングしている。
ローカルホストからのみアクセス可能にする場合は「127.0.0.1:3000:80」のようにする。
docker run -d -p 3000:80 docker/getting-started
- 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/
- 前準備。
Docker Composeのインストールが終わっていること。ここでは、Docker Decktopに同封のDocker Composeを使用している。
- プロジェクトのディレクトリの作成。
mkdir composetest cd composetest
- プロジェクトのディレクトリにapp.pyを作る。
- プロジェクトのディレクトリにrequirements.txtを作る。
https://docs.docker.com/compose/gettingstarted/のrequirements.txtを使用。
- プロジェクトのディレクトリにDockerfileを作る。
Dockerイメージファイルの生成のために使用される。app.pyが使用するソフトウエア(Python処理系など)が設定されている。
https://docs.docker.com/compose/gettingstarted/のDockerfileを使用。
- プロジェクトのディレクトリにdocker-compose.ymlを作る。
サービスの設定を行っている。
https://docs.docker.com/compose/gettingstarted/のdocker-compose.ymlを使用。
- 「docker compose up」を実行することにより、アプリケーションのビルドと実行を行う。
エラーメッセージが出ていないことを確認。
docker compose up
- ポート番号8000で、Webサーバにアクセスし、結果を見る。
curl http://localhost:8000