Dockerコマンドリファレンス - よく使うコマンドとDockerfileの書き方
Dockerの実務でよく使うコマンドをまとめたリファレンス。コンテナ・イメージ管理からDockerfile、Docker Composeまで掲載している。
基本概念
| 用語 | 説明 |
|---|---|
| イメージ | コンテナの設計図(読み取り専用) |
| コンテナ | イメージから作成された実行中のプロセス |
| Dockerfile | イメージをビルドするための手順書 |
| レジストリ | イメージの保管場所(Docker Hub、ECRなど) |
| ボリューム | コンテナ外に永続化するデータ領域 |
| ネットワーク | コンテナ間の通信設定 |
イメージ操作
# イメージの取得
docker pull nginx # 最新版
docker pull nginx:1.25 # バージョン指定
docker pull nginx:1.25-alpine # Alpine Linuxベース(軽量)
# イメージ一覧
docker images
docker image ls
# イメージのビルド
docker build -t myapp:latest . # カレントディレクトリのDockerfileでビルド
docker build -t myapp:1.0 -f Dockerfile.prod . # Dockerfileを指定
# イメージの削除
docker rmi myapp:latest
docker image rm nginx:1.25
docker image prune # 未使用イメージを一括削除
docker image prune -a # タグのないイメージも含めて削除
# イメージの詳細
docker inspect myapp:latest
# イメージをレジストリにプッシュ
docker tag myapp:latest user/myapp:latest
docker push user/myapp:latest
コンテナ操作
# コンテナの起動
docker run nginx # フォアグラウンドで起動
docker run -d nginx # バックグラウンドで起動
docker run -d --name my-nginx nginx # 名前を付けて起動
docker run -d -p 8080:80 nginx # ポートマッピング(ホスト:コンテナ)
docker run -d -p 8080:80 -p 443:443 nginx # 複数ポート
docker run --rm nginx echo "hello" # 実行後にコンテナを自動削除
# 環境変数
docker run -d -e NODE_ENV=production myapp
docker run -d --env-file .env myapp
# ボリュームマウント
docker run -d -v /host/path:/container/path nginx # バインドマウント
docker run -d -v myvolume:/data nginx # 名前付きボリューム
docker run -d -v $(pwd):/app node:20 node server.js # カレントディレクトリをマウント
# コンテナ一覧
docker ps # 起動中のコンテナ
docker ps -a # 全コンテナ(停止中含む)
# コンテナの停止・削除
docker stop my-nginx # グレースフルに停止(SIGTERM)
docker kill my-nginx # 強制停止(SIGKILL)
docker rm my-nginx # コンテナを削除(停止後)
docker rm -f my-nginx # 強制停止して削除
# 一括削除
docker container prune # 停止中コンテナを全削除
# コンテナへの接続
docker exec -it my-nginx bash # bashで接続
docker exec -it my-nginx sh # shで接続(Alpineなど)
docker exec my-nginx ls /etc/nginx # コマンド実行のみ
# ログ確認
docker logs my-nginx
docker logs -f my-nginx # フォロー(リアルタイム)
docker logs --tail 100 my-nginx # 最新100行
docker logs --since 10m my-nginx # 直近10分
# コンテナの詳細情報
docker inspect my-nginx
docker stats # リソース使用状況(リアルタイム)
docker stats --no-stream # 一度だけ表示
ボリューム操作
docker volume create myvolume # ボリューム作成
docker volume ls # ボリューム一覧
docker volume inspect myvolume # 詳細情報
docker volume rm myvolume # 削除
docker volume prune # 未使用ボリュームを一括削除
ネットワーク操作
docker network create mynetwork # ネットワーク作成
docker network ls # ネットワーク一覧
docker network inspect mynetwork # 詳細情報
docker network rm mynetwork # 削除
# コンテナをネットワークに接続
docker run -d --network mynetwork --name app myapp
docker network connect mynetwork my-nginx # 起動中コンテナを接続
docker network disconnect mynetwork my-nginx
同じネットワーク内のコンテナはコンテナ名でアクセスできる(例: http://app:3000)。
Dockerfile の書き方
基本構文
# ベースイメージ
FROM node:20-alpine
# 作業ディレクトリ
WORKDIR /app
# ファイルのコピー(キャッシュ効率化のため依存関係を先にコピー)
COPY package*.json ./
# パッケージのインストール
RUN npm ci --only=production
# アプリケーションコードをコピー
COPY . .
# 環境変数(デフォルト値)
ENV NODE_ENV=production PORT=3000
# ポートの公開(ドキュメント目的。実際のポートマッピングはdocker runで行う)
EXPOSE 3000
# 非rootユーザーで実行
USER node
# 起動コマンド
CMD ["node", "server.js"]
よく使う命令
| 命令 | 説明 |
|---|---|
FROM | ベースイメージを指定 |
WORKDIR | 作業ディレクトリを設定(存在しなければ作成) |
COPY | ホストからコンテナにファイルをコピー |
ADD | COPYに加えてtarの展開・URL取得が可能(基本はCOPYを使う) |
RUN | イメージビルド時にコマンドを実行(レイヤーを作成) |
CMD | コンテナ起動時のデフォルトコマンド(上書き可能) |
ENTRYPOINT | コンテナ起動時の固定コマンド(上書き不可) |
ENV | 環境変数を設定 |
ARG | ビルド時の引数(--build-arg で渡す) |
EXPOSE | 使用ポートのドキュメント |
VOLUME | マウントポイントの指定 |
USER | 実行ユーザーを変更 |
LABEL | メタデータを付与 |
マルチステージビルド
ビルド用と実行用のイメージを分けることで、最終イメージを軽量にする。
# ビルドステージ
FROM node:20 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# 実行ステージ(ビルド成果物のみコピー)
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
USER node
CMD ["node", "dist/server.js"]
.dockerignore
ビルドコンテキストから除外するファイルを指定する。.gitignore と同様の構文。
node_modules
.git
.env
*.log
dist
coverage
.DS_Store
Docker Compose
複数コンテナの構成を compose.yaml(または docker-compose.yml)で管理する。
services:
app:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DATABASE_URL=postgresql://postgres:password@db:5432/mydb
depends_on:
db:
condition: service_healthy
volumes:
- ./logs:/app/logs
db:
image: postgres:16
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
POSTGRES_DB: mydb
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
postgres_data:
Docker Compose コマンド
docker compose up # 起動(フォアグラウンド)
docker compose up -d # バックグラウンドで起動
docker compose up --build # イメージをビルドしてから起動
docker compose down # 停止・コンテナ削除
docker compose down -v # ボリュームも削除
docker compose ps # サービス一覧
docker compose logs # 全サービスのログ
docker compose logs -f app # 特定サービスのログをフォロー
docker compose exec app bash # サービスのコンテナに接続
docker compose run --rm app npm test # 一時コンテナでコマンド実行
docker compose restart app # サービスを再起動
よく使うパターン
開発環境でホットリロード
services:
app:
build:
context: .
target: development # マルチステージのdevステージ
volumes:
- .:/app # ソースコードをマウント
- /app/node_modules # node_modules はコンテナ側を使う
command: npm run dev
環境変数ファイルの分離
services:
app:
env_file:
- .env # 共通設定
- .env.local # ローカル上書き
リソース制限
services:
app:
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
全てクリーンアップ
# 停止中コンテナ・未使用イメージ・ネットワーク・キャッシュを削除
docker system prune
# ボリュームも含めて全削除(データが失われるため注意)
docker system prune -a --volumes
参考リンク
- Docker 公式ドキュメント - Docker公式
- Dockerfile リファレンス - Dockerfile命令一覧
- Docker Compose リファレンス - compose.yaml仕様