Docker チートシート

ハンズオンラボで Docker を学ぶ

ハンズオンラボと現実世界のシナリオを通じて Docker コンテナ化を学びます。LabEx は、必須のコンテナ管理、イメージビルド、Docker Compose、ネットワーキング、ボリューム、デプロイメントを網羅した包括的な Docker コースを提供します。コンテナオーケストレーションと最新のアプリケーションデプロイメント技術を習得しましょう。

インストールとセットアップ

Linux インストール

Ubuntu/DebianシステムにDockerをインストールします。

# パッケージマネージャーを更新
sudo apt update
# 必須パッケージをインストール
sudo apt install apt-transport-https ca-certificates curl
software-properties-common
# Dockerの公式GPGキーを追加
curl -fsSL https://download.docker.com/linux/ubuntu/gpg
| sudo apt-key add -
# Dockerリポジトリを追加
sudo add-apt-repository "deb [arch=amd64]
https://download.docker.com/linux/ubuntu bionic stable"
# Dockerをインストール
sudo apt update && sudo apt install docker-ce
# Dockerサービスを開始
sudo systemctl start docker
sudo systemctl enable docker

Windows & macOS

GUI ベースの管理のために Docker Desktop をインストールします。

# Windows: docker.comからDocker Desktopをダウンロード
# macOS: Homebrewを使用するか、docker.comからダウンロード
brew install --cask docker
# または直接ダウンロード:
# https://www.docker.com/products/docker-desktop

インストール後セットアップ

非 root ユーザーでの Docker 利用を設定し、インストールを確認します。

# ユーザーをdockerグループに追加 (Linux)
sudo usermod -aG docker $USER
# グループ変更を反映させるためにログアウト/ログイン
# Dockerのインストールを確認
docker --version
docker run hello-world

Docker Compose インストール

マルチコンテナアプリケーションのために Docker Compose をインストールします。

# Linux: curl経由でインストール
sudo curl -L
"https://github.com/docker/compose/releases/download
/v2.24.0/docker-compose-$(uname -s)-$(uname -m)" -o
/usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
# インストールを確認
docker-compose --version
# 注: Docker DesktopにはComposeが含まれています

基本的な Docker コマンド

システム情報:docker version / docker system info

Docker のインストールと環境の詳細を確認します。

# Dockerのバージョン情報を表示
docker version
# システム全体のDocker情報を表示
information
docker system info
# Dockerコマンドのヘルプを表示
docker help
docker <command> --help

コンテナの実行:docker run

イメージからコンテナを作成し、起動します。

# コンテナを対話的に実行
docker run -it ubuntu:latest bash
# コンテナをバックグラウンドで実行
(detached)
docker run -d --name my-container
nginx
# ポートマッピングを指定して実行
docker run -p 8080:80 nginx
# 終了後に自動的に削除して実行
docker run --rm hello-world
クイズ

ログインしてこのクイズに回答し、学習の進捗を追跡できます

docker run -dは何をしますか?
コンテナをデバッグモードで実行する
停止したコンテナを削除する
コンテナをデタッチモード(バックグラウンド)で実行する
デフォルト設定でコンテナを実行する

コンテナの一覧表示:docker ps

実行中および停止中のコンテナを表示します。

# 実行中のコンテナを一覧表示
docker ps
# すべてのコンテナ (停止中を含む) を一覧表示
docker ps -a
# コンテナIDのみを一覧表示
docker ps -q
# 最後に作成されたコンテナを表示
docker ps -l

コンテナ管理

コンテナのライフサイクル:start / stop / restart

コンテナの実行状態を制御します。

# 実行中のコンテナを停止
docker stop container_name
# 停止中のコンテナを開始
docker start container_name
# コンテナを再起動
docker restart container_name
# コンテナのプロセスを一時停止/再開
docker pause container_name
docker unpause container_name

コマンドの実行:docker exec

実行中のコンテナ内でコマンドを実行します。

# 対話的なbashシェルを実行
docker exec -it container_name bash
# 単一のコマンドを実行
docker exec container_name ls -la
# 別のユーザーとして実行
docker exec -u root container_name whoami
# 特定のディレクトリで実行
docker exec -w /app container_name pwd

コンテナの削除:docker rm

システムからコンテナを削除します。

# 停止中のコンテナを削除
docker rm container_name
# 実行中のコンテナを強制削除
docker rm -f container_name
# 複数のコンテナを削除
docker rm container1 container2
# 停止中のすべてのコンテナを削除
docker container prune

コンテナログ:docker logs

コンテナの出力を表示し、問題をデバッグします。

# コンテナのログを表示
docker logs container_name
# ログをリアルタイムで追跡
docker logs -f container_name
# 最近のログのみを表示
docker logs --tail 50 container_name
# タイムスタンプ付きでログを表示
docker logs -t container_name

イメージ管理

イメージのビルド:docker build

Dockerfile から Docker イメージを作成します。

# カレントディレクトリからイメージをビルド
docker build .
# イメージをビルドし、タグ付け
docker build -t myapp:latest .
# ビルド引数を使用してビルド
docker build --build-arg VERSION=1.0 -t myapp .
# キャッシュを使用せずにビルド
docker build --no-cache -t myapp .
クイズ

ログインしてこのクイズに回答し、学習の進捗を追跡できます

docker build -t myapp:latest .は何をしますか?
カレントディレクトリから「myapp:latest」というタグの Docker イメージをビルドする
「myapp」という名前のコンテナを実行する
Docker Hub から「myapp:latest」イメージをプルする
「myapp:latest」イメージを削除する

イメージの検査:docker images / docker inspect

Docker イメージを一覧表示し、検査します。

# すべてのローカルイメージを一覧表示
docker images
# 特定のフィルタでイメージを一覧表示
docker images nginx
# イメージの詳細を表示
docker inspect image_name
# イメージのビルド履歴を表示
docker history image_name

レジストリ操作:docker pull / docker push

イメージをレジストリからダウンロードしたり、アップロードしたりします。

# Docker Hubからイメージをプル
docker pull nginx:latest
# 特定のバージョンをプル
docker pull ubuntu:20.04
# イメージをレジストリにプッシュ
docker push myusername/myapp:latest
# プッシュ前にイメージにタグ付け
docker tag myapp:latest myusername/myapp:v1.0

イメージのクリーンアップ:docker rmi / docker image prune

未使用のイメージを削除してディスク容量を解放します。

# 特定のイメージを削除
docker rmi image_name
# 未使用のイメージを削除
docker image prune
# すべての未使用イメージを削除 (danglingでないものも含む)
docker image prune -a
# イメージを強制削除
docker rmi -f image_name

Dockerfile の基本

必須の命令

イメージビルドのための主要な Dockerfile コマンド。

# ベースイメージ
FROM ubuntu:20.04
# メンテナー情報を設定
LABEL maintainer="user@example.com"
# パッケージをインストール
RUN apt-get update && apt-get install -y \
    python3 \
    python3-pip \
    && rm -rf /var/lib/apt/lists/*
# ホストからコンテナへファイルをコピー
COPY app.py /app/
# 作業ディレクトリを設定
WORKDIR /app
# ポートを公開
EXPOSE 8000
クイズ

ログインしてこのクイズに回答し、学習の進捗を追跡できます

Dockerfile における FROM 命令の目的は何ですか?
ホストからコンテナへファイルをコピーする
ビルドの基盤となるベースイメージを指定する
環境変数を設定する
コンテナ起動時に実行されるコマンドを定義する

ランタイム設定

コンテナの実行方法を設定します。

# 環境変数を設定
ENV PYTHON_ENV=production
ENV PORT=8000
# セキュリティのためにユーザーを作成
RUN groupadd -r appuser && useradd -r -g appuser appuser
USER appuser
# 起動コマンドを定義
CMD ["python3", "app.py"]
# または固定コマンドのためにENTRYPOINTを使用
ENTRYPOINT ["python3"]
CMD ["app.py"]
# ヘルスチェックを設定
HEALTHCHECK --interval=30s --timeout=3s \
  CMD curl -f http://localhost:8000/ || exit 1

Docker Compose

基本的な Compose コマンド:docker-compose up / docker-compose down

マルチコンテナアプリケーションを起動および停止します。

# フォアグラウンドでサービスを起動
docker-compose up
# サービスをバックグラウンドで起動
docker-compose up -d
# サービスをビルドしてから起動
docker-compose up --build
# サービスを停止し、削除
docker-compose down
# ボリューム付きで停止・削除
docker-compose down -v
クイズ

ログインしてこのクイズに回答し、学習の進捗を追跡できます

docker-compose up -dは何をしますか?
すべての実行中コンテナを停止する
コンテナを起動せずにイメージをビルドする
すべてのサービスからのログを表示する
docker-compose.yml で定義されたすべてのサービスをデタッチモード(バックグラウンド)で起動する

サービス管理

Compose アプリケーション内の個々のサービスを制御します。

# 実行中のサービスを一覧表示
docker-compose ps
# サービスログを表示
docker-compose logs service_name
# すべてのサービスのログを追跡
docker-compose logs -f
# 特定のサービスを再起動
docker-compose restart service_name

サンプルの docker-compose.yml

マルチサービスアプリケーションの構成例。

version: '3.8'
services:
  web:
    build: .
    ports:
      - "8000:8000"
    environment:
      -
DATABASE_URL=postgresql://user:pass@db:5432/myapp
    depends_on:
      - db
    volumes:
      - .:/app

  db:
    image: postgres:13
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
    volumes:
      - db_data:/var/lib/postgresql/data
volumes:
  db_data:

ネットワーキングとボリューム

コンテナネットワーキング

コンテナを接続し、サービスを公開します。

# ネットワークを一覧表示
docker network ls
# カスタムネットワークを作成
docker network create mynetwork
# 特定のネットワーク上でコンテナを実行
docker run --network mynetwork nginx
# 実行中のコンテナをネットワークに接続
docker network connect mynetwork container_name
# ネットワークの詳細を検査
docker network inspect mynetwork

ポートマッピング

コンテナポートをホストシステムに公開します。

# 単一ポートのマッピング
docker run -p 8080:80 nginx
クイズ

ログインしてこのクイズに回答し、学習の進捗を追跡できます

docker run -p 8080:80 nginxにおいて、ポート番号は何を意味しますか?
8080 はホストポート、80 はコンテナポート
80 はホストポート、8080 はコンテナポート
両方のポートがコンテナポートである
両方のポートがホストポートである
# 複数ポートのマッピング
docker run -p 8080:80 -p 8443:443 nginx
# 特定のホストインターフェースへのマッピング
docker run -p 127.0.0.1:8080:80 nginx
# イメージで定義されたすべてのポートを公開
docker run -P nginx

データボリューム:docker volume

コンテナ間でデータを永続化し、共有します。

# 名前付きボリュームを作成
docker volume create myvolume
# すべてのボリュームを一覧表示
docker volume ls
# ボリュームの詳細を検査
docker volume inspect myvolume
# ボリュームを削除
docker volume rm myvolume
# 未使用のボリュームを削除
docker volume prune

ボリュームのマウント

コンテナにボリュームやホストディレクトリをマウントします。

# 名前付きボリュームをマウント
docker run -v myvolume:/data nginx
# ホストディレクトリをマウント (バインドマウント)
docker run -v /host/path:/container/path nginx
# カレントディレクトリをマウント
docker run -v $(pwd):/app nginx
# 読み取り専用マウント
docker run -v /host/path:/container/path:ro nginx

コンテナの検査とデバッグ

コンテナの詳細:docker inspect

コンテナやイメージに関する詳細情報を取得します。

# コンテナの設定を検査
docker inspect container_name
# 形式を使用して特定情報を取得
docker inspect --format='{{.State.Status}}'
container_name
# IPアドレスを取得
docker inspect --format='{{.NetworkSettings.IPAddress}}'
container_name
# マウントされているボリュームを取得
docker inspect --format='{{.Mounts}}' container_name

リソース監視

コンテナのリソース使用率とパフォーマンスを監視します。

# コンテナ内の実行中のプロセスを表示
docker top container_name
# ライブのリソース使用率統計を表示
docker stats
# 特定のコンテナの統計情報を表示
docker stats container_name
# リアルタイムでイベントを監視
docker events

ファイル操作:docker cp

コンテナとホストシステム間でファイルをコピーします。

# コンテナからホストへファイルをコピー
docker cp container_name:/path/to/file ./
# ホストからコンテナへファイルをコピー
docker cp ./file container_name:/path/to/destination
# ディレクトリをコピー
docker cp ./directory
container_name:/path/to/destination/
# 権限を保持するためにアーカイブモードでコピー
docker cp -a ./directory container_name:/path/

トラブルシューティング

コンテナの問題や接続の問題をデバッグします。

# コンテナの終了コードを確認
docker inspect --format='{{.State.ExitCode}}'
container_name
# コンテナのプロセスを表示
docker exec container_name ps aux
# ネットワーク接続性をテスト
docker exec container_name ping google.com
# ディスク使用量を確認
docker exec container_name df -h

レジストリと認証

Docker Hub で認証し、対話します。

# Docker Hubにログイン
docker login
# 特定のレジストリにログイン
docker login registry.example.com
# Docker Hubでイメージを検索
docker search nginx
# フィルタ付きで検索
docker search --filter stars=100 nginx

イメージのタグ付けと公開

イメージを準備し、レジストリに公開します。

# レジストリ用にイメージにタグ付け
docker tag myapp:latest username/myapp:v1.0
docker tag myapp:latest
registry.example.com/myapp:latest
# Docker Hubにプッシュ
docker push username/myapp:v1.0
# プライベートレジストリにプッシュ
docker push registry.example.com/myapp:latest

プライベートレジストリ

プライベート Docker レジストリの操作。

# プライベートレジストリからプル
docker pull registry.company.com/myapp:latest
# ローカルレジストリを起動
docker run -d -p 5000:5000 --name registry registry:2
# ローカルレジストリにプッシュ
docker tag myapp localhost:5000/myapp
docker push localhost:5000/myapp

イメージセキュリティ

イメージの整合性とセキュリティを確認します。

# Docker Content Trustを有効化
export DOCKER_CONTENT_TRUST=1
# イメージに署名してプッシュ
docker push username/myapp:signed
# イメージの署名を確認
docker trust inspect username/myapp:signed
# イメージの脆弱性をスキャン
docker scan myapp:latest

システムクリーンアップとメンテナンス

システムクリーンアップ:docker system prune

未使用の Docker リソースを削除し、ディスク容量を解放します。

# 未使用のコンテナ、ネットワーク、イメージを削除
docker system prune
# 未使用のボリュームもクリーンアップに含める
docker system prune -a --volumes
# すべてを削除 (注意して使用)
docker system prune -a -f
# スペース使用量を表示
docker system df

ターゲットを絞ったクリーンアップ

特定の種類の未使用リソースを削除します。

# 停止中のコンテナを削除
docker container prune
# 未使用のイメージを削除
docker image prune -a
# 未使用のボリュームを削除
docker volume prune
# 未使用のネットワークを削除
docker network prune

バルク操作

複数のコンテナ/イメージに対して操作を実行します。

# 実行中のすべてのコンテナを停止
docker stop $(docker ps -q)
# すべてのコンテナを削除
docker rm $(docker ps -aq)
# すべてのイメージを削除
docker rmi $(docker images -q)
# danglingイメージのみを削除
docker rmi $(docker images -f "dangling=true" -q)

リソース制限

コンテナのリソース消費を制御します。

# メモリ使用量を制限
docker run --memory=512m nginx
# CPU使用量を制限
docker run --cpus="1.5" nginx
# CPUとメモリの両方を制限
docker run --memory=1g --cpus="2.0" nginx
# 再起動ポリシーを設定
docker run --restart=always nginx

Docker の設定と設定

デーモン設定

本番環境向けに Docker デーモンを設定します。

# デーモン設定を編集
sudo nano
/etc/docker/daemon.json
# 設定例:
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  },
  "storage-driver": "overlay2"
}
# Dockerサービスを再起動
sudo systemctl restart docker

環境変数

環境変数を使用して Docker クライアントの動作を設定します。

# Dockerホストを設定
export
DOCKER_HOST=tcp://remote-
docker:2376
# TLS検証を有効化
export DOCKER_TLS_VERIFY=1
export
DOCKER_CERT_PATH=/path/to/c
erts
# デフォルトレジストリを設定
export
DOCKER_REGISTRY=registry.co
mpany.com
# デバッグ出力を有効化
export DOCKER_BUILDKIT=1

パフォーマンスチューニング

パフォーマンス向上のために Docker を最適化します。

# 実験的機能を有効化
echo '{"experimental": true}' |
sudo tee
/etc/docker/daemon.json
# ストレージドライバのオプションを設定
{
  "storage-driver": "overlay2",
  "storage-opts": [

"overlay2.override_kernel_check
=true"
  ]
}
# ロギングを設定
{
  "log-driver": "syslog",
  "log-opts": {"syslog-address":
"udp://logs.company.com:514"}
}

ベストプラクティス

セキュリティのベストプラクティス

コンテナを安全に保ち、本番環境に対応させます。

# Dockerfile内で非rootユーザーとして実行
RUN groupadd -r appuser && useradd -r -g appuser
appuser
USER appuser
# 'latest'ではなく、特定のイメージタグを使用する
FROM node:16.20.0-alpine
# 可能な限り読み取り専用ファイルシステムを使用する
docker run --read-only nginx

パフォーマンスの最適化

コンテナを高速化し、リソース効率を高めます。

# イメージサイズを削減するためにマルチステージビルドを使用
FROM node:16 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
FROM node:16-alpine
WORKDIR /app
COPY --from=builder /app/node_modules
./node_modules
COPY . .
CMD ["node", "server.js"]

関連リンク