はじめに
Dockim The Book へようこそ。これは、Dev Container 管理を革新するモダンな CLI ツール「Dockim」を習得するための包括的ガイドです。
Dockim とは?
Dockim は、Dev Container 管理のための直感的なコマンドと、シームレスな Neovim 統合を提供することで、開発ワークフローを簡素化・効率化するように設計された強力なコマンドラインツールです。コンテナ化された開発環境と生産的なコーディング体験の間の橋渡しを行います。
なぜ Dockim を使うのか?
現代のソフトウェア開発では、異なる開発環境間での一貫性を確保するため、コンテナ化された環境への依存が高まっています。しかし、これらのコンテナの管理はしばしば煩雑で時間のかかる作業となります。Dockim は以下の機能を提供することで、これらの課題を解決します:
🚀 簡素化されたコンテナ管理
dockim initによるワンコマンドでのコンテナ初期化dockim buildとdockim upによる簡単なビルドと起動- 直感的な停止とクリーンアップコマンド
📝 シームレスな Neovim 統合
- コンテナ内でリモート UI サポート付きの Neovim を直接起動
- リモート接続のための自動ポート管理
- ホストとコンテナ間のクリップボード同期
🛠 開発者フレンドリーなワークフロー
- クイックスタート用のプロジェクトテンプレート生成
- 柔軟な設定オプション
- ソースコンパイルを含むカスタムビルドサポート
🔧 本番対応の機能
- 複雑なマルチサービス構成のサポート
- 既存の Docker ワークフローとの統合
- 包括的な設定管理
主要機能
Dockim は、開発体験を向上させるために設計された豊富な機能セットを提供します:
- クイックコンテナ管理 - Dev Container の開始、停止、ビルドを簡単に実行
- Neovim 統合 - リモート UI サポートと自動ポートフォワーディングで Neovim を起動
- プロジェクト初期化 - 適切なデフォルト設定で Dev Container テンプレートを即座に生成
- 柔軟な設定 - カスタムビルド、dotfiles 統合、ソースコンパイルをサポート
- ポート管理 - 簡単なポートフォワーディングの設定と管理
- 多言語サポート - コンテナで動作するあらゆる開発スタックに対応
Dockim の比較
従来の Docker 管理ツールや基本的な dev container CLI とは異なり、Dockim は特に開発者体験に焦点を当てています。Dev Container のパワーと Neovim のような現代的なエディタの生産性を組み合わせ、そのまま動作する統一されたワークフローを作成します。
| 機能 | 従来の Docker | Dev Container CLI | Dockim |
|---|---|---|---|
| コンテナ管理 | ✅ 複雑 | ✅ 良好 | ✅ 簡素化 |
| エディタ統合 | ❌ 手動設定 | ❌ 限定的 | ✅ ビルトイン |
| プロジェクトテンプレート | ❌ なし | ⚠️ 基本的 | ✅ 包括的 |
| 設定 | ⚠️ 冗長 | ⚠️ JSON重め | ✅ ユーザーフレンドリー |
| ポート管理 | ⚠️ 手動 | ⚠️ 限定的 | ✅ 自動 |
誰がこの本を使うべきか?
この本は以下のような方を対象としています:
- 開発者 - コンテナ化された開発ワークフローを採用したい方
- チーム - 開発環境を標準化したいグループ
- Neovim ユーザー - シームレスなコンテナ統合を求める方
- DevOps エンジニア - 開発者ツールを実装する方
- すべての人 - 現代的な開発プラクティスに興味のある方
この本の使い方
この本は、完全な初心者から上級ユーザーまでのステップを踏むように構成されています:
- はじめよう - インストールと最初のプロジェクト
- ユーザーガイド - コアワークフローと日常的な使用方法
- 統合ガイド - Neovim の設定と高度な設定
- リファレンス - 完全なコマンドドキュメント
- 高度なトピック - カスタム設定とトラブルシューティング
各章は前の章の内容を基に構築されていますが、経験豊富なユーザーは必要に応じて特定のセクションに移動できます。
前提条件
Dockim を始める前に、以下が必要です:
- コマンドラインツールの基本的な知識
- Docker のインストールと実行
- 開発コンテナの理解(必須ではないが有用)
- Neovim のインストール(統合機能用)
開発ワークフローを効率化する準備はできましたか?Dockim ではじめましょう!
はじめよう
この章では、Dockim のインストールから最初の開発環境の作成まで順を追って説明します。この章を終える頃には、Dockim の動作する環境が整い、基本的なワークフローを理解することができるでしょう。
前提条件
Dockim をインストールする前に、以下の前提条件がシステムにインストールされていることを確認してください:
必須の依存関係
Docker または Docker Desktop
- 目的: Dockim は開発コンテナの作成と管理に Docker を使用します
- インストール: Docker の公式インストールガイドを参照
- 確認:
docker --versionを実行してインストールを確認
Dev Container CLI
- 目的: 基本的なコンテナ管理機能を提供します
- インストール:
npm install -g @devcontainers/cli - 確認:
devcontainer --versionを実行してインストールを確認
任意ですが推奨
Neovim
- 目的: Dockim の高度なエディタ統合機能に必要です
- インストール: Neovim のインストールガイドを参照
- 確認:
nvim --versionを実行してインストールを確認
インストール
Dockim はいくつかの方法でインストールできます。あなたの環境に最も適した方法を選んでください:
方法1: Git からインストール(推奨)
この方法では、リポジトリから最新の安定版を直接インストールします:
cargo install --git https://github.com/statiolake/dockim
利点:
- 常に最新の安定版を取得
- Rust の依存関係を自動処理
- 同じコマンドで簡単に更新可能
方法2: ソースからビルド
開発に貢献したい場合や、最新の変更が必要な場合:
# リポジトリをクローン
git clone https://github.com/statiolake/dockim
cd dockim
# ビルドとインストール
cargo install --path .
利点:
- 最新の開発機能にアクセス
- ソースコードを変更する能力
- ビルドプロセスの完全な制御
方法3: ビルド済みバイナリの使用(将来予定)
注意: ビルド済みバイナリは将来のリリースで計画されており、GitHub のリリースページで入手可能になる予定です。
確認
インストール後、Dockim が正しく動作していることを確認します:
# dockim がインストールされアクセス可能か確認
dockim --version
# 利用可能なコマンドを表示
dockim --help
以下のような出力が表示されるはずです:
dockim 0.1.0
A modern CLI tool for managing Dev Containers with ease
最初のプロジェクト
基本的なワークフローを理解するために、Dockim で最初のプロジェクトを作成しましょう:
ステップ1: 新しいディレクトリを作成
mkdir my-first-dockim-project
cd my-first-dockim-project
ステップ2: プロジェクトを初期化
dockim init
このコマンドは以下の構造を作成します:
.devcontainer/
├── devcontainer.json # Dev container 設定
├── compose.yml # Docker Compose 設定
└── Dockerfile # カスタム Docker イメージ定義
ステップ3: 生成されたファイルを確認
devcontainer.json - メイン設定ファイル:
{
"name": "Development Container",
"dockerComposeFile": "compose.yml",
"service": "dev",
"workspaceFolder": "/workspace",
"features": {},
"customizations": {
"vscode": {
"extensions": []
}
}
}
compose.yml - Docker Compose 設定:
services:
dev:
build:
context: .
dockerfile: Dockerfile
volumes:
- ..:/workspace:cached
command: sleep infinity
Dockerfile - カスタムイメージ定義:
FROM mcr.microsoft.com/devcontainers/base:ubuntu
# 必要に応じて追加のツールをインストール
RUN apt-get update && apt-get install -y \
git \
curl \
&& rm -rf /var/lib/apt/lists/*
ステップ4: コンテナをビルド
dockim build
このコマンドは:
- Dockerfile で定義された Docker イメージをビルド
- 必要な依存関係をダウンロード・準備
- 開発環境をセットアップ
以下のような出力が表示されます:
🔨 Building development container...
[+] Building 45.2s (8/8) FINISHED
✅ Container built successfully!
ステップ5: 開発環境を開始
dockim up
このコマンドは:
- 開発コンテナを開始
- プロジェクトディレクトリをマウント
- 開発用の環境を準備
ステップ6: コンテナにアクセス
実行中のコンテナでシェルを開きます:
dockim shell
これで開発コンテナの中にいます!このコンテナ化された環境でコマンドを実行し、パッケージをインストールし、プロジェクトを開発できます。
ワークフローの理解
基本的な Dockim ワークフローは以下のパターンに従います:
- 初期化 (
dockim init) - プロジェクト構造のセットアップ - ビルド (
dockim build) - 開発環境の作成 - 開始 (
dockim up) - コンテナの起動 - 開発 (
dockim shell,dockim exec,dockim neovim) - 環境での作業 - 停止 (
dockim stopまたはdockim down) - 完了時のクリーンアップ
設定の基本
グローバル設定
あなたの好みに対するグローバル設定ファイルを作成します:
dockim init-config
これにより、デフォルト設定で ~/.config/dockim/config.toml が作成されます:
shell = "/bin/zsh"
neovim_version = "v0.11.0"
dotfiles_repository_name = "dotfiles"
dotfiles_install_command = "echo 'no dotfiles install command configured'"
[remote]
background = false
use_clipboard_server = true
args = ["nvim", "--server", "{server}", "--remote-ui"]
プロジェクト固有の設定
各プロジェクトの .devcontainer/devcontainer.json は特定のニーズに合わせてカスタマイズできます:
- 開発ツールの追加
- 環境変数の設定
- ポートフォワーディングの設定
- VS Code 拡張機能のインストール
次のステップ
これで Dockim の基本を理解したので、以下のことができます:
- 詳細なワークフローについてはユーザーガイドを探索
- 高度な編集機能のためのNeovim 連携をセットアップ
- カスタマイズのための設定オプションについて学習
- すべての利用可能なコマンドについてはコマンドリファレンスを参照
よくある問題
Docker パーミッションエラー
Docker でパーミッションエラーが発生した場合:
# ユーザーを docker グループに追加(Linux)
sudo usermod -aG docker $USER
# 変更を有効にするためにログアウトして再度ログイン
ポートが既に使用中
「port already in use」エラーが表示された場合:
# すべてのコンテナを停止
dockim stop
# または完全に削除
dockim down
ビルドの失敗
コンテナのビルドが失敗した場合:
# ゼロから再ビルド
dockim build --rebuild
# Docker キャッシュなしでビルド
dockim build --no-cache
おめでとうございます!Dockim のセットアップが完了し、最初の開発環境を作成しました。さらに深く学ぶ準備はできましたか?日常的なワークフローをマスターするためユーザーガイドを探索しましょう。
ユーザーガイド
このユーザーガイドは、Dockim の日常的なワークフローとコア機能をカバーしています。はじめようの章を完了した後、このガイドを使って日々の開発ワークフローをマスターし、Dockim で生産性を向上させることができます。
概要
ユーザーガイドは3つの主要セクションに分かれています:
- プロジェクトの初期化 - 新しいプロジェクトのセットアップと生成されるファイルの理解
- コンテナ管理 - 開発コンテナのビルド、開始、停止、メンテナンス
- 開発ワークフロー - コンテナ内での日々の開発活動
コア概念
具体的なワークフローに入る前に、Dockim の動作を理解するのに役立つコア概念を確立しましょう:
開発コンテナ
開発コンテナ(または「dev container」)は、完全な機能を備えた開発環境として機能する実行中の Docker コンテナです。以下を含みます:
- ランタイム環境: 必要なプログラミング言語、フレームワーク、ツール
- ソースコードアクセス: プロジェクトファイルがコンテナにマウントされる
- 分離: 依存関係がホストシステムと競合しない
- 再現性: すべてのチームメンバーが同じ環境を取得
Dockim の役割
Dockim は、あなたと基盤のコンテナ技術の間の親しみやすいインターフェースとして機能します:
あなた → Dockim → Dev Container CLI → Docker → 開発環境
この抽象化により、コンテナ管理の詳細よりも開発に集中できます。
プロジェクト構造
すべての Dockim プロジェクトは以下の構造に従います:
your-project/
├── .devcontainer/ # コンテナ設定
│ ├── devcontainer.json # メイン設定ファイル
│ ├── compose.yml # Docker Compose セットアップ
│ └── Dockerfile # カスタムイメージ定義
├── src/ # アプリケーションコード
└── ... (その他のプロジェクトファイル)
設定階層
Dockim は、グローバルな設定とプロジェクト固有の設定の両方を可能にする設定階層を使用します:
- グローバル設定 (
~/.config/dockim/config.toml) - 個人のデフォルト - プロジェクト設定 (
.devcontainer/devcontainer.json) - プロジェクト固有の設定 - コマンドオプション - 特定の操作のランタイム上書き
一般的なワークフロー
Dockim で使用する最も一般的なワークフローは以下のとおりです:
新しい日を始める
# プロジェクトに移動
cd my-project
# 開発環境を開始
dockim up
# エディタを起動
dockim neovim
コンテナセットアップを変更する
# コンテナ設定を編集
vim .devcontainer/Dockerfile
# 変更を反映してリビルド
dockim build --rebuild
# 新しいコンテナで再起動
dockim up
プロジェクト間の切り替え
# 現在のプロジェクトを停止
dockim stop
# 他のプロジェクトに切り替え
cd ../other-project
# 他のプロジェクトを開始
dockim up
一日の終わりのクリーンアップ
# コンテナを停止(素早く再起動するために保持)
dockim stop
# またはコンテナを完全に削除(ディスク容量を解放)
dockim down
コンテナの状態について
開発コンテナは以下のいくつかの状態になることができます:
- 未作成: まだコンテナが存在しない(初期状態)
- ビルド済み: コンテナイメージは存在するが実行中のコンテナはない
- 実行中: コンテナがアクティブに動作し開発準備完了
- 停止中: コンテナは存在するが動作していない
- 削除済み: コンテナが削除された(ただしイメージは残る可能性)
Dockim コマンドがこれらの状態にどう影響するかは以下のとおりです:
未作成 → dockim build → ビルド済み
ビルド済み → dockim up → 実行中
実行中 → dockim stop → 停止中
停止中 → dockim up → 実行中
停止中 → dockim down → 削除済み(ビルド済みに戻る)
ベストプラクティス
プロジェクトの整理
- すべてのプロジェクト固有の設定を
.devcontainer/に保持 - バージョン管理を使用してコンテナ設定の変更を追跡
- プロジェクトの README で手動セットアップ手順を文書化
コンテナのメンテナンス
- セキュリティ更新を取得するため定期的にコンテナをリビルド:
dockim build --rebuild - 未使用のコンテナをクリーンアップするため定期的に
dockim downを使用 - 特に複数のプロジェクトで作業するときはディスク使用量を監視
開発ワークフロー
- 作業開始前にコンテナを開始:
dockim up - 素早いコマンドライン作業には
dockim shellを使用 - 長時間の編集セッションには
dockim neovimを使用 - プロジェクト切り替え時にコンテナを停止:
dockim stop
チーム協業
- バージョン管理を通じて
.devcontainer/設定を共有 - 必要な環境変数やシークレットを文書化
- チーム全体で一貫したベースイメージとツールバージョンを使用
- カスタムイメージには共有コンテナレジストリの使用を検討
次のステップ
コア概念を理解したので、Dockim の使用の特定の側面について詳しく学んでください:
- プロジェクトの初期化 - 新しいプロジェクトを効果的にセットアップする方法
- コンテナ管理 - コンテナのビルドと管理をマスターする
- 開発ワークフロー - 日々の開発ルーチンを最適化する
各セクションはこれらのコア概念を基に構築され、具体的なシナリオに対する実用的で実行可能なガイダンスを提供します。
プロジェクトの初期化
このセクションでは、Dockim で新しいプロジェクトを初期化し、生成された設定ファイルを理解し、特定のニーズに合わせてカスタマイズする方法について説明します。
基本的な初期化
新しいプロジェクトの作成
新しい Dockim プロジェクトを開始する最もシンプルな方法:
# プロジェクトディレクトリを作成して移動
mkdir my-new-project
cd my-new-project
# Dockim 設定を初期化
dockim init
これにより、適切なデフォルト設定で重要な .devcontainer/ ディレクトリ構造が作成されます。
既存プロジェクトでの初期化
既存のプロジェクトに Dockim を追加できます:
# 既存のプロジェクトに移動
cd existing-project
# Dockim を初期化(既存ファイルは上書きしません)
dockim init
# 既存のファイルは影響を受けません
ls -la
Dockim は既存のファイルを上書きしないため、既にいくらかのコンテナ化設定があるプロジェクトでも安全に実行できます。
生成されるファイルについて
dockim init によって作成される各ファイルを詳しく見てみましょう:
devcontainer.json
開発環境を定義するメイン設定ファイル:
{
"name": "Development Container",
"dockerComposeFile": "compose.yml",
"service": "dev",
"workspaceFolder": "/workspace",
"features": {},
"customizations": {
"vscode": {
"extensions": []
}
}
}
主要プロパティ:
name: コンテナの表示名dockerComposeFile: Docker Compose 設定への参照service: dev container として使用する compose.yml のサービスworkspaceFolder: コンテナ内でのコードのマウント位置features: インストールする事前構築の開発ツールcustomizations: エディタ固有の設定
compose.yml
コンテナサービスを定義する Docker Compose 設定:
services:
dev:
build:
context: .
dockerfile: Dockerfile
volumes:
- ..:/workspace:cached
command: sleep infinity
主要要素:
services.dev: メイン開発コンテナbuild: コンテナイメージのビルド方法を指定volumes: プロジェクトコードをコンテナにマウントcommand: コンテナの実行を維持(dev container に必要)
Dockerfile
開発ツールを含むカスタムイメージ定義:
FROM mcr.microsoft.com/devcontainers/base:ubuntu
# 必要に応じて追加のツールをインストール
RUN apt-get update && apt-get install -y \
git \
curl \
&& rm -rf /var/lib/apt/lists/*
構造:
FROM: ベースイメージ(dev container 機能付きの Ubuntu)RUN: 追加ツールをインストールするコマンド- パッケージリストをクリーンアップしてイメージサイズを削減
セットアップのカスタマイズ
ベースイメージの選択
Dockim は適切なデフォルトを使用しますが、プロジェクトのニーズに合わせてベースイメージをカスタマイズできます:
Node.js プロジェクト用:
FROM mcr.microsoft.com/devcontainers/javascript-node:18
Python プロジェクト用:
FROM mcr.microsoft.com/devcontainers/python:3.11
Rust プロジェクト用:
FROM mcr.microsoft.com/devcontainers/rust:latest
多言語プロジェクト用:
FROM mcr.microsoft.com/devcontainers/base:ubuntu
# 複数のランタイムをインストール
RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash - \
&& apt-get install -y nodejs python3 python3-pip
開発ツールの追加
プロジェクトに必要なツールを含めるよう Dockerfile をカスタマイズ:
FROM mcr.microsoft.com/devcontainers/base:ubuntu
# システムユーティリティ
RUN apt-get update && apt-get install -y \
git \
curl \
wget \
unzip \
jq \
&& rm -rf /var/lib/apt/lists/*
# プログラミング言語ツール
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash - && apt-get install -y nodejs
# 開発ツール
RUN npm install -g yarn pnpm
RUN pip3 install black flake8 mypy
# dotfiles をセットアップ(オプション)
RUN git clone https://github.com/yourusername/dotfiles.git /tmp/dotfiles \
&& /tmp/dotfiles/install.sh \
&& rm -rf /tmp/dotfiles
フィーチャーの設定
Dev Container フィーチャーは簡単に有効化できる事前構築ツールです:
{
"name": "Development Container",
"dockerComposeFile": "compose.yml",
"service": "dev",
"workspaceFolder": "/workspace",
"features": {
"ghcr.io/devcontainers/features/docker-in-docker:2": {},
"ghcr.io/devcontainers/features/github-cli:1": {},
"ghcr.io/devcontainers/features/node:1": {
"version": "18"
}
}
}
人気のフィーチャー:
docker-in-docker: dev container 内の Dockergithub-cli: GitHub CLI ツールnode: Node.js ランタイムpython: Python ランタイムgo: Go ランタイム
環境変数
開発環境用の環境変数を設定:
# compose.yml
services:
dev:
build:
context: .
dockerfile: Dockerfile
volumes:
- ..:/workspace:cached
environment:
- NODE_ENV=development
- API_URL=http://localhost:3000
- DEBUG=true
command: sleep infinity
または devcontainer.json で:
{
"remoteEnv": {
"NODE_ENV": "development",
"API_URL": "http://localhost:3000",
"DEBUG": "true"
}
}
ポートフォワーディング
サービス用の自動ポートフォワーディングを設定:
{
"forwardPorts": [3000, 8080, 5432],
"portsAttributes": {
"3000": {
"label": "Application",
"onAutoForward": "notify"
},
"8080": {
"label": "API Server",
"onAutoForward": "openPreview"
}
}
}
プロジェクトテンプレート
Web アプリケーションテンプレート
フロントエンドとバックエンドを持つ典型的な Web アプリケーション用:
FROM mcr.microsoft.com/devcontainers/javascript-node:18
# 追加ツールをインストール
RUN apt-get update && apt-get install -y \
postgresql-client \
redis-tools \
&& rm -rf /var/lib/apt/lists/*
# グローバル npm パッケージをインストール
RUN npm install -g @vue/cli create-react-app
# compose.yml
services:
dev:
build:
context: .
dockerfile: Dockerfile
volumes:
- ..:/workspace:cached
environment:
- NODE_ENV=development
command: sleep infinity
database:
image: postgres:15
environment:
POSTGRES_PASSWORD: dev
POSTGRES_DB: myapp
ports:
- "5432:5432"
redis:
image: redis:alpine
ports:
- "6379:6379"
データサイエンステンプレート
Python ベースのデータサイエンスプロジェクト用:
FROM mcr.microsoft.com/devcontainers/python:3.11
# システム依存関係をインストール
RUN apt-get update && apt-get install -y \
build-essential \
&& rm -rf /var/lib/apt/lists/*
# Python パッケージをインストール
RUN pip install \
jupyter \
pandas \
numpy \
matplotlib \
seaborn \
scikit-learn \
plotly
{
"forwardPorts": [8888],
"portsAttributes": {
"8888": {
"label": "Jupyter Lab",
"onAutoForward": "openBrowser"
}
}
}
マイクロサービステンプレート
複数のサービスを持つプロジェクト用:
# compose.yml
services:
dev:
build:
context: .
dockerfile: Dockerfile
volumes:
- ..:/workspace:cached
depends_on:
- api
- database
command: sleep infinity
api:
build:
context: ./api
dockerfile: Dockerfile
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgres://user:pass@database:5432/myapp
frontend:
build:
context: ./frontend
dockerfile: Dockerfile
ports:
- "8080:8080"
database:
image: postgres:15
environment:
POSTGRES_PASSWORD: dev
POSTGRES_DB: myapp
ベストプラクティス
ファイル構成
設定を整理して保持:
.devcontainer/
├── devcontainer.json # メイン設定
├── compose.yml # コンテナオーケストレーション
├── Dockerfile # カスタムイメージ
├── docker-compose.override.yml # ローカル上書き(gitignore)
└── scripts/
├── postCreateCommand.sh # セットアップスクリプト
└── postStartCommand.sh # スタートアップスクリプト
バージョン管理
バージョン管理に含める:
.devcontainer/devcontainer.json.devcontainer/compose.yml.devcontainer/Dockerfile- セットアップスクリプト
バージョン管理から除外:
.devcontainer/docker-compose.override.yml- 機密環境ファイル
ドキュメント
チームメンバー用のセットアップを文書化:
# 開発セットアップ
## 前提条件
- Docker Desktop
- Dockim CLI
## はじめ方
1. `dockim init` (まだ実行していない場合)
2. `dockim build`
3. `dockim up`
4. `dockim neovim`
## サービス
- App: http://localhost:3000
- API: http://localhost:8080
- Database: localhost:5432
トラブルシューティング
よくある問題
ビルドの失敗:
# ビルドキャッシュをクリアして再ビルド
dockim build --no-cache
パーミッションの問題:
# Dockerfile に追加
ARG USERNAME=vscode
RUN usermod -aG sudo $USERNAME
ファイル同期の遅さ:
# パフォーマンス向上のためキャッシュボリュームを使用
volumes:
- ..:/workspace:cached
次:コンテナ管理で開発コンテナのビルドとメンテナンスをマスターしましょう。
コンテナ管理
このセクションでは、開発コンテナのライフサイクルについて説明します:ビルド、開始、停止、リビルド、そして最適なパフォーマンスのためのメンテナンスです。
コンテナライフサイクル
コンテナライフサイクルを理解することで、異なる状況に適切なコマンドを選択できます:
┌─────────────┐ dockim build ┌─────────────┐ dockim up ┌─────────────┐
│ │ ───────────────────▶│ │ ─────────────────▶│ │
│ 未作成 │ │ ビルド済み │ │ 実行中 │
│ │ │ │ │ │
└─────────────┘ └─────────────┘ └─────────────┘
▲ │
│ │
│ dockim down │ dockim stop
│ │
│ ▼
┌─────────────┐ dockim up ┌─────────────┐
│ │ ◀─────────────────│ │
│ 削除済み │ │ 停止中 │
│ │ │ │
└─────────────┘ └─────────────┘
コンテナのビルド
基本的なビルド
dockim build コマンドはコンテナイメージを作成します:
# 現在の設定でビルド
dockim build
このプロセス:
.devcontainer/Dockerfileを読み込み- ベースイメージをダウンロード
- 指定されたツールと依存関係をインストール
- 再利用可能なコンテナイメージを作成
ビルドオプション
ゼロから再ビルド:
# 既存のイメージを無視して完全に再ビルド
dockim build --rebuild
Docker キャッシュをクリア:
# Docker のレイヤーキャッシュを使わずにビルド
dockim build --no-cache
Neovim をソースからビルド:
# バイナリの代わりに Neovim をコンパイル
dockim build --neovim-from-source
いつ再ビルドするか
以下の場合にコンテナを再ビルドします:
Dockerfileを変更した時- ベースイメージを変更した時
- セキュリティ更新を取得したい時
- 依存関係が正しく動作しない時
- 新しい開発ツールを追加した時
コンテナの開始
基本的な開始
開発環境を開始:
# コンテナを開始(必要に応じてビルド)
dockim up
開始オプション
強制再ビルドして開始:
# コンテナイメージを再ビルドしてから開始
dockim up --rebuild
コンテナの停止
正常な停止
# コンテナを停止するが素早い再起動のために保持
dockim stop
コンテナは以下を保持します:
- インストール済みパッケージ
- 設定変更
- 一時ファイル
- プロセス状態(可能な場合)
完全な削除
# コンテナを完全に削除(イメージは保持)
dockim down
これにより以下が解放されます:
- コンテナが使用していたディスク容量
- コンテナに割り当てられたメモリ
- ネットワークリソース
高度な管理
複数プロジェクト
複数のプロジェクトで作業する場合:
# プロジェクト A
cd project-a
dockim up
# プロジェクト B に切り替え(A は実行中のまま)
cd ../project-b
dockim up
# 完了時にすべてのコンテナを停止
cd ../project-a && dockim stop
cd ../project-b && dockim stop
コンテナクリーンアップ
未使用コンテナの削除:
# 停止中のコンテナを削除
docker container prune
# 未使用のイメージを削除
docker image prune
# 未使用のすべてを削除(注意!)
docker system prune
パフォーマンス最適化
ボリュームパフォーマンス
キャッシュボリュームを使用:
volumes:
- ..:/workspace:cached # macOS/Windows
- ..:/workspace:z # SELinux付きLinux
メモリとCPU制限
services:
dev:
# ... その他の設定
deploy:
resources:
limits:
memory: 2G
cpus: '1.5'
reservations:
memory: 1G
cpus: '0.5'
トラブルシューティング
コンテナが開始しない
コンテナログを確認:
docker logs $(docker ps -aq --filter "label=dockim")
設定を検証:
# compose ファイルを検証
docker-compose -f .devcontainer/compose.yml config
ビルドの失敗
ネットワーク問題:
# 特定の DNS サーバーを使用
FROM mcr.microsoft.com/devcontainers/base:ubuntu
RUN echo 'nameserver 8.8.8.8' > /etc/resolv.conf
パーミッション問題:
# ビルド中にパーミッションを修正
RUN chown -R vscode:vscode /workspace
キャッシュ問題:
# すべてのキャッシュをクリアして再ビルド
docker builder prune -a
dockim build --no-cache
次:開発ワークフローでコンテナ内での日々の開発ルーチンを最適化しましょう。
開発ワークフロー
このセクションでは、Dockim コンテナ内での日々の開発活動について説明します。コマンドの実行からコードの編集、開発環境の管理まで。
日々の開発ルーチン
一日の始まり
Dockim での典型的な一日は以下から始まります:
# プロジェクトに移動
cd my-project
# 開発環境を開始
dockim up
# エディタを開く
dockim neovim
# または短縮エイリアスを使用
dockim v
開発中
一日を通して、さまざまなコマンドを使用します:
# テストを実行
dockim exec npm test
# 新しい依存関係をインストール
dockim exec npm install lodash
# git ステータスを確認
dockim exec git status
# データベースマイグレーションを実行
dockim exec python manage.py migrate
一日の終わり
正常な終了:
# まず作業を保存!
# その後コンテナを停止
dockim stop
# または完全なクリーンアップ
dockim down
シェルでの作業
対話型シェルアクセス
コンテナ内で作業する最も一般的な方法:
# デフォルトシェル(通常zsh)
dockim shell
# 短縮エイリアス
dockim sh
# 特定のシェル
dockim bash
シェル内では以下にアクセスできます:
/workspaceにマウントされたすべてのプロジェクトファイル- インストール済みの開発ツールと言語
- 依存関係ダウンロード用のネットワークアクセス
- 設定からの環境変数
シェルのカスタマイズ
好みのシェルを設定:
# ~/.config/dockim/config.toml
shell = "/bin/zsh" # または "/bin/bash", "/bin/fish" など
コマンドの実行
単発コマンド
対話型シェルを開かずにコマンドを実行:
# 単一コマンド
dockim exec ls -la
dockim exec python --version
dockim exec npm run build
# 引数付きコマンド
dockim exec git commit -m "Add new feature"
dockim exec curl -X POST http://localhost:3000/api/test
スクリプトの実行
プロジェクトスクリプトを実行:
# package.json スクリプト
dockim exec npm run dev
dockim exec npm run test:watch
dockim exec npm run lint
# カスタムスクリプト
dockim exec ./scripts/setup.sh
dockim exec python scripts/seed_database.py
ファイル操作
ファイル編集パターン
クイック編集:
# 小さな設定変更
dockim exec nano .env
dockim exec vim package.json
長時間の編集セッション:
# リモート UI で完全な Neovim を起動
dockim neovim
# またはコンテナ内で直接(リモート UI なし)
dockim neovim --no-remote-ui
ファイル同期
ファイルはホストとコンテナ間で自動的に同期されます:
# ホストで編集
echo "console.log('hello');" > app.js
# コンテナ内ですぐに利用可能
dockim exec node app.js # 出力: hello
開発サーバー管理
開発サーバーの実行
Node.js アプリケーション:
# 開発サーバーを開始
dockim exec npm run dev
# 特定のポートで
dockim exec PORT=3000 npm start
Python アプリケーション:
# Django
dockim exec python manage.py runserver 0.0.0.0:8000
# Flask
dockim exec FLASK_ENV=development flask run --host=0.0.0.0
複数のサービス:
# ターミナル1: バックエンド
dockim exec npm run server
# ターミナル2: フロントエンド
dockim exec npm run client
# ターミナル3: 追加サービス
dockim exec npm run workers
ポートアクセス
実行中のサービスにアクセス:
# ポートフォワーディングを追加
dockim port add 3000
dockim port add 8080:80 # host:container
# アクティブなフォワーディングを表示
dockim port ls
# ホストブラウザからアクセス
# http://localhost:3000
# http://localhost:8080
データベースとサービス連携
データベース操作
PostgreSQL:
# データベースに接続
dockim exec psql -h database -U postgres myapp
# マイグレーションを実行
dockim exec python manage.py migrate
# データをシード
dockim exec python manage.py loaddata fixtures/initial_data.json
MongoDB:
# MongoDB に接続
dockim exec mongo mongodb://database:27017/myapp
# データをインポート
dockim exec mongoimport --host database --db myapp --collection users --file users.json
Redis 操作
# Redis に接続
dockim exec redis-cli -h redis
# Redis ステータスを確認
dockim exec redis-cli -h redis ping
環境管理
環境変数
単一コマンド用に設定:
dockim exec NODE_ENV=production npm run build
dockim exec DEBUG=app:* npm start
設定で設定:
# compose.yml
services:
dev:
environment:
- NODE_ENV=development
- API_URL=http://localhost:3000
- DEBUG=true
テストワークフロー
テストの実行
単体テスト:
# すべてのテストを実行
dockim exec npm test
# 特定のテストファイルを実行
dockim exec npm test -- user.test.js
# ウォッチモード
dockim exec npm run test:watch
統合テスト:
# テストデータベースで
dockim exec TEST_DB_URL=postgres://test:test@database:5432/test_db npm test
# e2eテストを実行
dockim exec npm run test:e2e
デバッグ
デバッグ設定
Node.js デバッグ:
# デバッガーで開始
dockim exec node --inspect=0.0.0.0:9229 app.js
# デバッガー用のポートフォワードを追加
dockim port add 9229
Python デバッグ:
# pdb をインストール
dockim exec pip install pdb
# pdb でデバッグ
dockim exec python -m pdb app.py
ベストプラクティス
コマンドの整理
プロジェクト固有のエイリアスを作成:
# シェル rc ファイルに追加
alias dtest="dockim exec npm test"
alias ddev="dockim exec npm run dev"
alias dlint="dockim exec npm run lint"
alias dfix="dockim exec npm run lint:fix"
ワークフローの最適化
ターミナル管理:
# ターミナル1: メイン開発
dockim neovim
# ターミナル2: サーバー/サービス
dockim exec npm run dev
# ターミナル3: テスト/コマンド
dockim shell
# ターミナル4: 監視
docker stats
ホットリロード設定:
# Dockerfile でホットリロードを有効化
ENV CHOKIDAR_USEPOLLING=true
ENV WATCHPACK_POLLING=true
外部ツールとの統合
Git ワークフロー
# コンテナ内での Git 操作
dockim exec git status
dockim exec git add .
dockim exec git commit -m "Update feature"
dockim exec git push
# またはホストで git を使用(推奨)
git status # ホストの git をコンテナファイルで使用
これでユーザーガイドセクションが完了しました。Dockim のコアワークフローについて包括的な知識を得ました。次はNeovim 連携で高度な編集機能を探索しましょう。
Neovim 連携
Dockim の際立った機能の一つは、Neovim とのシームレスな統合です。この章では、開発コンテナで使用するための Neovim のセットアップ、設定、最適化方法について説明します。
概要
Dockim の Neovim 統合は、主に2つの動作モードを提供します:
- リモート UI モード(デフォルト) - Neovim はコンテナで実行され、UI はホストで実行
- ダイレクトモード - Neovim は完全にコンテナ内で実行
リモート UI モードが推奨されます。なぜなら、使い慣れたホスト環境とコンテナ化された開発ツールへのアクセスの両方の利点を提供するからです。
クイックスタート
基本的な使用方法
自動セットアップで Neovim を起動:
# リモート UI で Neovim を開始(推奨)
dockim neovim
# 短縮エイリアス
dockim v
# コンテナ内で直接開始(リモート UI なし)
dockim neovim --no-remote-ui
初回起動
初回起動時、Dockim は以下を実行します:
- コンテナが実行されていない場合は開始
- コンテナ内で Neovim サーバーを起動
- 接続用の利用可能なポートを検索
- ローカル Neovim クライアントを開始
- リモート接続を確立
リモート UI モード
動作原理
リモート UI モードはクライアント・サーバーアーキテクチャを作成します:
ホストマシン コンテナ
┌─────────────────┐ ┌─────────────────┐
│ Neovim Client │ ◀────────▶ │ Neovim Server │
│ (あなたのUI) │ ネットワーク │ (LSP, ツール) │
└─────────────────┘ 接続 └─────────────────┘
利点:
- ホストシステムでのネイティブパフォーマンス
- すべてのコンテナツールとLSPへのアクセス
- シームレスなファイル同期
- クリップボード統合
- ポートフォワーディングを自動処理
ポート管理
Dockim は Neovim 接続用のポートを自動管理します:
# アクティブな Neovim 接続を表示
dockim port ls
# カスタムホストポートを指定
dockim neovim --host-port 8080
ポート選択:
- Dockim は利用可能なポートを自動検索
- デフォルト範囲:52000-53000
- 必要に応じてカスタムポートを指定可能
- 複数プロジェクトの同時実行が可能
クライアント設定
Neovim クライアントの動作を設定:
# ~/.config/dockim/config.toml
[remote]
# クライアントをバックグラウンドで実行(ターミナルをブロックしない)
background = false
# クリップボード同期を有効化
use_clipboard_server = true
# カスタムクライアントコマンド
args = ["nvim", "--server", "{server}", "--remote-ui"]
設定オプション:
background: クライアントをバックグラウンドで実行するかどうかuse_clipboard_server: ホスト/コンテナ間のクリップボード同期を有効化args: クライアント起動用のコマンドテンプレート
サーバー設定
コンテナ Neovim セットアップ
コンテナで Neovim をインストール・設定:
# Dockerfile 内
FROM mcr.microsoft.com/devcontainers/base:ubuntu
# Neovim をインストール(最新安定版)
RUN apt-get update && apt-get install -y software-properties-common \
&& add-apt-repository ppa:neovim-ppa/stable \
&& apt-get update && apt-get install -y neovim \
&& rm -rf /var/lib/apt/lists/*
# または最新機能のためにソースからインストール
RUN curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim-linux64.tar.gz \
&& tar -C /opt -xzf nvim-linux64.tar.gz \
&& ln -s /opt/nvim-linux64/bin/nvim /usr/local/bin/nvim
ソースからのビルド
最新の Neovim 機能のため:
# Neovim をソースからビルドしてビルド
dockim build --neovim-from-source
このオプションは:
- 最新の Neovim をダウンロード・コンパイル
- 時間はかかるが最先端の機能を提供
- プラグイン開発やベータテストに有用
Neovim バージョン管理
インストールする Neovim バージョンを設定:
# ~/.config/dockim/config.toml
neovim_version = "v0.11.0" # 特定のバージョン
# または
neovim_version = "stable" # 最新安定版
# または
neovim_version = "nightly" # 最新ナイトリー
設定管理
Dotfiles 統合
Neovim 設定を自動セットアップ:
# ~/.config/dockim/config.toml
dotfiles_repository_name = "dotfiles"
dotfiles_install_command = "./install.sh nvim"
Dotfiles ワークフロー:
- Dockim が dotfiles リポジトリをクローン
- 指定されたインストールコマンドを実行
- Neovim 設定が即座に利用可能
設定のマウント
設定のための代替アプローチ:
ローカル設定をマウント:
# compose.yml
services:
dev:
volumes:
- ..:/workspace:cached
- ~/.config/nvim:/home/vscode/.config/nvim:ro
ビルド中にコピー:
# Dockerfile
COPY .config/nvim /home/vscode/.config/nvim
RUN chown -R vscode:vscode /home/vscode/.config
Language Server Protocol (LSP)
コンテナ内の LSP
コンテナベース開発の大きな利点の一つは一貫した LSP セットアップです:
Node.js/TypeScript:
# コンテナに言語サーバーをインストール
RUN npm install -g typescript-language-server typescript
RUN npm install -g @volar/vue-language-server
Python:
RUN pip install python-lsp-server[all] pylsp-mypy pylsp-rope
RUN pip install black isort flake8
Rust:
RUN rustup component add rust-analyzer
Go:
RUN go install golang.org/x/tools/gopls@latest
LSP 設定
コンテナ用の Neovim LSP セットアップ例:
-- ~/.config/nvim/lua/lsp-config.lua
local lspconfig = require('lspconfig')
-- TypeScript
lspconfig.tsserver.setup({
root_dir = lspconfig.util.root_pattern("package.json", ".git"),
})
-- Python
lspconfig.pylsp.setup({
settings = {
pylsp = {
plugins = {
black = { enabled = true },
isort = { enabled = true },
}
}
}
})
-- Rust
lspconfig.rust_analyzer.setup({
settings = {
["rust-analyzer"] = {
cargo = { allFeatures = true },
checkOnSave = { command = "clippy" },
}
}
})
デバッグ統合
Debug Adapter Protocol (DAP)
コンテナ内でのデバッグをセットアップ:
-- デバッグ設定
local dap = require('dap')
-- Node.js デバッグ
dap.adapters.node2 = {
type = 'executable',
command = 'node',
args = {'/path/to/vscode-node-debug2/out/src/nodeDebug.js'},
}
dap.configurations.javascript = {
{
name = 'Launch',
type = 'node2',
request = 'launch',
program = '${workspaceFolder}/${file}',
cwd = vim.fn.getcwd(),
sourceMaps = true,
protocol = 'inspector',
console = 'integratedTerminal',
},
}
デバッグ用ポートフォワーディング
# デバッガーポートを転送
dockim port add 9229 # Node.js デバッガー
dockim port add 5678 # Python デバッガー
# デバッグで起動
dockim exec node --inspect=0.0.0.0:9229 app.js
dockim exec python -m debugpy --listen 0.0.0.0:5678 --wait-for-client app.py
プラグイン管理
コンテナ専用プラグイン
コンテナ開発に有用なプラグイン:
-- プラグイン設定(packer.nvim の例)
return require('packer').startup(function(use)
-- コンテナ dev 用の必須プラグイン
use 'neovim/nvim-lspconfig' -- LSP 設定
use 'hrsh7th/nvim-cmp' -- 補完
use 'nvim-treesitter/nvim-treesitter' -- シンタックスハイライト
-- コンテナ専用ユーティリティ
use 'akinsho/toggleterm.nvim' -- ターミナル統合
use 'nvim-telescope/telescope.nvim' -- ファイル検索
use 'lewis6991/gitsigns.nvim' -- Git 統合
-- リモート開発ヘルパー
use 'folke/which-key.nvim' -- キーバインドヘルプ
use 'windwp/nvim-autopairs' -- 自動ペア
use 'numToStr/Comment.nvim' -- 簡単コメント
end)
クリップボード統合
自動クリップボード同期
シームレスなクリップボード共有を有効化:
# ~/.config/dockim/config.toml
[remote]
use_clipboard_server = true
手動クリップボードセットアップ
自動同期が機能しない場合:
-- Neovim クリップボード設定
if vim.fn.getenv("SSH_TTY") then
-- SSH/リモート環境
vim.g.clipboard = {
name = 'OSC 52',
copy = {
['+'] = require('vim.ui.clipboard.osc52').copy('+'),
['*'] = require('vim.ui.clipboard.osc52').copy('*'),
},
paste = {
['+'] = require('vim.ui.clipboard.osc52').paste('+'),
['*'] = require('vim.ui.clipboard.osc52').paste('*'),
},
}
end
パフォーマンス最適化
起動時間
コンテナ内での Neovim 起動を最適化:
-- レイジーロード設定
vim.loader.enable() -- 高速 Lua モジュールロードを有効化
-- プラグインの遅延読み込み
require('lazy').setup({
-- 遅延読み込みのプラグイン仕様
{
'nvim-treesitter/nvim-treesitter',
event = 'BufRead',
},
{
'hrsh7th/nvim-cmp',
event = 'InsertEnter',
},
})
ファイル監視
より良いパフォーマンスのためのファイル監視設定:
-- コンテナでのファイル監視を最適化
vim.opt.updatetime = 100
vim.opt.timeoutlen = 500
-- ファイル変更にポーリングを使用(必要に応じて)
if vim.fn.getenv("CONTAINER") == "1" then
vim.opt.backup = false
vim.opt.writebackup = false
vim.opt.swapfile = false
end
トラブルシューティング
接続の問題
サーバーが開始しない:
# コンテナで Neovim がインストールされているか確認
dockim exec nvim --version
# コンテナが動作しているか確認
docker ps --filter "label=dockim"
# コンテナを再起動
dockim stop && dockim up
クライアントが接続できない:
# ポートフォワーディングを確認
dockim port ls
# ホストでポートが利用可能か確認
netstat -tuln | grep :52000
# 特定のポートで試行
dockim neovim --host-port 8080
パフォーマンス問題
起動が遅い:
- プラグインに遅延読み込みを使用
- 起動スクリプトを最小化
- パフォーマンス向上のため Neovim nightly の使用を検討
編集が遅い:
- ホストとコンテナ間のネットワーク遅延を確認
- 重いプラグインを一時的に無効化
- 大きなファイルにはローカルファイル編集を使用
高いメモリ使用量:
- コンテナリソース制限を監視
- 不要な言語サーバーを無効化
- regex ベースのシンタックスハイライトの代わりに treesitter を使用
プラグインの問題
LSP が動作しない:
# 言語サーバーがインストールされているか確認
dockim exec which typescript-language-server
dockim exec which pylsp
# Neovim で LSP ステータスを確認
:LspInfo
デバッグが接続しない:
# デバッガーポートが転送されているか確認
dockim port ls
# デバッガーがリッスンしているか確認
dockim exec netstat -tuln | grep :9229
高度なワークフロー
複数プロジェクト
複数プロジェクトでの同時作業:
# ターミナル1: プロジェクト A
cd project-a
dockim neovim --host-port 8001
# ターミナル2: プロジェクト B
cd ../project-b
dockim neovim --host-port 8002
セッション管理
Neovim セッションの保存と復元:
-- セッション管理設定
vim.opt.sessionoptions = 'blank,buffers,curdir,folds,help,tabpages,winsize,winpos,terminal'
-- 終了時にセッションを自動保存
vim.api.nvim_create_autocmd('VimLeavePre', {
callback = function()
vim.cmd('mksession! ~/.config/nvim/session.vim')
end,
})
カスタムキーバインド
コンテナ固有のキーバインド:
-- コンテナ開発キーバインド
local keymap = vim.keymap.set
-- クイックコンテナコマンド
keymap('n', '<leader>ct', ':term dockim exec npm test<CR>')
keymap('n', '<leader>cb', ':term dockim exec npm run build<CR>')
keymap('n', '<leader>cs', ':term dockim shell<CR>')
-- ポート管理
keymap('n', '<leader>cp', ':term dockim port ls<CR>')
次:開発コンテナでの高度なネットワーク設定についてポート管理で学びましょう。
ポート管理
ポート管理は、コンテナ化された開発において重要な側面です。この章では、コンテナ内で実行されているアプリケーション、サービス、開発ツールにアクセスするためのネットワークポートを効果的に管理する方法について説明します。
概要
コンテナで開発する際、アプリケーションはコンテナの内部ネットワーク上で実行されます。これらのサービスをホストマシンからアクセスしたり、他の人と共有したりするには、ポートフォワーディングを設定する必要があります。Dockim はこれをシームレスに管理するための直感的なコマンドを提供します。
基本概念
ポートフォワーディングの基本
ポートフォワーディングは、ホストマシンとコンテナ間のマッピングを作成します:
ホストマシン コンテナ
┌─────────────┐ ┌─────────────┐
│ localhost │ │ │
│ :3000 │◀──▶│ :3000 │
│ │ │ Your App │
└─────────────┘ └─────────────┘
ポートのタイプ
異なるポートシナリオの理解:
- 同一ポート: ホストポート 3000 → コンテナポート 3000 (
3000:3000) - 異なるポート: ホストポート 8080 → コンテナポート 3000 (
8080:3000) - 動的ポート: Dockim が利用可能なポートを自動割り当て
- サービスポート: データベース、キャッシュ、その他のサービスポート
ポートコマンド
ポートフォワード追加
基本的なポートフォワーディング:
# ホストポート 3000 をコンテナポート 3000 にフォワード
dockim port add 3000
# ホストポート 8080 をコンテナポート 3000 にフォワード
dockim port add 8080:3000
複数ポート:
# 複数ポートを一度に追加
dockim port add 3000 8080 5432
dockim port add 8001:3000 8002:3001 8003:5432
アクティブポートの表示
# すべてのアクティブなポートフォワードを一覧表示
dockim port ls
# 出力例:
# HOST PORT CONTAINER PORT SERVICE
# 3000 3000 web-app
# 8080 8080 api-server
# 5432 5432 database
ポートフォワードの削除
特定ポートの削除:
# 単一ポートフォワードを削除
dockim port rm 3000
# 複数ポートフォワードを削除
dockim port rm 3000 8080
全ポート削除:
# すべてのアクティブなポートフォワードを削除
dockim port rm --all
自動ポート検出
DevContainer 設定
プロジェクトで自動ポートフォワーディングを設定:
// .devcontainer/devcontainer.json
{
"forwardPorts": [3000, 8080, 5432],
"portsAttributes": {
"3000": {
"label": "Web Application",
"onAutoForward": "notify"
},
"8080": {
"label": "API Server",
"onAutoForward": "openPreview"
},
"5432": {
"label": "PostgreSQL Database",
"onAutoForward": "silent"
}
}
}
ポート属性:
label: 人間が読める説明onAutoForward: ポート検出時のアクションnotify: 通知を表示openPreview: ブラウザで開くsilent: 通知なしでフォワード
動的ポート割り当て
Dockim はポートを自動検出・フォワード可能:
# 自動ポート検出でコンテナを開始
dockim up --auto-ports
# Dockim がリッスンポートをスキャンしてフォワード
アプリケーション固有シナリオ
Web 開発
フロントエンドアプリケーション:
# React 開発サーバー
dockim exec npm start # 通常ポート 3000 で実行
dockim port add 3000
# Vue CLI
dockim exec npm run serve # 通常ポート 8080 で実行
dockim port add 8080
# Next.js
dockim exec npm run dev # 通常ポート 3000 で実行
dockim port add 3000
バックエンドサービス:
# Node.js Express サーバー
dockim port add 3000:3000
# Python Flask
dockim port add 5000:5000
# Python Django
dockim port add 8000:8000
# Go HTTP サーバー
dockim port add 8080:8080
データベースアクセス
PostgreSQL:
# 標準 PostgreSQL ポート
dockim port add 5432:5432
# ホストからアクセス
psql -h localhost -p 5432 -U postgres
MySQL:
# 標準 MySQL ポート
dockim port add 3306:3306
# ホストからアクセス
mysql -h localhost -P 3306 -u root
MongoDB:
# 標準 MongoDB ポート
dockim port add 27017:27017
# ホストからアクセス
mongo mongodb://localhost:27017
Redis:
# 標準 Redis ポート
dockim port add 6379:6379
# ホストからアクセス
redis-cli -h localhost -p 6379
開発ツール
Jupyter Notebook:
# Jupyter ポートをフォワード
dockim port add 8888:8888
# コンテナで Jupyter を開始
dockim exec jupyter lab --ip=0.0.0.0 --port=8888 --no-browser
デバッガーポート:
# Node.js インスペクター
dockim port add 9229:9229
dockim exec node --inspect=0.0.0.0:9229 app.js
# Python デバッガー
dockim port add 5678:5678
dockim exec python -m debugpy --listen 0.0.0.0:5678 app.py
高度なポート管理
ポート競合解決
ポートが既に使用中の場合:
# ポートを使用しているプロセスを確認
netstat -tuln | grep :3000
lsof -i :3000
# 異なるホストポートを使用
dockim port add 3001:3000
# または利用可能なポートを自動検索
dockim port add :3000 # ホストポートを自動割り当て
複数サービス
マイクロサービスアーキテクチャ:
# サービスマッピング
dockim port add 3001:3000 # フロントエンド
dockim port add 3002:8080 # API ゲートウェイ
dockim port add 3003:8081 # ユーザーサービス
dockim port add 3004:8082 # 注文サービス
dockim port add 5432:5432 # データベース
Docker Compose サービス:
# compose.yml
services:
frontend:
build: ./frontend
ports:
- "3000:3000"
api:
build: ./api
ports:
- "8080:8080"
database:
image: postgres:15
ports:
- "5432:5432"
ロードバランシング
複数インスタンス:
# 異なるポートで複数インスタンスを実行
dockim port add 3001:3000 # インスタンス 1
dockim port add 3002:3000 # インスタンス 2
dockim port add 3003:3000 # インスタンス 3
# ロードバランシングに nginx を使用
dockim port add 80:80 # ロードバランサー
セキュリティ考慮事項
ポートバインディング
セキュアなバインディング:
# localhost のみにバインド(より安全)
dockim port add 127.0.0.1:3000:3000
# すべてのインターフェースにバインド(安全性が低い)
dockim port add 0.0.0.0:3000:3000
ファイアウォール設定
ホストファイアウォールルール:
# 特定ポートをファイアウォール通過許可
sudo ufw allow 3000
sudo ufw allow 8080
# ファイアウォールステータス確認
sudo ufw status
環境分離
異なる環境:
# 開発環境(寛容)
dockim port add 3000:3000
# ステージング環境(制限付き)
dockim port add 127.0.0.1:3000:3000
# 本番環境(リバースプロキシを使用)
# 直接ポート公開なし
監視とデバッグ
ポートステータス確認
ポートフォワーディング検証:
# ポートがアクセス可能かテスト
curl http://localhost:3000
# コンテナのリッスンポートを確認
dockim exec netstat -tuln
# ホストから確認
netstat -tuln | grep :3000
ポートスキャン:
# コンテナポートをスキャン
dockim exec nmap localhost
# ホストポートをスキャン
nmap localhost
トラフィック監視
ネットワークトラフィックを監視:
# アクティブな接続を表示
dockim exec ss -tuln
# ネットワーク使用量を監視
docker stats --format "table {{.Container}}\t{{.NetIO}}"
# ネットワークアクティビティをログ
tcpdump -i any port 3000
パフォーマンス最適化
ポート範囲選択
ポート範囲を最適化:
# 競合を避けるため高いポート番号を使用
dockim port add 8000:3000 # 3000:3000 の代わり
# 関連サービスをグループ化
dockim port add 8001:3001 # フロントエンド
dockim port add 8002:3002 # API
dockim port add 8003:3003 # 管理
接続プーリング
データベース接続:
# データベースに接続プーリングを使用
dockim port add 5432:5432
# アプリケーションで接続制限を設定
# 例: PostgreSQL で max_connections=100
トラブルシューティング
よくある問題
ポートが既に使用中:
# ポートを使用しているプロセスを検索
lsof -i :3000
# 安全な場合はプロセスを終了
kill -9 <PID>
# または異なるポートを使用
dockim port add 3001:3000
接続拒否:
# コンテナでサービスが実行中か確認
dockim exec ps aux | grep node
# サービスが正しいインターフェースにバインドしているか確認
dockim exec netstat -tuln | grep :3000
# サービスが 127.0.0.1 でなく 0.0.0.0 にバインドすることを確認
接続が遅い:
# Docker ネットワークパフォーマンスを確認
docker network ls
docker network inspect <network_name>
# コンテナネットワーク統計を監視
docker stats --format "table {{.Container}}\t{{.NetIO}}"
診断コマンド
ネットワークデバッグ:
# コンテナ接続性をテスト
dockim exec ping google.com
# コンテナ間通信をテスト
dockim exec ping other-container-name
# DNS 解決を確認
dockim exec nslookup database
ポートアクセシビリティ:
# コンテナ内から
dockim exec curl http://localhost:3000
# ホストから
curl http://localhost:3000
# 他のマシンから(必要に応じて)
curl http://your-host-ip:3000
ベストプラクティス
ポート整理
一貫したポートマッピング:
# 予測可能なパターンを使用
3000-3099: フロントエンドアプリケーション
8000-8099: バックエンド API
5400-5499: データベース
6000-6099: キャッシュ/キューシステム
9000-9099: 監視/デバッグ
ドキュメント化
ポートを文書化:
# ポートマッピング
| サービス | ホストポート | コンテナポート | 説明 |
|---------|-------------|---------------|------|
| Web App | 3000 | 3000 | React フロントエンド |
| API | 8080 | 8080 | Express バックエンド |
| DB | 5432 | 5432 | PostgreSQL |
| Redis | 6379 | 6379 | キャッシュ |
自動化
一般的なセットアップを自動化:
#!/bin/bash
# setup-ports.sh
dockim port add 3000:3000 # フロントエンド
dockim port add 8080:8080 # API
dockim port add 5432:5432 # データベース
dockim port add 6379:6379 # Redis
echo "開発用のすべてのポートが設定されました"
次:特定の開発ニーズと好みに合わせて Dockim をカスタマイズするため設定について学びましょう。
設定
Dockim は開発環境をカスタマイズするための豊富な設定オプションを提供します。この章では、グローバル設定からプロジェクト固有のカスタマイゼーションまで、すべての設定側面をカバーします。
設定概要
Dockim は階層的な設定システムを使用します:
- グローバル設定 (
~/.config/dockim/config.toml) - 個人のデフォルト - プロジェクト設定 (
.devcontainer/devcontainer.json) - プロジェクト固有の設定 - 環境変数 - ランタイム上書き
- コマンドラインオプション - 一時的な上書き
グローバル設定
グローバル設定の作成
デフォルト設定を生成:
# グローバル設定ファイルを作成
dockim init-config
これにより、カスタマイズ可能なデフォルト設定で ~/.config/dockim/config.toml が作成されます。
グローバル設定構造
# ~/.config/dockim/config.toml
# シェル設定
shell = "/bin/zsh" # 使用するデフォルトシェル
neovim_version = "v0.11.0" # ソースビルド用 Neovim バージョン
# Dotfiles 統合
dotfiles_repository_name = "dotfiles"
dotfiles_install_command = "echo 'no dotfiles install command configured'"
# コンテナ内 Neovim 起動設定
[neovim]
launch_with_shell = true # デフォルトで設定済み shell 経由で Neovim を起動
shell_args = ["-lc"] # zshrc まで読むなら ["-lic"]
# リモート Neovim 設定
[remote]
background = false # クライアントをバックグラウンドで実行
use_clipboard_server = true # クリップボード同期を有効化
args = ["nvim", "--server", "{server}", "--remote-ui"]
シェル設定
デフォルトシェル:
shell = "/bin/zsh" # デフォルトで zsh を使用
# または
shell = "/bin/bash" # bash を使用
# または
shell = "/usr/bin/fish" # fish シェルを使用
カスタムシェルパス:
# カスタムシェルインストール
shell = "/opt/homebrew/bin/zsh"
# または特定バージョンで
shell = "/usr/local/bin/bash-5.1"
Neovim 設定
バージョン管理:
neovim_version = "v0.11.0" # 特定バージョン
# または
neovim_version = "stable" # 最新安定版リリース
# または
neovim_version = "nightly" # 最新ナイトリービルド
ビルドオプション:
[neovim]
launch_with_shell = true # デフォルトでは `<shell> -lc 'exec env ... nvim ...'` で起動
shell_args = ["-lc"] # `<shell> -lc 'exec env ... nvim ...'` で起動
zsh 経由で Neovim を起動して PATH を引き継ぐ:
shell = "/bin/zsh"
[neovim]
launch_with_shell = true
shell_args = ["-lic"] # interactive + login。PATH を zsh 初期化に寄せるとき向き
Dotfiles 統合
リポジトリ設定:
dotfiles_repository_name = "dotfiles"
dotfiles_install_command = "./install.sh"
高度な Dotfiles セットアップ:
[dotfiles]
repository_name = "dotfiles"
branch = "main" # 特定ブランチ
install_command = "./install.sh nvim zsh"
post_install_command = "source ~/.zshrc"
リモート設定
Neovim リモート UI:
[remote]
background = false # バックグラウンドで実行しない
use_clipboard_server = true # クリップボード同期を有効化
port_range = [52000, 53000] # 接続用ポート範囲
client_timeout = 30 # 接続タイムアウト(秒)
args = ["nvim", "--server", "{server}", "--remote-ui"]
カスタムクライアントコマンド:
[remote]
# 異なる Neovim クライアントを使用
args = ["nvim-qt", "--server", "{server}"]
# または特定オプションで
args = ["nvim", "--server", "{server}", "--remote-ui", "--headless"]
プロジェクト設定
DevContainer 設定
メインのプロジェクト設定ファイル:
// .devcontainer/devcontainer.json
{
"name": "My Development Container",
"dockerComposeFile": "compose.yml",
"service": "dev",
"workspaceFolder": "/workspace",
// コンテナフィーチャー
"features": {
"ghcr.io/devcontainers/features/node:1": {
"version": "18"
},
"ghcr.io/devcontainers/features/docker-in-docker:2": {}
},
// ポートフォワーディング
"forwardPorts": [3000, 8080],
"portsAttributes": {
"3000": {
"label": "Web App",
"onAutoForward": "notify"
}
},
// 環境変数
"remoteEnv": {
"NODE_ENV": "development",
"DEBUG": "app:*"
},
// カスタマイゼーション
"customizations": {
"vscode": {
"extensions": [
"ms-vscode.vscode-typescript-next",
"bradlc.vscode-tailwindcss"
],
"settings": {
"terminal.integrated.defaultProfile.linux": "zsh"
}
}
}
}
Docker Compose 設定
# .devcontainer/compose.yml
services:
dev:
build:
context: .
dockerfile: Dockerfile
args:
- USER_UID=${LOCAL_UID:-1000}
- USER_GID=${LOCAL_GID:-1000}
volumes:
- ..:/workspace:cached
- ~/.gitconfig:/home/vscode/.gitconfig:ro
- ~/.ssh:/home/vscode/.ssh:ro
environment:
- SHELL=/bin/zsh
- NODE_ENV=development
ports:
- "3000:3000"
- "8080:8080"
command: sleep infinity
database:
image: postgres:15
environment:
POSTGRES_DB: myapp
POSTGRES_PASSWORD: dev
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
Dockerfile 設定
# .devcontainer/Dockerfile
FROM mcr.microsoft.com/devcontainers/base:ubuntu
# 引数
ARG USER_UID=1000
ARG USER_GID=1000
ARG USERNAME=vscode
# システム更新とパッケージインストール
RUN apt-get update && apt-get install -y \
curl \
git \
build-essential \
&& rm -rf /var/lib/apt/lists/*
# Node.js インストール
RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash - \
&& apt-get install -y nodejs
# ユーザーパーミッション設定
RUN groupmod --gid $USER_GID $USERNAME \
&& usermod --uid $USER_UID --gid $USER_GID $USERNAME \
&& chown -R $USERNAME:$USERNAME /home/$USERNAME
# ユーザーに切り替え
USER $USERNAME
# ユーザー固有ツールのインストール
RUN npm install -g @vue/cli create-react-app
# シェル設定
SHELL ["/bin/bash", "-c"]
環境変数
システム環境変数
Docker 設定:
export DOCKER_HOST=unix:///var/run/docker.sock
export DOCKER_BUILDKIT=1
export COMPOSE_DOCKER_CLI_BUILD=1
Dockim 設定:
export DOCKIM_CONFIG_DIR=~/.config/dockim
export DOCKIM_DEFAULT_SHELL=/bin/zsh
export DOCKIM_NEOVIM_VERSION=stable
コンテナ環境変数
compose.yml で:
services:
dev:
environment:
- NODE_ENV=development
- API_URL=http://localhost:8080
- DATABASE_URL=postgres://postgres:dev@database:5432/myapp
- REDIS_URL=redis://redis:6379
devcontainer.json で:
{
"remoteEnv": {
"PATH": "/usr/local/bin:${containerEnv:PATH}",
"NODE_ENV": "development",
"DEBUG": "app:*"
}
}
環境ファイル
.env ファイルの作成:
# .env (リポジトリにコミット - 安全な値のみ)
NODE_ENV=development
API_PORT=8080
DB_HOST=database
# .env.local (gitignore - 機密値)
DATABASE_PASSWORD=dev_secret_123
JWT_SECRET=your-jwt-secret
API_KEY=your-api-key
compose.yml で読み込み:
services:
dev:
env_file:
- .env
- .env.local
言語固有設定
Node.js プロジェクト
// .devcontainer/devcontainer.json
{
"name": "Node.js Development",
"features": {
"ghcr.io/devcontainers/features/node:1": {
"version": "18",
"npmGlobal": "yarn,pnpm,@vue/cli"
}
},
"postCreateCommand": "npm install",
"remoteEnv": {
"NODE_ENV": "development",
"NPM_CONFIG_PREFIX": "/home/vscode/.npm-global"
}
}
Python プロジェクト
{
"name": "Python Development",
"features": {
"ghcr.io/devcontainers/features/python:1": {
"version": "3.11",
"installTools": true
}
},
"postCreateCommand": "pip install -r requirements.txt",
"remoteEnv": {
"PYTHONPATH": "/workspace",
"PYTHONDONTWRITEBYTECODE": "1"
}
}
Rust プロジェクト
{
"name": "Rust Development",
"features": {
"ghcr.io/devcontainers/features/rust:1": {
"version": "latest",
"profile": "default"
}
},
"postCreateCommand": "cargo build",
"remoteEnv": {
"RUST_BACKTRACE": "1",
"CARGO_TARGET_DIR": "/workspace/target"
}
}
Go プロジェクト
{
"name": "Go Development",
"features": {
"ghcr.io/devcontainers/features/go:1": {
"version": "1.21"
}
},
"postCreateCommand": "go mod download",
"remoteEnv": {
"CGO_ENABLED": "0",
"GOPROXY": "https://proxy.golang.org,direct"
}
}
高度な設定
マルチステージ設定
開発環境 vs 本番環境:
# 開発ステージ
FROM mcr.microsoft.com/devcontainers/base:ubuntu as development
RUN apt-get update && apt-get install -y \
curl git build-essential \
&& rm -rf /var/lib/apt/lists/*
# 本番ステージ
FROM node:18-alpine as production
COPY --from=development /usr/bin/git /usr/bin/git
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
条件付き設定
環境ベースの設定:
{
"name": "Multi-Environment Container",
"build": {
"dockerfile": "Dockerfile",
"target": "${localEnv:NODE_ENV:-development}"
},
"remoteEnv": {
"NODE_ENV": "${localEnv:NODE_ENV:-development}",
"LOG_LEVEL": "${localEnv:LOG_LEVEL:-debug}"
}
}
カスタムスクリプト
作成後コマンド:
{
"postCreateCommand": [
"bash",
"-c",
"npm install && npm run setup && echo 'Setup complete!'"
]
}
カスタムスクリプトファイル:
#!/bin/bash
# .devcontainer/postCreateCommand.sh
echo "開発環境をセットアップしています..."
# 依存関係をインストール
npm install
# Git フックを設定
npm run prepare
# 必要なディレクトリを作成
mkdir -p logs tmp
# パーミッションを設定
chmod +x scripts/*.sh
echo "✅ 開発環境の準備完了!"
パフォーマンス設定
ビルドパフォーマンス
Docker BuildKit:
# syntax=docker/dockerfile:1
FROM mcr.microsoft.com/devcontainers/base:ubuntu
# BuildKit 機能を使用
RUN --mount=type=cache,target=/var/lib/apt \
apt-get update && apt-get install -y git curl
ビルド引数:
# compose.yml
services:
dev:
build:
context: .
dockerfile: Dockerfile
args:
- BUILDKIT_INLINE_CACHE=1
cache_from:
- myregistry/my-app:cache
ランタイムパフォーマンス
リソース制限:
services:
dev:
deploy:
resources:
limits:
cpus: '2'
memory: 4G
reservations:
cpus: '1'
memory: 2G
ボリューム最適化:
volumes:
# より良いファイル同期のためのキャッシュボリューム
- ..:/workspace:cached
# node_modules 用の匿名ボリューム
- /workspace/node_modules
# 永続データ用の名前付きボリューム
- node_cache:/home/vscode/.npm
セキュリティ設定
ユーザー設定
# 非 root ユーザーを作成
ARG USERNAME=vscode
ARG USER_UID=1000
ARG USER_GID=$USER_UID
RUN groupadd --gid $USER_GID $USERNAME \
&& useradd --uid $USER_UID --gid $USER_GID -m $USERNAME \
&& apt-get update \
&& apt-get install -y sudo \
&& echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \
&& chmod 0440 /etc/sudoers.d/$USERNAME
USER $USERNAME
シークレット管理
Docker シークレットの使用:
# compose.yml
services:
dev:
secrets:
- db_password
- api_key
secrets:
db_password:
file: ./secrets/db_password.txt
api_key:
file: ./secrets/api_key.txt
環境ベースのシークレット:
# .env.local (決してコミットしない!)
DATABASE_PASSWORD=super_secret_password
API_KEY=your_secret_api_key
設定検証
スキーマ検証
devcontainer.json を検証:
# VS Code Dev Containers CLI を使用
devcontainer build --workspace-folder .
JSON スキーマ:
{
"$schema": "https://aka.ms/vscode-remote/devcontainer.json",
"name": "My Container"
}
設定テスト
コンテナビルドのテスト:
# ビルドテスト
dockim build --no-cache
# 起動テスト
dockim up
# サービステスト
dockim exec curl http://localhost:3000
設定テンプレート
Web アプリケーションテンプレート
{
"name": "Web Application",
"dockerComposeFile": "compose.yml",
"service": "dev",
"features": {
"ghcr.io/devcontainers/features/node:1": {"version": "18"},
"ghcr.io/devcontainers/features/docker-in-docker:2": {}
},
"forwardPorts": [3000, 8080],
"postCreateCommand": "npm install && npm run setup"
}
フルスタックテンプレート
{
"name": "Full-Stack Application",
"dockerComposeFile": "compose.yml",
"service": "dev",
"features": {
"ghcr.io/devcontainers/features/node:1": {"version": "18"},
"ghcr.io/devcontainers/features/python:1": {"version": "3.11"}
},
"forwardPorts": [3000, 8080, 5432, 6379],
"postCreateCommand": "npm install && pip install -r requirements.txt"
}
データサイエンステンプレート
{
"name": "Data Science Environment",
"features": {
"ghcr.io/devcontainers/features/python:1": {
"version": "3.11",
"installTools": true
},
"ghcr.io/devcontainers/features/jupyter:1": {}
},
"forwardPorts": [8888],
"postCreateCommand": "pip install pandas numpy matplotlib seaborn scikit-learn"
}
ベストプラクティス
設定管理
バージョン管理:
# リポジトリに含める
.devcontainer/
├── devcontainer.json
├── compose.yml
├── Dockerfile
└── postCreateCommand.sh
# 機密ファイルを除外
.devcontainer/
├── .env.local # Gitignore
└── secrets/ # Gitignore
ドキュメント化:
# 開発セットアップ
## 設定
- Node.js 18 with npm/yarn
- PostgreSQL 15 on port 5432
- Redis on port 6379
- Hot reload on port 3000
## 環境変数
`.env.example` を `.env.local` にコピーして設定:
- DATABASE_PASSWORD
- JWT_SECRET
チーム一貫性
共有設定:
{
"name": "Team Development Environment",
"features": {
"ghcr.io/devcontainers/features/node:1": {"version": "18.16.0"}
},
"postCreateCommand": "./scripts/team-setup.sh"
}
バージョンロック:
# ~/.config/dockim/config.toml
neovim_version = "v0.9.0" # チーム一貫性のための特定バージョン
次:すべての Dockim コマンドとオプションの詳細なドキュメントについては、完全なコマンドリファレンスを探索しましょう。
コマンドリファレンス
この章では、すべての Dockim コマンド、オプション、使用例の包括的なドキュメントを提供します。
コマンド概要
Dockim は機能別に整理された統合されたコマンドセットを提供します:
- プロジェクト管理:
init,init-config - コンテナライフサイクル:
build,up,stop,down - 開発ツール:
neovim,shell,exec - ネットワーク管理:
port
グローバルオプション
これらのオプションはすべてのコマンドで利用可能です:
--help, -h ヘルプ情報を表示
--version, -V バージョン情報を表示
--verbose, -v 詳細出力を有効化
--quiet, -q エラー以外の出力を抑制
--config <PATH> カスタム設定ファイルを使用
プロジェクト管理コマンド
dockim init
dev container 設定で新しい Dockim プロジェクトを初期化します。
使用方法:
dockim init [OPTIONS]
オプション:
--force, -f 既存ファイルを上書き
--template <NAME> 特定のプロジェクトテンプレートを使用
--name <NAME> コンテナ名を設定
例:
# デフォルト設定で初期化
dockim init
# カスタム名で初期化
dockim init --name "my-web-app"
# 既存設定を強制上書き
dockim init --force
# 特定テンプレートを使用
dockim init --template nodejs
生成ファイル:
.devcontainer/devcontainer.json- メインコンテナ設定.devcontainer/compose.yml- Docker Compose セットアップ.devcontainer/Dockerfile- カスタムイメージ定義
テンプレート:
default- 基本 Ubuntu コンテナnodejs- Node.js 開発環境python- Python 開発環境rust- Rust 開発環境go- Go 開発環境
dockim init-config
デフォルト設定でグローバル設定ファイルを作成します。
使用方法:
dockim init-config [OPTIONS]
オプション:
--force, -f 既存設定を上書き
--editor 作成後にデフォルトエディタで設定を開く
例:
# デフォルト設定を作成
dockim init-config
# 既存設定を上書き
dockim init-config --force
# 作成してエディタで開く
dockim init-config --editor
設定場所:
- Linux/macOS:
~/.config/dockim/config.toml - Windows:
%APPDATA%\dockim\config.toml
コンテナライフサイクルコマンド
dockim build
開発コンテナイメージをビルドします。
使用方法:
dockim build [OPTIONS]
オプション:
--rebuild 完全再ビルドを強制(キャッシュを無視)
--no-cache Docker キャッシュを使わずにビルド
--neovim-from-source バイナリではなくソースから Neovim をビルド
--progress <TYPE> 進行状況出力タイプ: auto, plain, tty
例:
# 標準ビルド
dockim build
# ゼロからの強制再ビルド
dockim build --rebuild
# Docker キャッシュなしでビルド
dockim build --no-cache
# Neovim をソースからビルド
dockim build --neovim-from-source
# プレーン進行状況出力でビルド
dockim build --progress plain
ビルドプロセス:
.devcontainer/Dockerfileを読み込み- ビルド引数とコンテキストを処理
- 適切なオプションで Docker ビルドを実行
- コンテナ使用のためにイメージにタグ付け
dockim up
開発コンテナを開始します。
使用方法:
dockim up [OPTIONS]
オプション:
--rebuild 開始前にイメージを再ビルド
--detach, -d コンテナをバックグラウンドで実行
--remove-orphans compose ファイルにないサービスのコンテナを削除
例:
# コンテナを開始(必要に応じてビルド)
dockim up
# 再ビルドして開始
dockim up --rebuild
# バックグラウンドで開始
dockim up --detach
# 孤立したコンテナをクリーンアップ
dockim up --remove-orphans
起動プロセス:
- イメージが存在するかチェック(必要に応じてビルド)
- Docker Compose サービスを開始
- コンテナの準備完了を待機
- ポートフォワーディングを設定
dockim stop
実行中の開発コンテナを停止します。
使用方法:
dockim stop [OPTIONS]
オプション:
--timeout <SECONDS> 強制停止前の待機タイムアウト(デフォルト: 10)
--all すべての Dockim コンテナを停止
例:
# 現在のプロジェクトコンテナを停止
dockim stop
# カスタムタイムアウトで停止
dockim stop --timeout 30
# すべての Dockim コンテナを停止
dockim stop --all
停止プロセス:
- コンテナプロセスに SIGTERM を送信
- 正常終了を待機
- タイムアウト後に強制停止
- ポートフォワーディングをクリーンアップ
dockim down
開発コンテナを停止し削除します。
使用方法:
dockim down [OPTIONS]
オプション:
--volumes, -v 関連ボリュームを削除
--images 関連イメージを削除
--timeout <SECONDS> 強制削除前の待機タイムアウト
例:
# コンテナを削除(ボリュームとイメージは保持)
dockim down
# コンテナとボリュームを削除
dockim down --volumes
# コンテナ、ボリューム、イメージを削除
dockim down --volumes --images
# カスタムタイムアウトで削除
dockim down --timeout 30
削除プロセス:
- 実行中の場合はコンテナを停止
- コンテナを削除
- ボリュームを削除(指定時)
- イメージを削除(指定時)
- ポートフォワーディングをクリーンアップ
開発ツールコマンド
dockim neovim
リモート UI サポートで Neovim を起動します。
使用方法:
dockim neovim [OPTIONS] [FILES...]
dockim v [OPTIONS] [FILES...] # 短縮エイリアス
オプション:
--no-remote-ui コンテナ内で直接 Neovim を実行(リモート UI なし)
--host-port <PORT> リモート接続用ホストポートを指定
--server-port <PORT> Neovim サーバー用コンテナポートを指定
--wait 戻る前にエディタが閉じるのを待機
例:
# リモート UI で起動
dockim neovim
dockim v
# 特定ファイルを開く
dockim neovim src/main.rs README.md
# リモート UI なしで起動
dockim neovim --no-remote-ui
# カスタムホストポートを使用
dockim neovim --host-port 8080
# エディタが閉じるまで待機
dockim neovim --wait config.toml
リモート UI プロセス:
- 実行中でない場合はコンテナを開始
- コンテナ内で Neovim サーバーを起動
- ポートフォワーディングを設定
- ローカル Neovim クライアントを開始
- リモート接続を確立
dockim shell
コンテナ内で対話型シェルを開きます。
使用方法:
dockim shell [OPTIONS]
dockim sh [OPTIONS] # 短縮エイリアス
オプション:
--shell <SHELL> 特定シェルを使用(設定を上書き)
--user <USER> 特定ユーザーとして実行
--workdir <PATH> 作業ディレクトリを設定
例:
# デフォルトシェルを開く
dockim shell
dockim sh
# 特定シェルを使用
dockim shell --shell /bin/bash
# root ユーザーとして実行
dockim shell --user root
# 特定ディレクトリで開始
dockim shell --workdir /workspace/src
シェル選択優先度:
--shellコマンドオプション- グローバル設定
shell設定 - コンテナデフォルトシェル
- フォールバック
/bin/sh
dockim bash
コンテナ内で Bash シェルを開きます。
使用方法:
dockim bash [OPTIONS]
オプション:
--user <USER> 特定ユーザーとして実行
--workdir <PATH> 作業ディレクトリを設定
例:
# bash シェルを開く
dockim bash
# root として実行
dockim bash --user root
# 特定ディレクトリで開始
dockim bash --workdir /tmp
dockim exec
実行中のコンテナでコマンドを実行します。
使用方法:
dockim exec [OPTIONS] COMMAND [ARGS...]
オプション:
--interactive, -i STDIN を開いたままにする
--tty, -t 疑似 TTY を割り当て
--user <USER> 特定ユーザーとして実行
--workdir <PATH> 作業ディレクトリを設定
--env <KEY=VALUE> 環境変数を設定
例:
# 単純なコマンドを実行
dockim exec ls -la
# TTY 付きの対話型コマンド
dockim exec -it python
# 特定ユーザーとして実行
dockim exec --user root apt update
# 作業ディレクトリを設定
dockim exec --workdir /workspace npm test
# 環境変数を設定
dockim exec --env DEBUG=1 npm start
# 引数付きの複雑なコマンド
dockim exec git commit -m "Add new feature"
ネットワーク管理コマンド
dockim port
ホストとコンテナ間のポートフォワーディングを管理します。
使用方法:
dockim port <SUBCOMMAND> [OPTIONS]
dockim port add
ポートフォワーディングルールを追加します。
使用方法:
dockim port add [OPTIONS] <PORT_SPEC>...
ポート仕様:
3000 ホストポート 3000 → コンテナポート 3000
8080:3000 ホストポート 8080 → コンテナポート 3000
:3000 ホストポート自動割り当て → コンテナポート 3000
localhost:3000:3000 localhost のみにバインド
オプション:
--protocol <PROTO> ポートプロトコル: tcp(デフォルト), udp
--bind <IP> 特定 IP アドレスにバインド
例:
# 同じポートを転送
dockim port add 3000 8080 5432
# 異なるポートを転送
dockim port add 8080:3000 8081:3001
# ホストポートを自動割り当て
dockim port add :3000 :8080
# localhost のみにバインド
dockim port add localhost:3000:3000
# UDP ポート転送
dockim port add 1234 --protocol udp
# 特定 IP にバインド
dockim port add 3000:3000 --bind 192.168.1.100
dockim port ls
アクティブなポートフォワーディングルールを一覧表示します。
使用方法:
dockim port ls [OPTIONS]
オプション:
--format <FORMAT> 出力フォーマット: table(デフォルト), json, yaml
--filter <FILTER> 条件でポートをフィルター
例:
# すべてのアクティブポートを一覧表示
dockim port ls
# JSON 出力
dockim port ls --format json
# ポート番号でフィルター
dockim port ls --filter port=3000
# プロトコルでフィルター
dockim port ls --filter protocol=tcp
出力形式:
HOST PORT CONTAINER PORT PROTOCOL STATUS
3000 3000 tcp active
8080 3000 tcp active
5432 5432 tcp active
dockim port rm
ポートフォワーディングルールを削除します。
使用方法:
dockim port rm [OPTIONS] <PORT>...
オプション:
--all, -a すべてのポートフォワーディングを削除
--protocol <PROTO> 指定されたプロトコルポートのみ削除
例:
# 特定ポートを削除
dockim port rm 3000 8080
# すべてのポートフォワーディングを削除
dockim port rm --all
# TCP ポートのみ削除
dockim port rm --all --protocol tcp
コマンド終了コード
Dockim コマンドは標準終了コードを使用します:
0- 成功1- 一般エラー2- コマンドの誤用(無効な引数)125- Docker デーモンエラー126- コンテナコマンドが実行不可127- コンテナコマンドが見つからない130- ユーザーによるプロセス終了(Ctrl+C)
環境変数
コマンドは以下の環境変数を考慮します:
DOCKIM_CONFIG_DIR # 設定ディレクトリを上書き
DOCKIM_LOG_LEVEL # ログレベルを設定(debug, info, warn, error)
DOCKIM_NO_COLOR # カラー出力を無効化
DOCKER_HOST # Docker デーモン接続
COMPOSE_PROJECT_NAME # Docker Compose プロジェクト名
設定ファイル
コマンドは以下から設定を読み取る場合があります:
- コマンドラインオプション(最高優先度)
- 環境変数
- プロジェクト設定(
.devcontainer/devcontainer.json) - グローバル設定(
~/.config/dockim/config.toml) - 組み込みデフォルト(最低優先度)
ワークフロー別の例
新しいプロジェクトの開始
# プロジェクトを初期化
dockim init --template nodejs
# ビルドして開始
dockim build
dockim up
# エディタを開く
dockim neovim
# ポートフォワーディングを設定
dockim port add 3000 8080
日々の開発
# 開発環境を開始
dockim up
# テストを実行
dockim exec npm test
# 実行中でない場合はエディタを開く
dockim neovim src/app.js
# 実行中のサービスを確認
dockim port ls
# ビルドを実行
dockim exec npm run build
コンテナメンテナンス
# コンテナイメージを更新
dockim build --rebuild
# クリーン再起動
dockim down
dockim up
# すべてをクリーンアップ
dockim down --volumes --images
デバッグと検査
# コンテナステータスを確認
dockim exec ps aux
# ログを表示
dockim exec journalctl --follow
# ネットワーク診断
dockim exec netstat -tuln
dockim port ls
# 対話型デバッグ
dockim shell --user root
シェル補完
Dockim は bash、zsh、fish のシェル補完をサポートします:
# Bash
dockim completion bash > /etc/bash_completion.d/dockim
# Zsh
dockim completion zsh > "${fpath[1]}/_dockim"
# Fish
dockim completion fish > ~/.config/fish/completions/dockim.fish
次:複雑なシナリオ、カスタムセットアップ、統合パターンについては高度な使い方を探索しましょう。
高度な使い方
この章では、パワーユーザーと複雑な開発環境向けの高度なシナリオ、カスタム設定、統合パターンを探求します。
マルチコンテナアーキテクチャ
マイクロサービス開発
複数の相互接続されたサービスのセットアップ:
# .devcontainer/compose.yml
services:
dev:
build:
context: .
dockerfile: Dockerfile
volumes:
- ..:/workspace:cached
depends_on:
- api-gateway
- user-service
- order-service
- database
- redis
command: sleep infinity
api-gateway:
build: ./services/gateway
ports:
- "8080:8080"
environment:
- USER_SERVICE_URL=http://user-service:3001
- ORDER_SERVICE_URL=http://order-service:3002
depends_on:
- user-service
- order-service
user-service:
build: ./services/user
ports:
- "3001:3001"
environment:
- DATABASE_URL=postgres://postgres:dev@database:5432/users
depends_on:
- database
order-service:
build: ./services/order
ports:
- "3002:3002"
environment:
- DATABASE_URL=postgres://postgres:dev@database:5432/orders
- REDIS_URL=redis://redis:6379
depends_on:
- database
- redis
database:
image: postgres:15
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: dev
POSTGRES_MULTIPLE_DATABASES: users,orders
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
- ./scripts/init-databases.sh:/docker-entrypoint-initdb.d/init-databases.sh
redis:
image: redis:alpine
ports:
- "6379:6379"
volumes:
- redis_data:/data
volumes:
postgres_data:
redis_data:
サービスメッシュ統合
サービスメッシュ技術との統合:
# .devcontainer/compose.yml with Istio sidecar
services:
dev:
build: .
volumes:
- ..:/workspace:cached
network_mode: "service:istio-proxy"
depends_on:
- istio-proxy
istio-proxy:
image: istio/proxyv2:latest
environment:
- PILOT_CERT_PROVIDER=istiod
volumes:
- ./istio-config:/etc/istio/config
ports:
- "15000:15000" # Envoy admin
- "15001:15001" # Envoy outbound
カスタムベースイメージ
最適化されたイメージの作成
# .devcontainer/Dockerfile.base
FROM ubuntu:22.04 as base
# システム依存関係をインストール
RUN apt-get update && apt-get install -y \
curl \
git \
build-essential \
sudo \
&& rm -rf /var/lib/apt/lists/*
# 開発ユーザーを作成
ARG USERNAME=vscode
ARG USER_UID=1000
ARG USER_GID=$USER_UID
RUN groupadd --gid $USER_GID $USERNAME \
&& useradd --uid $USER_UID --gid $USER_GID -m $USERNAME \
&& echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \
&& chmod 0440 /etc/sudoers.d/$USERNAME
# 開発ステージ
FROM base as development
USER $USERNAME
# 開発ツールをインストール
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
RUN curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - \
&& sudo apt-get install -y nodejs
# グローバルパッケージをインストール
RUN npm install -g @vue/cli create-react-app typescript
RUN cargo install ripgrep fd-find
# 本番ステージ
FROM base as production
COPY --from=development /home/vscode/.cargo/bin /usr/local/bin
COPY --from=development /usr/bin/node /usr/bin/node
COPY --from=development /usr/bin/npm /usr/bin/npm
言語固有の最適化
Rust 開発コンテナ:
FROM mcr.microsoft.com/devcontainers/rust:latest
# 追加の Rust ツールをインストール
RUN rustup component add clippy rustfmt rust-analyzer
RUN cargo install cargo-watch cargo-edit cargo-audit
# Rust 環境を設定
ENV RUST_BACKTRACE=1
ENV CARGO_NET_GIT_FETCH_WITH_CLI=true
# 一般的な依存関係を事前コンパイル
RUN cargo install --list > /tmp/installed.txt
パフォーマンス最適化付き Node.js:
FROM node:18-bullseye
# パフォーマンス監視ツールをインストール
RUN npm install -g clinic autocannon
# 開発用に Node.js を設定
ENV NODE_ENV=development
ENV NODE_OPTIONS="--max-old-space-size=4096"
# pnpm と yarn をセットアップ
RUN npm install -g pnpm yarn
# npm 設定を最適化
RUN npm config set fund false
RUN npm config set audit-level moderate
CI/CD 統合
GitHub Actions
# .github/workflows/dev-container.yml
name: Dev Container CI
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
jobs:
test-dev-container:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Build and test in Dev Container
uses: devcontainers/ci@v0.3
with:
imageName: ghcr.io/${{ github.repository }}/devcontainer
cacheFrom: ghcr.io/${{ github.repository }}/devcontainer
push: always
runCmd: |
# 依存関係をインストール
npm ci
# テストを実行
npm run test:ci
# リンティングを実行
npm run lint
# アプリケーションをビルド
npm run build
integration-tests:
runs-on: ubuntu-latest
needs: test-dev-container
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Run integration tests
uses: devcontainers/ci@v0.3
with:
imageName: ghcr.io/${{ github.repository }}/devcontainer
runCmd: |
# サービスを開始
docker-compose -f .devcontainer/compose.yml up -d database redis
# サービスを待機
sleep 10
# 統合テストを実行
npm run test:integration
GitLab CI
# .gitlab-ci.yml
stages:
- build
- test
- deploy
variables:
CONTAINER_IMAGE: $CI_REGISTRY_IMAGE/devcontainer:$CI_COMMIT_SHA
build-dev-container:
stage: build
image: docker:latest
services:
- docker:dind
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
script:
- cd .devcontainer
- docker build -t $CONTAINER_IMAGE .
- docker push $CONTAINER_IMAGE
test-in-container:
stage: test
image: $CONTAINER_IMAGE
services:
- postgres:15
- redis:alpine
variables:
DATABASE_URL: postgres://postgres:postgres@postgres:5432/test
REDIS_URL: redis://redis:6379
script:
- npm ci
- npm run test
- npm run lint
- npm run build
カスタムツールチェーン
多言語開発
FROM mcr.microsoft.com/devcontainers/base:ubuntu
# 複数の言語ランタイムをインストール
RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash - \
&& apt-get install -y nodejs
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
ENV PATH="/root/.cargo/bin:${PATH}"
RUN curl -fsSL https://golang.org/dl/go1.21.0.linux-amd64.tar.gz | tar -C /usr/local -xzf -
ENV PATH="/usr/local/go/bin:${PATH}"
# Python(ベースイメージに含まれているが、最新版を確保)
RUN apt-get update && apt-get install -y \
python3 \
python3-pip \
python3-venv
# 言語横断ツールをインストール
RUN npm install -g @microsoft/rush
RUN pip3 install poetry
RUN cargo install cargo-make
パフォーマンス最適化
ビルドキャッシュ戦略
# キャッシュ付きマルチステージビルド
FROM node:18 as dependencies
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production && npm cache clean --force
FROM node:18 as dev-dependencies
WORKDIR /app
COPY package*.json ./
RUN npm ci && npm cache clean --force
FROM mcr.microsoft.com/devcontainers/javascript-node:18
WORKDIR /workspace
# 本番依存関係をコピー
COPY --from=dependencies /app/node_modules ./node_modules
# dev container 用の開発依存関係をコピー
COPY --from=dev-dependencies /app/node_modules ./dev_node_modules
ENV NODE_PATH=/workspace/dev_node_modules
ボリューム最適化
# compose.yml with optimized volumes
services:
dev:
volumes:
# 最適化された同期でソースコード
- ..:/workspace:cached
# 生成されたコンテンツ用の別ボリューム
- node_modules:/workspace/node_modules
- target:/workspace/target
- .next:/workspace/.next
# キャッシュディレクトリ
- ~/.npm:/root/.npm
- ~/.cargo:/root/.cargo
# 一時ディレクトリ
- /workspace/tmp
volumes:
node_modules:
target:
.next:
リソース管理
services:
dev:
deploy:
resources:
limits:
cpus: '4'
memory: 8G
reservations:
cpus: '2'
memory: 4G
# 開発用に最適化
environment:
- NODE_OPTIONS=--max-old-space-size=6144
- RUST_BACKTRACE=1
- CARGO_TARGET_DIR=/workspace/target
セキュリティ強化
ユーザー管理
# セキュアなユーザーセットアップ
ARG USERNAME=devuser
ARG USER_UID=1001
ARG USER_GID=1001
# 特定の UID/GID でユーザーを作成
RUN groupadd --gid $USER_GID $USERNAME \
&& useradd --uid $USER_UID --gid $USER_GID -m $USERNAME \
&& mkdir -p /etc/sudoers.d \
&& echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \
&& chmod 0440 /etc/sudoers.d/$USERNAME
# ホームディレクトリのパーミッションを設定
RUN chown -R $USER_UID:$USER_GID /home/$USERNAME
USER $USERNAME
シークレット管理
# compose.yml with secrets
services:
dev:
secrets:
- source: app_secret
target: /run/secrets/app_secret
uid: '1001'
gid: '1001'
mode: 0400
- source: db_password
target: /run/secrets/db_password
uid: '1001'
gid: '1001'
mode: 0400
secrets:
app_secret:
file: ./secrets/app_secret.txt
db_password:
external: true
ネットワークセキュリティ
services:
dev:
networks:
- development
database:
networks:
- development
# 内部ネットワークのみに公開
expose:
- "5432"
networks:
development:
driver: bridge
internal: true
監視と可観測性
コンテナメトリクス
# compose.yml with monitoring
services:
dev:
# メイン開発コンテナ
prometheus:
image: prom/prometheus:latest
ports:
- "9090:9090"
volumes:
- ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
volumes:
- grafana_data:/var/lib/grafana
cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
ports:
- "8080:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
volumes:
grafana_data:
アプリケーショントレーシング
# トレーシング機能を追加
FROM mcr.microsoft.com/devcontainers/javascript-node:18
# トレーシングツールをインストール
RUN npm install -g @opentelemetry/cli
RUN apt-get update && apt-get install -y \
curl \
netcat \
&& rm -rf /var/lib/apt/lists/*
# トレーシングを設定
ENV OTEL_EXPORTER_OTLP_ENDPOINT=http://jaeger:14268/api/traces
ENV OTEL_SERVICE_NAME=dev-container
データベース開発
複数データベースサポート
services:
dev:
depends_on:
- postgres
- mysql
- mongodb
- redis
postgres:
image: postgres:15
environment:
POSTGRES_USER: dev
POSTGRES_PASSWORD: dev
POSTGRES_DB: app_development
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
- ./db/postgres:/docker-entrypoint-initdb.d
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: dev
MYSQL_DATABASE: app_development
MYSQL_USER: dev
MYSQL_PASSWORD: dev
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
- ./db/mysql:/docker-entrypoint-initdb.d
mongodb:
image: mongo:6
environment:
MONGO_INITDB_ROOT_USERNAME: dev
MONGO_INITDB_ROOT_PASSWORD: dev
MONGO_INITDB_DATABASE: app_development
ports:
- "27017:27017"
volumes:
- mongo_data:/data/db
- ./db/mongodb:/docker-entrypoint-initdb.d
redis:
image: redis:alpine
ports:
- "6379:6379"
volumes:
- redis_data:/data
volumes:
postgres_data:
mysql_data:
mongo_data:
redis_data:
テスト環境
テスト分離
# compose.test.yml
services:
test:
build:
context: .
dockerfile: Dockerfile
target: test
depends_on:
- test-db
- test-redis
environment:
- NODE_ENV=test
- DATABASE_URL=postgres://test:test@test-db:5432/test
- REDIS_URL=redis://test-redis:6379
command: npm run test:ci
test-db:
image: postgres:15
environment:
POSTGRES_USER: test
POSTGRES_PASSWORD: test
POSTGRES_DB: test
tmpfs:
- /var/lib/postgresql/data
test-redis:
image: redis:alpine
command: redis-server --save ""
負荷テスト環境
services:
dev:
# あなたのアプリケーション
load-tester:
image: loadimpact/k6:latest
volumes:
- ./tests/load:/scripts
command: run /scripts/load-test.js
depends_on:
- dev
monitoring:
image: grafana/grafana:latest
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
ベストプラクティス要約
開発ワークフロー
- 最適化されたイメージにマルチステージビルドを使用
- 適切なキャッシュ戦略を実装
- 開発と本番の関心を分離
- 依存関係とツールをバージョン固定
- セットアップを徹底的にドキュメント化
セキュリティ
- 可能な限り非 root ユーザーとして実行
- 機密データにシークレット管理を使用
- サービスにネットワーク分離を実装
- ベースイメージの定期的なセキュリティ更新
- 依存関係を定期的に監査
パフォーマンス
- Docker レイヤーとビルドコンテキストを最適化
- 異なるデータに適切なボリューム タイプを使用
- リソース枯渇を防ぐためにリソース制限を実装
- 最適化機会のためにコンテナメトリクスを監視
- ビルドキャッシュを効果的に使用
次:トラブルシューティングで一般的な問題の診断と解決方法を学びましょう。
トラブルシューティング
この章では、一般的な問題の包括的な解決策、診断技術、Dockim ユーザーのための復旧手順を提供します。
一般的な診断アプローチ
Dockim で問題が発生した場合は、この体系的なアプローチに従ってください:
- システム状態を確認 - Docker と前提条件を検証
- ログを確認 - コンテナとアプリケーションログを調査
- 接続性をテスト - ネットワークとポート設定を検証
- リソースを確認 - CPU、メモリ、ディスク使用量を監視
- 設定を検証 - 設定とファイル内容を確認
インストール問題
Docker が見つからない
症状:
Error: docker command not found
解決方法:
# Docker がインストールされているかチェック
which docker
# Docker をインストール(Ubuntu/Debian)
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# Docker サービスを開始
sudo systemctl start docker
sudo systemctl enable docker
# ユーザーを docker グループに追加
sudo usermod -aG docker $USER
# ログアウトして再ログイン
Docker パーミッション問題
症状:
Error: permission denied while trying to connect to Docker daemon
解決方法:
# ユーザーを docker グループに追加
sudo usermod -aG docker $USER
# グループ変更を即座に適用
newgrp docker
# Docker アクセスを検証
docker version
Dev Container CLI がない
症状:
Error: devcontainer command not found
解決方法:
# Dev Container CLI をインストール
npm install -g @devcontainers/cli
# インストールを検証
devcontainer --version
# yarn での代替インストール
yarn global add @devcontainers/cli
コンテナビルド問題
ネットワークエラーでビルド失敗
症状:
Error: failed to solve: failed to fetch
解決方法:
# Docker を異なる DNS を使用するよう設定
sudo tee /etc/docker/daemon.json <<EOF
{
"dns": ["8.8.8.8", "8.8.4.4"]
}
EOF
# Docker を再起動
sudo systemctl restart docker
# ビルドを再試行
dockim build --no-cache
ビルドがハングまたはタイムアウト
症状:
- ビルドプロセスが停止しているように見える
- 長時間進行がない
解決方法:
# Docker ビルドタイムアウトを増加
export DOCKER_BUILDKIT_TIMEOUT=600
# デバッグ用にプレーン進行状況出力を使用
dockim build --progress plain
# より詳細な出力でビルド
dockim build --verbose
# ビルドキャッシュをクリア
docker builder prune -a
Dockerfile 構文エラー
症状:
Error: failed to solve: failed to read dockerfile
解決方法:
# Dockerfile 構文を検証
docker build -f .devcontainer/Dockerfile --dry-run .devcontainer
# よくある問題をチェック:
# - 命令後のスペースが不足(RUN、COPY など)
# - 不正なファイルパス
# - 無効なエスケープシーケンス
よくある Dockerfile 問題:
# 間違い - スペースが不足
RUN apt-get update &&apt-get install -y git
# 正しい
RUN apt-get update && apt-get install -y git
# 間違い - 不正なパス
COPY ./src /app/source
# ビルドコンテキストに対して ./src が実際に存在するかチェック
コンテナランタイム問題
コンテナが開始しない
症状:
Error: container exited with code 125
診断手順:
# コンテナログをチェック
docker logs $(docker ps -aq --filter "label=dockim")
# Docker デーモンログをチェック
sudo journalctl -u docker.service -f
# コンテナ設定を検証
docker inspect <container_name>
# 基本コマンドで開始を試行
docker run -it <image_name> /bin/bash
コンテナが開始するがすぐに終了
症状:
- コンテナが開始してすぐに停止
- 終了コード 0 またはその他
解決方法:
# メインプロセスが実行中かチェック
dockim exec ps aux
# コンテナコマンドを検証
# compose.yml で以下を確実に:
command: sleep infinity
# 不足している依存関係をチェック
dockim exec which bash
dockim exec which zsh
ポートバインディング失敗
症状:
Error: port is already allocated
Error: bind: address already in use
解決方法:
# ポートを使用しているものを検索
lsof -i :3000
netstat -tuln | grep 3000
# ポートを使用しているプロセスを終了
kill -9 <PID>
# 異なるポートを使用
dockim port add 3001:3000
# すべてのポートフォワーディングをチェック
dockim port ls
ネットワーク接続問題
ホストからアプリケーションにアクセスできない
症状:
- アプリケーションはコンテナで実行されているがホストからアクセスできない
- 接続拒否エラー
診断手順:
# アプリケーションが正しいインターフェースでリッスンしているかチェック
dockim exec netstat -tuln | grep :3000
# アプリケーションは 127.0.0.1 ではなく 0.0.0.0 にバインドすべき
# 間違い: app.listen(3000, '127.0.0.1')
# 正しい: app.listen(3000, '0.0.0.0')
# ポートフォワーディングがアクティブか検証
dockim port ls
# コンテナ内からの接続をテスト
dockim exec curl http://localhost:3000
# ホストからテスト
curl http://localhost:3000
コンテナ間通信問題
症状:
- サービスが互いに通信できない
- DNS 解決が失敗
解決方法:
# コンテナネットワークをチェック
docker network ls
docker network inspect <network_name>
# コンテナ間の DNS 解決をテスト
dockim exec nslookup database
dockim exec ping database
# サービスが同じネットワーク上にあるか検証
docker inspect <container_name> | grep NetworkMode
# compose.yml でサービス依存関係をチェック
depends_on:
- database
- redis
DNS 解決問題
症状:
Error: could not resolve hostname
解決方法:
# コンテナ内の DNS 設定をチェック
dockim exec cat /etc/resolv.conf
# compose.yml でカスタム DNS を設定
services:
dev:
dns:
- 8.8.8.8
- 8.8.4.4
# DNS 解決をテスト
dockim exec nslookup google.com
dockim exec dig google.com
Neovim 統合問題
リモート UI が接続しない
症状:
- Neovim サーバーが開始するがクライアントが接続できない
- 接続タイムアウト
診断手順:
# Neovim サーバーが実行中かチェック
dockim exec ps aux | grep nvim
# ポートフォワーディングを検証
dockim port ls | grep nvim
# ポートがアクセス可能かチェック
telnet localhost <port>
# 特定のポートでテスト
dockim neovim --host-port 8080
# ファイアウォール設定をチェック
sudo ufw status
Neovim サーバーがクラッシュ
症状:
- サーバーが開始してすぐに終了
- プラグインや設定に関するエラーメッセージ
解決方法:
# Neovim を直接実行してエラーメッセージを確認
dockim exec nvim --headless
# Neovim バージョンをチェック
dockim exec nvim --version
# Neovim 設定を一時的にリセット
dockim exec mv ~/.config/nvim ~/.config/nvim.bak
dockim exec mkdir ~/.config/nvim
# 最小設定でテスト
dockim exec nvim --clean
クリップボードが動作しない
症状:
- ホストとコンテナ間のコピー/ペーストが失敗
- クリップボード同期問題
解決方法:
# 設定でクリップボードサーバーを有効化
# ~/.config/dockim/config.toml
[remote]
use_clipboard_server = true
# クリップボードツールがインストールされているかチェック
dockim exec which xclip
dockim exec which pbcopy # macOS
# クリップボードツールをインストール(Linux)
dockim exec sudo apt-get install -y xclip
# クリップボード機能をテスト
echo "test" | dockim exec xclip -selection clipboard
パフォーマンス問題
ビルド時間が遅い
症状:
- ビルドが予想より大幅に長くかかる
- ビルド中の高 CPU/メモリ使用量
解決方法:
# Docker BuildKit を有効化
export DOCKER_BUILDKIT=1
# ビルドキャッシュを使用
dockim build --cache-from <previous_image>
# Dockerfile レイヤーの順序を最適化
# 頻繁に変更されるファイルを最後に置く
COPY package*.json ./
RUN npm ci
COPY . . # これは最後にすべき
# .dockerignore を使用
echo "node_modules/" > .dockerignore
echo ".git/" >> .dockerignore
echo "*.log" >> .dockerignore
ファイル同期が遅い
症状:
- ファイル変更がコンテナに反映されない
- ファイル操作中の高 CPU 使用量
解決方法:
# キャッシュボリュームを使用(macOS/Windows)
volumes:
- ..:/workspace:cached
# 書き込み重いオペレーション用に委譲ボリュームを使用
volumes:
- ..:/workspace:delegated
# 大きなディレクトリを同期から除外
volumes:
- ..:/workspace:cached
- /workspace/node_modules # 匿名ボリューム
- /workspace/target # Rust プロジェクト用
高メモリ使用量
症状:
- コンテナが過度のメモリを使用
- システムが応答しなくなる
解決方法:
# メモリ制限を設定
services:
dev:
deploy:
resources:
limits:
memory: 4G
reservations:
memory: 2G
# メモリ使用量を監視
docker stats
# アプリケーションでのメモリリークをチェック
dockim exec ps aux --sort=-%mem | head
ストレージとボリューム問題
ボリュームマウント失敗
症状:
Error: invalid mount config
Error: no such file or directory
解決方法:
# ソースパスが存在することを検証
ls -la /path/to/source
# 絶対パスを使用
volumes:
- $PWD:/workspace:cached # .:/workspace の代わり
# パーミッションをチェック
chmod 755 /path/to/source
sudo chown -R $USER:$USER /path/to/source
# Docker がディレクトリにアクセスできることを検証
# macOS: Docker Desktop > Settings > Resources > File Sharing
ディスク容量問題
症状:
Error: no space left on device
解決方法:
# ディスク使用量をチェック
df -h
docker system df
# Docker リソースをクリーンアップ
docker system prune -a
docker volume prune
docker image prune -a
# 未使用コンテナを削除
docker container prune
# 大きなログファイルをチェック
find /var/lib/docker -name "*.log" -size +100M
ボリュームのパーミッション問題
症状:
- コンテナで作成されたファイルの所有権が間違っている
- マウントされたボリュームに書き込みできない
解決方法:
# Dockerfile で正しいユーザーを設定
ARG USER_UID=1000
ARG USER_GID=1000
RUN usermod --uid $USER_UID --gid $USER_GID vscode
# ホストでパーミッションを修正
sudo chown -R $USER:$USER /path/to/project
# ユーザー名前空間リマッピングを使用
# /etc/docker/daemon.json
{
"userns-remap": "default"
}
設定問題
無効な設定ファイル
症状:
Error: invalid devcontainer.json
Error: yaml: invalid syntax
解決方法:
# JSON 構文を検証
cat .devcontainer/devcontainer.json | jq .
# YAML 構文を検証
yamllint .devcontainer/compose.yml
# オンラインバリデーターを使用:
# - JSON 用 jsonlint.com
# - YAML 用 yamllint.com
# よくある問題をチェック:
# - JSON でカンマが不足
# - YAML で不正なインデント
# - 特殊文字を持つ文字列が引用符なし
環境変数問題
症状:
- 環境変数がコンテナで利用できない
- 不正な値
解決方法:
# コンテナ内の環境変数をチェック
dockim exec printenv
# 環境ファイルの構文を検証
cat .env
# KEY=value (= の周りにスペースなし)
# 必要でない限り引用符なし
# 変数の優先度をチェック
# 1. コマンドラインオプション
# 2. 環境変数
# 3. .env ファイル
# 4. compose.yml environment セクション
# 5. Dockerfile ENV
# 特定の変数をデバッグ
dockim exec echo $NODE_ENV
dockim exec echo $DATABASE_URL
復旧手順
完全な環境リセット
すべてが失敗した場合は、新しく開始:
# すべてのコンテナを停止
dockim down --volumes
# すべてのコンテナとイメージを削除
docker system prune -a
# すべてのボリュームを削除
docker volume prune
# Dockim 設定を削除
rm -rf .devcontainer
# 再初期化
dockim init
dockim build
dockim up
バックアップと復元
重要なデータをバックアップ:
# コンテナデータをエクスポート
docker run --volumes-from <container> -v $(pwd):/backup ubuntu tar czf /backup/backup.tar.gz /data
# 設定をバックアップ
tar czf dockim-config-backup.tar.gz .devcontainer ~/.config/dockim
データを復元:
# コンテナデータを復元
docker run --volumes-from <container> -v $(pwd):/backup ubuntu bash -c "cd /data && tar xzf /backup/backup.tar.gz --strip 1"
# 設定を復元
tar xzf dockim-config-backup.tar.gz
緊急デバッグ
手動デバッグ用にコンテナにアクセス:
# コンテナ ID を取得
docker ps
# システムレベルのデバッグ用に root としてアクセス
docker exec -it --user root <container_id> bash
# システムプロセスをチェック
ps aux
# システムログをチェック
journalctl -xe
# ネットワーク設定をチェック
ip addr show
cat /etc/hosts
# マウントされたボリュームをチェック
mount | grep workspace
ヘルプの取得
診断情報の収集
ヘルプを求める際は、この情報を収集:
# システム情報
uname -a
docker version
dockim --version
# コンテナ状態
docker ps -a
docker images
# 最近のログ
docker logs <container_name> --tail 50
# 設定ファイル
cat .devcontainer/devcontainer.json
cat .devcontainer/compose.yml
# ネットワーク情報
docker network ls
dockim port ls
問題の報告
問題を報告する際は:
- 問題を明確に説明
- エラーメッセージを含める(全文)
- 問題を再現する手順を列挙
- 設定ファイルを共有(シークレットは除く)
- システム情報を提供
- 既に試したことを記載
コミュニティリソース
- GitHub Issues: バグとフィーチャーリクエストを報告
- Discussions: 質問をして体験を共有
- Documentation: 最新の更新と例をチェック
- Stack Overflow: 類似の問題を検索
次:コントリビューションで Dockim 開発への貢献方法を学びましょう。
コントリビューション
Dockim への貢献に興味を持っていただき、ありがとうございます!この章では、プロジェクトの改善に協力したい開発者向けの包括的なガイドラインを提供します。
貢献の方法
Dockim への貢献には多くの方法があります:
- GitHub Issues を通じて バグを報告 し、機能を提案する
- エラーを修正したり例を追加して ドキュメントを改善 する
- プルリクエストを通じて コードの改善を提出 する
- ディスカッションで 体験を共有 し、他のユーザーを支援する
- 新機能をテスト してフィードバックを提供する
- 一般的な開発環境用の テンプレートを作成 する
はじめに
開発環境のセットアップ
- GitHub で リポジトリをフォーク する
- フォークを ローカルマシンにクローン する:
git clone https://github.com/your-username/dockim.git
cd dockim
- 開発環境をセットアップ する:
# Rust をインストール(まだインストールしていない場合)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# 開発依存関係をインストール
cargo build
# すべてが動作することを確認するためにテストを実行
cargo test
- 貢献用の 新しいブランチを作成 する:
git checkout -b feature/your-feature-name
プロジェクト構造
プロジェクトレイアウトを理解すると、コードベースのナビゲートに役立ちます:
dockim/
├── src/
│ ├── commands/ # コマンド実装
│ ├── config/ # 設定管理
│ ├── container/ # コンテナ操作
│ ├── neovim/ # Neovim 統合
│ ├── port/ # ポートフォワーディングロジック
│ └── main.rs # CLI エントリーポイント
├── tests/
│ ├── integration/ # 統合テスト
│ └── unit/ # ユニットテスト
├── docs/ # ドキュメントソース
├── templates/ # プロジェクトテンプレート
└── examples/ # 使用例
開発ガイドライン
コードスタイル
Dockim は標準的な Rust 慣例に従います:
#![allow(unused)] fn main() { // 関数と変数には snake_case を使用 fn handle_container_operation() -> Result<()> { let container_name = "dev-container"; // ... } // 型と構造体には PascalCase を使用 struct ContainerConfig { name: String, ports: Vec<PortMapping>, } // 定数には SCREAMING_SNAKE_CASE を使用 const DEFAULT_TIMEOUT: Duration = Duration::from_secs(30); }
フォーマッティング:
# コミット前にコードをフォーマット
cargo fmt
# よくある問題をチェック
cargo clippy
テストの作成
すべての新機能には適切なテストを含める必要があります:
ユニットテスト:
#![allow(unused)] fn main() { #[cfg(test)] mod tests { use super::*; #[test] fn test_port_parsing() { let result = parse_port_spec("8080:3000").unwrap(); assert_eq!(result.host_port, 8080); assert_eq!(result.container_port, 3000); } #[test] fn test_invalid_port_spec() { let result = parse_port_spec("invalid"); assert!(result.is_err()); } } }
統合テスト:
#![allow(unused)] fn main() { // tests/integration/container_tests.rs use dockim::commands::container::*; use tempfile::TempDir; #[test] fn test_container_lifecycle() { let temp_dir = TempDir::new().unwrap(); let project_path = temp_dir.path(); // プロジェクトを初期化 init_project(project_path, &InitOptions::default()).unwrap(); // コンテナをビルド build_container(project_path, &BuildOptions::default()).unwrap(); // コンテナを開始 start_container(project_path, &StartOptions::default()).unwrap(); // コンテナが実行中であることを検証 assert!(is_container_running(project_path).unwrap()); // コンテナを停止 stop_container(project_path, &StopOptions::default()).unwrap(); } }
エラーハンドリング
Rust の Result 型を一貫して使用し、意味のあるエラーメッセージを提供します:
#![allow(unused)] fn main() { use anyhow::{Context, Result}; fn read_config_file(path: &Path) -> Result<Config> { let content = std::fs::read_to_string(path) .with_context(|| format!("設定ファイルの読み取りに失敗しました: {}", path.display()))?; let config = toml::from_str(&content) .with_context(|| "設定ファイルを TOML として解析できませんでした")?; Ok(config) } }
ドキュメンテーション
パブリック API を rustdoc でドキュメント化します:
#![allow(unused)] fn main() { /// ホストとコンテナ間のポートフォワーディングを管理する pub struct PortManager { forwards: Vec<PortForward>, } impl PortManager { /// 新しいポートマネージャーを作成する /// /// # 例 /// /// ``` /// use dockim::port::PortManager; /// /// let manager = PortManager::new(); /// ``` pub fn new() -> Self { Self { forwards: Vec::new(), } } /// 新しいポートフォワーディングルールを追加する /// /// # 引数 /// /// * `host_port` - ホストマシンのポート /// * `container_port` - コンテナ内のポート /// /// # エラー /// /// ポートが既に使用中の場合はエラーを返す pub fn add_forward(&mut self, host_port: u16, container_port: u16) -> Result<()> { // 実装 } } }
変更の提出
プルリクエストプロセス
- 単一の問題や機能に対応する 焦点を絞った PR を作成 する
- 変更を要約する 明確なタイトルを記載 する
- 以下を含む 詳細な説明を提供 する:
- これが解決する問題
- 変更をどのようにテストしたか
- 破壊的な変更があるかどうか
- 関連する Issue
PR テンプレートの例:
## 概要
ポートフォワーディングでカスタムポートバインディングアドレスのサポートを追加。
## 変更点
- `dockim port add` コマンドに `--bind` オプションを追加
- IP アドレス指定をサポートするようにポート設定を更新
- IP バインディング機能のテストを追加
## テスト
- IP アドレス付きポート解析のユニットテスト
- カスタム IP でのポートフォワーディングの統合テスト
- macOS と Linux での手動テスト
## 破壊的変更
なし - これは後方互換性のある追加です。
Fixes #123
コミットガイドライン
従来のコミット形式を使用します:
# 機能追加
git commit -m "feat: ポートフォワードにカスタム IP バインディングを追加"
# バグ修正
git commit -m "fix: コンテナ再起動時のポート競合を処理"
# ドキュメント更新
git commit -m "docs: 高度なポート設定の例を追加"
# コード改善
git commit -m "refactor: ポートマネージャーのエラーハンドリングを簡略化"
# テスト
git commit -m "test: ポート競合の統合テストを追加"
コードレビュープロセス
すべての貢献はコードレビューを経ます:
-
PR で 自動チェック が実行される(テスト、リンティング、フォーマッティング)
-
メンテナーによる 手動レビュー は以下に焦点を当てる:
- コードの正確性と安全性
- パフォーマンスへの影響
- API デザインの一貫性
- テストカバレッジ
- ドキュメントの完全性
-
以下によって フィードバックに対処 する:
- 要求された変更を行う
- アプローチが異なる場合は説明する
- エッジケースのテストを追加する
- ドキュメントを更新する
貢献の種類
バグレポート
バグを報告する際は、以下を含めてください:
環境情報:
OS: macOS 13.0
Docker: 24.0.5
Dockim: 0.2.1
Rust: 1.70.0
再現手順:
1. dockim init --template nodejs
2. dockim build
3. dockim up
4. dockim port add 3000
5. 期待される結果: ポートが正常に転送される
実際の結果: エラー: port already in use
最小限の例: バグを実証する可能な限り小さな例を提供してください。
機能リクエスト
新機能については、以下を記述してください:
- 使用例: これはどの問題を解決しますか?
- 提案されたソリューション: どのように動作すべきですか?
- 検討された代替案: この問題を解決する他の方法
- 追加のコンテキスト: 関連する背景
ドキュメント改善
ドキュメントへの貢献は常に歓迎されます:
- 誤字と文法の修正
- 不足している例の追加
- 混乱を招くセクションの明確化
- 他言語への翻訳
- チュートリアルとガイドの作成
開発ワークフロー
ローカルテスト
提出前に完全なテストスイートを実行します:
# ユニットテスト
cargo test
# 統合テスト
cargo test --test integration
# ドキュメントテスト
cargo test --doc
# Clippy リンティング
cargo clippy -- -D warnings
# フォーマットチェック
cargo fmt -- --check
実際のプロジェクトでのテスト
実際のプロジェクトで変更をテストします:
# 変更をビルド
cargo build --release
# ローカルビルドを使用
alias dockim-dev="$PWD/target/release/dockim"
# 異なるプロジェクトタイプでテスト
cd ~/projects/nodejs-app
dockim-dev init --template nodejs
dockim-dev build
dockim-dev up
パフォーマンステスト
パフォーマンスに敏感な変更の場合:
# 重要なパスをベンチマーク
cargo bench
# メモリ使用量をプロファイル
valgrind --tool=massif target/release/dockim build
# 操作時間の測定
time dockim build --no-cache
リリースプロセス
リリースプロセスを理解することで、貢献のタイミングを計ることができます:
バージョン番号
Dockim はセマンティックバージョニング (SemVer) を使用します:
- メジャー (x.0.0): 破壊的変更
- マイナー (0.x.0): 新機能、後方互換性あり
- パッチ (0.0.x): バグ修正、後方互換性あり
リリーススケジュール
- パッチリリース: 重要なバグに対して必要に応じて
- マイナーリリース: 新機能のために月次
- メジャーリリース: 重要な破壊的変更が蓄積された時
プレリリーステスト
リリース前に、以下をテストします:
- 複数のオペレーティングシステム(Linux、macOS、Windows)
- 異なる Docker バージョン
- 様々なプロジェクトテンプレート
- 人気のあるエディタとの統合
コミュニティガイドライン
行動規範
私たちは歓迎的で包括的な環境の提供にコミットしています:
- すべてのやり取りで 敬意を払う
- フィードバックを与える際は 建設的である
- 新しい貢献者に対して 忍耐強くある
- 問題解決において 協力的である
コミュニケーション
GitHub Issues: バグレポートと機能リクエスト用 GitHub Discussions: 質問と一般的なディスカッション用 プルリクエスト: コードの貢献用 ドキュメント: 使用方法の質問用
ヘルプの取得
貢献に関してヘルプが必要な場合:
- 同様の問題について 既存の Issues をチェック する
- ドキュメントを徹底的に読む
- ガイダンスについて ディスカッションで質問 する
- リアルタイムヘルプのために コミュニティチャンネルに参加 する
評価
私たちはすべての貢献を感謝し、貢献者を評価します:
- README の 貢献者リスト
- 各リリースの 変更ログでの謝辞
- 重要な貢献に対する 特別な評価
- 一貫した貢献者への メンテナー招待
ビルドとパッケージング
ローカル開発ビルド
# デバッグビルド(コンパイル高速化)
cargo build
# リリースビルド(最適化)
cargo build --release
# テスト用にローカルインストール
cargo install --path .
クロスプラットフォームビルド
# ターゲットプラットフォームを追加
rustup target add x86_64-unknown-linux-gnu
rustup target add x86_64-apple-darwin
rustup target add x86_64-pc-windows-gnu
# 特定のターゲット用にビルド
cargo build --release --target x86_64-unknown-linux-gnu
Docker 統合テスト
異なる Docker 設定でテストします:
# 異なる Docker バージョンでテスト
docker --version
# Docker Desktop vs Docker Engine でテスト
docker info | grep "Server Engine"
# 異なるベースイメージでテスト
dockim init --template nodejs # Node.js
dockim init --template python # Python
dockim init --template rust # Rust
Dockim への貢献をありがとうございます!あなたの努力により、すべての人にとってコンテナ化された開発がより良いものになります。貢献について質問がある場合は、遠慮なく GitHub Discussions でお尋ねください。
次:よくある質問の答えを FAQ で見つけましょう。
よくある質問 (FAQ)
この章では、インストール、設定、トラブルシューティング、使用シナリオをカバーする Dockim についてのよくある質問に答えます。
一般的な質問
Dockim とは何ですか?
Dockim は開発コンテナの作成と管理を簡単にするコマンドラインツールです。組み込み Neovim 統合、簡素化されたポート管理、合理化されたコンテナ操作などの拡張機能を備えた dev containers の代替インターフェースを提供します。
Dockim は他の dev container ツールとどう違いますか?
主な違い:
- ネイティブ Neovim 統合 とリモート UI サポート
- VS Code の Dev Containers 拡張機能と比べて 簡素化されたコマンドインターフェース
- 組み込みポート管理 システム
- VS Code を必要としない 直接的な CLI アクセス
- テンプレートベースのプロジェクト初期化
- ターミナルベース開発向けに最適化
Dockim は VS Code Dev Containers と互換性がありますか?
はい!Dockim は VS Code の Dev Containers 拡張機能と完全に互換性のある標準的な .devcontainer 設定ファイルを生成します。次のことができます:
- Dockim を使用してプロジェクトを初期化し、その後 VS Code で開く
- Dockim CLI と VS Code をシームレスに切り替える
- どちらのツールを使用してもチームメンバーとプロジェクトを共有する
インストールとセットアップ
システム要件は何ですか?
最小要件:
- Docker Engine 20.10+ または Docker Desktop
- Linux、macOS、または Windows(WSL2 付き)
- 4GB RAM(8GB+ 推奨)
- 10GB の空きディスク容量
Neovim 統合用:
- ホストシステムに Neovim 0.9+ がインストールされている
- トゥルーカラーサポートのターミナル
Dockim をインストールするにはどうすればよいですか?
リリースから:
# Linux/macOS
curl -sSL https://github.com/username/dockim/releases/latest/download/dockim-linux | sudo tee /usr/local/bin/dockim > /dev/null
sudo chmod +x /usr/local/bin/dockim
# または Homebrew を使用(macOS)
brew install dockim
ソースから:
git clone https://github.com/username/dockim.git
cd dockim
cargo build --release
sudo cp target/release/dockim /usr/local/bin/
"docker command not found" エラーが出ます。どうすればよいですか?
これは Docker がインストールされていないか、PATH にないことを意味します。最初に Docker をインストールしてください:
Ubuntu/Debian:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
# ログアウトして再ログイン
macOS:
brew install --cask docker
# または docker.com から Docker Desktop をダウンロード
Windows: docker.com から Docker Desktop をインストールし、WSL2 統合が有効になっていることを確認してください。
Docker で permission denied エラーが出ます。どう修正しますか?
ユーザーを docker グループに追加してください:
sudo usermod -aG docker $USER
newgrp docker # 即座に適用
一部のシステムでは、Docker サービスの再起動が必要な場合があります:
sudo systemctl restart docker
プロジェクトセットアップ
Dockim で新しいプロジェクトを開始するにはどうすればよいですか?
# プロジェクトディレクトリに移動
cd my-project
# デフォルトテンプレートで初期化
dockim init
# または特定のテンプレートを使用
dockim init --template nodejs
dockim init --template python
dockim init --template rust
どのようなテンプレートが利用できますか?
現在利用可能なテンプレート:
- default: 一般的なツール付きの基本 Ubuntu コンテナ
- nodejs: Node.js 開発環境
- python: Python 開発環境
- rust: Rust 開発環境
- go: Go 開発環境
生成された設定をカスタマイズできますか?
はい!dockim init を実行後、以下を編集できます:
.devcontainer/devcontainer.json- メインコンテナ設定.devcontainer/compose.yml- Docker Compose セットアップ.devcontainer/Dockerfile- カスタムイメージ定義
追加サービス(データベース、redis など)を追加するにはどうすればよいですか?
.devcontainer/compose.yml を編集してサービスを追加してください:
services:
dev:
# メイン開発コンテナ
depends_on:
- database
database:
image: postgres:15
environment:
POSTGRES_PASSWORD: dev
POSTGRES_DB: myapp
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
コンテナ管理
開発コンテナをビルドして開始するにはどうすればよいですか?
# コンテナイメージをビルド
dockim build
# コンテナを開始
dockim up
# または両ステップを組み合わせ
dockim up --rebuild
コンテナのビルドが失敗します。何をチェックすべきですか?
よくあるビルド問題:
- Docker デーモンが動作していない:
sudo systemctl start docker - ネットワーク接続: インターネット接続をチェック
- Dockerfile 構文エラー:
.devcontainer/Dockerfileを検証 - ディスク容量不足:
docker system pruneでクリーンアップ
デバッグ用に詳細出力を有効化:
dockim build --verbose
Dockerfile を変更後にコンテナを更新するにはどうすればよいですか?
# イメージを再ビルド
dockim build --rebuild
# コンテナを再起動
dockim down
dockim up
実行中のコンテナのシェルにアクセスするにはどうすればよいですか?
# デフォルトシェルを開く
dockim shell
# または短縮エイリアスを使用
dockim sh
# bash を特定して開く
dockim bash
# root ユーザーとして実行
dockim shell --user root
Neovim 統合
Dockim で Neovim を使用するにはどうすればよいですか?
# リモート UI で Neovim を開始(推奨)
dockim neovim
# または短縮エイリアスを使用
dockim v
# 特定のファイルを開く
dockim neovim src/main.rs config.toml
# コンテナ内で Neovim を直接実行(リモート UI なし)
dockim neovim --no-remote-ui
Neovim がコンテナに接続しません。何が間違っていますか?
よくある問題:
- ホストに Neovim がインストールされていない: Neovim 0.9+ をインストール
- ポート競合:
dockim port lsでチェックしてポートを解放 - ファイアウォールが接続をブロック: ファイアウォール設定をチェック
- コンテナが動作していない:
dockim upでコンテナが起動していることを確認
デバッグ手順:
# コンテナステータスをチェック
docker ps
# ポートフォワーディングをチェック
dockim port ls
# 手動接続をテスト
telnet localhost <neovim-port>
既存の Neovim 設定を使用できますか?
はい!ホストの Neovim 設定(~/.config/nvim)はボリュームマウントを通じてコンテナで自動的に利用可能です。リモート UI セットアップはすべてのプラグインと設定を保持します。
コンテナに追加の Neovim プラグインをインストールするにはどうすればよいですか?
プラグインはホストシステムにインストールされ、リモート接続を通じて動作します。ホストの Neovim 設定で通常どおり管理するだけです。
ポート管理
コンテナからポートを公開するにはどうすればよいですか?
# コンテナポート 3000 をホストポート 3000 に転送
dockim port add 3000
# コンテナポート 3000 をホストポート 8080 に転送
dockim port add 8080:3000
# Docker が空きホストポートを割り当てる
dockim port add :3000
# アクティブなポート転送を表示
dockim port ls
"port already in use" エラーが出ます。どう修正しますか?
# ポートを使用しているものを見つける
lsof -i :3000
netstat -tuln | grep 3000
# ポートを使用しているプロセスを終了
kill -9 <PID>
# または異なるポートを使用
dockim port add 8080:3000
ポート転送を削除するにはどうすればよいですか?
# 特定のポート転送を削除
dockim port rm 3000 8080
# すべてのポート転送を削除
dockim port rm --all
設定
Dockim の設定ファイルはどこに保存されますか?
グローバル設定:
- Linux/macOS:
~/.config/dockim/config.toml - Windows:
%APPDATA%\dockim\config.toml
プロジェクト設定:
.devcontainer/devcontainer.json.devcontainer/compose.yml.devcontainer/Dockerfile
デフォルトシェルを変更するにはどうすればよいですか?
グローバルに:
~/.config/dockim/config.toml を編集:
shell = "/bin/zsh"
コマンドごとに:
dockim shell --shell /bin/zsh
コンテナに環境変数を設定するにはどうすればよいですか?
compose.yml 内で:
services:
dev:
environment:
- NODE_ENV=development
- DATABASE_URL=postgres://localhost:5432/myapp
.env ファイルを使用:
.devcontainer/.env を作成:
NODE_ENV=development
DATABASE_URL=postgres://localhost:5432/myapp
異なるプロジェクトで異なる設定を使用できますか?
はい!各プロジェクトには独自の .devcontainer 設定があります。devcontainer.json でプロジェクトごとにグローバル設定を上書きすることもできます。
パフォーマンス
コンテナビルドが非常に遅いです。どうすれば高速化できますか?
- .dockerignore を使用 して不要なファイルを除外:
node_modules/
.git/
*.log
target/
- Docker BuildKit を有効化:
export DOCKER_BUILDKIT=1
- Dockerfile レイヤーの順序を最適化:
# 依存関係ファイルを最初にコピー(変更頻度が低い)
COPY package*.json ./
RUN npm ci
# ソースコードを最後にコピー(変更頻度が高い)
COPY . .
- ビルドキャッシュを使用:
dockim build --cache-from previous-image
IDE でのファイル変更がコンテナにすぐに表示されません。なぜですか?
これは通常ファイル同期の問題です:
- キャッシュボリューム使用(macOS/Windows):
volumes:
- ..:/workspace:cached
- 大きなディレクトリを除外:
volumes:
- ..:/workspace:cached
- /workspace/node_modules # 匿名ボリューム
- Linux でファイル権限をチェック:
ls -la .devcontainer
コンテナがメモリを使いすぎます。どう制限しますか?
compose.yml でメモリ制限を設定:
services:
dev:
deploy:
resources:
limits:
memory: 4G
reservations:
memory: 2G
トラブルシューティング
コンテナが開始しますがすぐに終了します。何が間違っていますか?
- コンテナログをチェック:
docker logs $(docker ps -aq --filter "label=dockim")
- コンテナコマンドを検証:
# compose.yml で以下を確実に:
command: sleep infinity
- 不足している依存関係をチェック:
dockim exec which bash
dockim exec which zsh
コンテナで実行中のアプリケーションにブラウザからアクセスできません。なぜですか?
- ポートフォワーディングをチェック:
dockim port ls
- アプリケーションが 127.0.0.1 ではなく 0.0.0.0 にバインドすることを確認:
// 間違い
app.listen(3000, '127.0.0.1');
// 正しい
app.listen(3000, '0.0.0.0');
- 接続性をテスト:
# コンテナ内から
dockim exec curl http://localhost:3000
# ホストから
curl http://localhost:3000
開発環境を完全にリセットするにはどうすればよいですか?
# コンテナ、ボリューム、イメージを停止し削除
dockim down --volumes --images
# 設定を削除
rm -rf .devcontainer
# 新規開始
dockim init
dockim build
dockim up
統合
Dockim を VS Code で使用できますか?
はい!Dockim は標準的な dev container 設定を生成します。次のことができます:
- Dockim でプロジェクトを初期化
- VS Code で開く
- VS Code が dev container 設定を自動的に検出
CI/CD パイプラインと統合するにはどうすればよいですか?
CI サービスで生成された dev container 設定を使用:
GitHub Actions:
- name: Build and test in Dev Container
uses: devcontainers/ci@v0.3
with:
imageName: ghcr.io/${{ github.repository }}/devcontainer
runCmd: |
npm ci
npm test
GitLab CI:
test:
image: docker:latest
services:
- docker:dind
script:
- cd .devcontainer && docker build -t test-container .
- docker run test-container npm test
Dockim はリモート開発(SSH)で動作しますか?
はい!SSH 経由でリモートサーバーで Dockim を使用できます。Neovim リモート UI はクライアントとサーバーを分離するため、このシナリオで特によく動作します。
高度な使い方
Dockim をマイクロサービス開発に使用できますか?
もちろん!compose.yml で複数のサービスをセットアップ:
services:
dev:
# メイン開発コンテナ
api-service:
build: ./services/api
ports:
- "3001:3001"
web-service:
build: ./services/web
ports:
- "3000:3000"
depends_on:
- api-service
コンテナ間でボリュームを共有するにはどうすればよいですか?
compose.yml で名前付きボリュームを使用:
services:
dev:
volumes:
- shared_data:/data
database:
volumes:
- shared_data:/var/lib/data
volumes:
shared_data:
カスタムベースイメージを使用できますか?
はい!カスタム Dockerfile を作成:
FROM your-custom-base:latest
# カスタマイゼーション
RUN apt-get update && apt-get install -y your-tools
USER vscode
ヘルプの取得
Dockim のヘルプはどこで得られますか?
- ドキュメント: この本を徹底的に読む
- GitHub Issues: バグレポートと機能リクエスト用
- GitHub Discussions: 質問とコミュニティサポート用
- Stack Overflow: 似た問題を検索(タグ:dockim)
効果的にバグを報告するにはどうすればよいですか?
以下の情報を含めてください:
- システム情報: OS、Docker バージョン、Dockim バージョン
- 問題を再現する手順
- 期待される動作 vs 実際の動作
- エラーメッセージ(完全なテキスト)
- 設定ファイル(シークレットを除く)
- 既に試したこと
Dockim に貢献するにはどうすればよいですか?
詳細なガイドラインについては コントリビューション 章を参照してください:
- バグの報告と機能提案
- コード改善への貢献
- ドキュメント改善
- 他のユーザーの支援
将来の機能のロードマップはありますか?
プロジェクトの GitHub リポジトリで以下をチェックしてください:
- マイルストーン: 計画されたリリースと機能
- Issues: リクエストされた機能とそのステータス
- Discussions: コミュニティのアイデアとフィードバック
- Projects: 開発計画ボード
ここで質問への答えが見つからない場合は、GitHub Discussions をチェックするか、Issue を作成してください。ユーザーフィードバックに基づいてこの FAQ を継続的に改善しています!