Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

はじめに

Dockim The Book へようこそ。これは、Dev Container 管理を革新するモダンな CLI ツール「Dockim」を習得するための包括的ガイドです。

Dockim とは?

Dockim は、Dev Container 管理のための直感的なコマンドと、シームレスな Neovim 統合を提供することで、開発ワークフローを簡素化・効率化するように設計された強力なコマンドラインツールです。コンテナ化された開発環境と生産的なコーディング体験の間の橋渡しを行います。

なぜ Dockim を使うのか?

現代のソフトウェア開発では、異なる開発環境間での一貫性を確保するため、コンテナ化された環境への依存が高まっています。しかし、これらのコンテナの管理はしばしば煩雑で時間のかかる作業となります。Dockim は以下の機能を提供することで、これらの課題を解決します:

🚀 簡素化されたコンテナ管理

  • dockim init によるワンコマンドでのコンテナ初期化
  • dockim builddockim up による簡単なビルドと起動
  • 直感的な停止とクリーンアップコマンド

📝 シームレスな Neovim 統合

  • コンテナ内でリモート UI サポート付きの Neovim を直接起動
  • リモート接続のための自動ポート管理
  • ホストとコンテナ間のクリップボード同期

🛠 開発者フレンドリーなワークフロー

  • クイックスタート用のプロジェクトテンプレート生成
  • 柔軟な設定オプション
  • ソースコンパイルを含むカスタムビルドサポート

🔧 本番対応の機能

  • 複雑なマルチサービス構成のサポート
  • 既存の Docker ワークフローとの統合
  • 包括的な設定管理

主要機能

Dockim は、開発体験を向上させるために設計された豊富な機能セットを提供します:

  • クイックコンテナ管理 - Dev Container の開始、停止、ビルドを簡単に実行
  • Neovim 統合 - リモート UI サポートと自動ポートフォワーディングで Neovim を起動
  • プロジェクト初期化 - 適切なデフォルト設定で Dev Container テンプレートを即座に生成
  • 柔軟な設定 - カスタムビルド、dotfiles 統合、ソースコンパイルをサポート
  • ポート管理 - 簡単なポートフォワーディングの設定と管理
  • 多言語サポート - コンテナで動作するあらゆる開発スタックに対応

Dockim の比較

従来の Docker 管理ツールや基本的な dev container CLI とは異なり、Dockim は特に開発者体験に焦点を当てています。Dev Container のパワーと Neovim のような現代的なエディタの生産性を組み合わせ、そのまま動作する統一されたワークフローを作成します。

機能従来の DockerDev Container CLIDockim
コンテナ管理✅ 複雑✅ 良好✅ 簡素化
エディタ統合❌ 手動設定❌ 限定的✅ ビルトイン
プロジェクトテンプレート❌ なし⚠️ 基本的✅ 包括的
設定⚠️ 冗長⚠️ JSON重め✅ ユーザーフレンドリー
ポート管理⚠️ 手動⚠️ 限定的✅ 自動

誰がこの本を使うべきか?

この本は以下のような方を対象としています:

  • 開発者 - コンテナ化された開発ワークフローを採用したい方
  • チーム - 開発環境を標準化したいグループ
  • Neovim ユーザー - シームレスなコンテナ統合を求める方
  • DevOps エンジニア - 開発者ツールを実装する方
  • すべての人 - 現代的な開発プラクティスに興味のある方

この本の使い方

この本は、完全な初心者から上級ユーザーまでのステップを踏むように構成されています:

  1. はじめよう - インストールと最初のプロジェクト
  2. ユーザーガイド - コアワークフローと日常的な使用方法
  3. 統合ガイド - Neovim の設定と高度な設定
  4. リファレンス - 完全なコマンドドキュメント
  5. 高度なトピック - カスタム設定とトラブルシューティング

各章は前の章の内容を基に構築されていますが、経験豊富なユーザーは必要に応じて特定のセクションに移動できます。

前提条件

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 ワークフローは以下のパターンに従います:

  1. 初期化 (dockim init) - プロジェクト構造のセットアップ
  2. ビルド (dockim build) - 開発環境の作成
  3. 開始 (dockim up) - コンテナの起動
  4. 開発 (dockim shell, dockim exec, dockim neovim) - 環境での作業
  5. 停止 (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 の基本を理解したので、以下のことができます:

よくある問題

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 は、グローバルな設定とプロジェクト固有の設定の両方を可能にする設定階層を使用します:

  1. グローバル設定 (~/.config/dockim/config.toml) - 個人のデフォルト
  2. プロジェクト設定 (.devcontainer/devcontainer.json) - プロジェクト固有の設定
  3. コマンドオプション - 特定の操作のランタイム上書き

一般的なワークフロー

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 の使用の特定の側面について詳しく学んでください:

  1. プロジェクトの初期化 - 新しいプロジェクトを効果的にセットアップする方法
  2. コンテナ管理 - コンテナのビルドと管理をマスターする
  3. 開発ワークフロー - 日々の開発ルーチンを最適化する

各セクションはこれらのコア概念を基に構築され、具体的なシナリオに対する実用的で実行可能なガイダンスを提供します。

プロジェクトの初期化

このセクションでは、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 内の Docker
  • github-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

このプロセス:

  1. .devcontainer/Dockerfile を読み込み
  2. ベースイメージをダウンロード
  3. 指定されたツールと依存関係をインストール
  4. 再利用可能なコンテナイメージを作成

ビルドオプション

ゼロから再ビルド:

# 既存のイメージを無視して完全に再ビルド
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つの動作モードを提供します:

  1. リモート UI モード(デフォルト) - Neovim はコンテナで実行され、UI はホストで実行
  2. ダイレクトモード - Neovim は完全にコンテナ内で実行

リモート UI モードが推奨されます。なぜなら、使い慣れたホスト環境とコンテナ化された開発ツールへのアクセスの両方の利点を提供するからです。

クイックスタート

基本的な使用方法

自動セットアップで Neovim を起動:

# リモート UI で Neovim を開始(推奨)
dockim neovim
# 短縮エイリアス
dockim v

# コンテナ内で直接開始(リモート UI なし)
dockim neovim --no-remote-ui

初回起動

初回起動時、Dockim は以下を実行します:

  1. コンテナが実行されていない場合は開始
  2. コンテナ内で Neovim サーバーを起動
  3. 接続用の利用可能なポートを検索
  4. ローカル Neovim クライアントを開始
  5. リモート接続を確立

リモート 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 ワークフロー:

  1. Dockim が dotfiles リポジトリをクローン
  2. 指定されたインストールコマンドを実行
  3. 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 は階層的な設定システムを使用します:

  1. グローバル設定 (~/.config/dockim/config.toml) - 個人のデフォルト
  2. プロジェクト設定 (.devcontainer/devcontainer.json) - プロジェクト固有の設定
  3. 環境変数 - ランタイム上書き
  4. コマンドラインオプション - 一時的な上書き

グローバル設定

グローバル設定の作成

デフォルト設定を生成:

# グローバル設定ファイルを作成
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

ビルドプロセス:

  1. .devcontainer/Dockerfile を読み込み
  2. ビルド引数とコンテキストを処理
  3. 適切なオプションで Docker ビルドを実行
  4. コンテナ使用のためにイメージにタグ付け

dockim up

開発コンテナを開始します。

使用方法:

dockim up [OPTIONS]

オプション:

--rebuild           開始前にイメージを再ビルド
--detach, -d        コンテナをバックグラウンドで実行
--remove-orphans    compose ファイルにないサービスのコンテナを削除

例:

# コンテナを開始(必要に応じてビルド)
dockim up

# 再ビルドして開始
dockim up --rebuild

# バックグラウンドで開始
dockim up --detach

# 孤立したコンテナをクリーンアップ
dockim up --remove-orphans

起動プロセス:

  1. イメージが存在するかチェック(必要に応じてビルド)
  2. Docker Compose サービスを開始
  3. コンテナの準備完了を待機
  4. ポートフォワーディングを設定

dockim stop

実行中の開発コンテナを停止します。

使用方法:

dockim stop [OPTIONS]

オプション:

--timeout <SECONDS> 強制停止前の待機タイムアウト(デフォルト: 10)
--all               すべての Dockim コンテナを停止

例:

# 現在のプロジェクトコンテナを停止
dockim stop

# カスタムタイムアウトで停止
dockim stop --timeout 30

# すべての Dockim コンテナを停止
dockim stop --all

停止プロセス:

  1. コンテナプロセスに SIGTERM を送信
  2. 正常終了を待機
  3. タイムアウト後に強制停止
  4. ポートフォワーディングをクリーンアップ

dockim down

開発コンテナを停止し削除します。

使用方法:

dockim down [OPTIONS]

オプション:

--volumes, -v       関連ボリュームを削除
--images            関連イメージを削除
--timeout <SECONDS> 強制削除前の待機タイムアウト

例:

# コンテナを削除(ボリュームとイメージは保持)
dockim down

# コンテナとボリュームを削除
dockim down --volumes

# コンテナ、ボリューム、イメージを削除
dockim down --volumes --images

# カスタムタイムアウトで削除
dockim down --timeout 30

削除プロセス:

  1. 実行中の場合はコンテナを停止
  2. コンテナを削除
  3. ボリュームを削除(指定時)
  4. イメージを削除(指定時)
  5. ポートフォワーディングをクリーンアップ

開発ツールコマンド

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 プロセス:

  1. 実行中でない場合はコンテナを開始
  2. コンテナ内で Neovim サーバーを起動
  3. ポートフォワーディングを設定
  4. ローカル Neovim クライアントを開始
  5. リモート接続を確立

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

シェル選択優先度:

  1. --shell コマンドオプション
  2. グローバル設定 shell 設定
  3. コンテナデフォルトシェル
  4. フォールバック /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 プロジェクト名

設定ファイル

コマンドは以下から設定を読み取る場合があります:

  1. コマンドラインオプション(最高優先度)
  2. 環境変数
  3. プロジェクト設定(.devcontainer/devcontainer.json
  4. グローバル設定(~/.config/dockim/config.toml
  5. 組み込みデフォルト(最低優先度)

ワークフロー別の例

新しいプロジェクトの開始

# プロジェクトを初期化
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

ベストプラクティス要約

開発ワークフロー

  1. 最適化されたイメージにマルチステージビルドを使用
  2. 適切なキャッシュ戦略を実装
  3. 開発と本番の関心を分離
  4. 依存関係とツールをバージョン固定
  5. セットアップを徹底的にドキュメント化

セキュリティ

  1. 可能な限り非 root ユーザーとして実行
  2. 機密データにシークレット管理を使用
  3. サービスにネットワーク分離を実装
  4. ベースイメージの定期的なセキュリティ更新
  5. 依存関係を定期的に監査

パフォーマンス

  1. Docker レイヤーとビルドコンテキストを最適化
  2. 異なるデータに適切なボリューム タイプを使用
  3. リソース枯渇を防ぐためにリソース制限を実装
  4. 最適化機会のためにコンテナメトリクスを監視
  5. ビルドキャッシュを効果的に使用

次:トラブルシューティングで一般的な問題の診断と解決方法を学びましょう。

トラブルシューティング

この章では、一般的な問題の包括的な解決策、診断技術、Dockim ユーザーのための復旧手順を提供します。

一般的な診断アプローチ

Dockim で問題が発生した場合は、この体系的なアプローチに従ってください:

  1. システム状態を確認 - Docker と前提条件を検証
  2. ログを確認 - コンテナとアプリケーションログを調査
  3. 接続性をテスト - ネットワークとポート設定を検証
  4. リソースを確認 - CPU、メモリ、ディスク使用量を監視
  5. 設定を検証 - 設定とファイル内容を確認

インストール問題

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

問題の報告

問題を報告する際は:

  1. 問題を明確に説明
  2. エラーメッセージを含める(全文)
  3. 問題を再現する手順を列挙
  4. 設定ファイルを共有(シークレットは除く)
  5. システム情報を提供
  6. 既に試したことを記載

コミュニティリソース

  • GitHub Issues: バグとフィーチャーリクエストを報告
  • Discussions: 質問をして体験を共有
  • Documentation: 最新の更新と例をチェック
  • Stack Overflow: 類似の問題を検索

次:コントリビューションで Dockim 開発への貢献方法を学びましょう。

コントリビューション

Dockim への貢献に興味を持っていただき、ありがとうございます!この章では、プロジェクトの改善に協力したい開発者向けの包括的なガイドラインを提供します。

貢献の方法

Dockim への貢献には多くの方法があります:

  • GitHub Issues を通じて バグを報告 し、機能を提案する
  • エラーを修正したり例を追加して ドキュメントを改善 する
  • プルリクエストを通じて コードの改善を提出 する
  • ディスカッションで 体験を共有 し、他のユーザーを支援する
  • 新機能をテスト してフィードバックを提供する
  • 一般的な開発環境用の テンプレートを作成 する

はじめに

開発環境のセットアップ

  1. GitHub で リポジトリをフォーク する
  2. フォークを ローカルマシンにクローン する:
git clone https://github.com/your-username/dockim.git
cd dockim
  1. 開発環境をセットアップ する:
# Rust をインストール(まだインストールしていない場合)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# 開発依存関係をインストール
cargo build

# すべてが動作することを確認するためにテストを実行
cargo test
  1. 貢献用の 新しいブランチを作成 する:
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<()> {
        // 実装
    }
}
}

変更の提出

プルリクエストプロセス

  1. 単一の問題や機能に対応する 焦点を絞った PR を作成 する
  2. 変更を要約する 明確なタイトルを記載 する
  3. 以下を含む 詳細な説明を提供 する:
    • これが解決する問題
    • 変更をどのようにテストしたか
    • 破壊的な変更があるかどうか
    • 関連する 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: ポート競合の統合テストを追加"

コードレビュープロセス

すべての貢献はコードレビューを経ます:

  1. PR で 自動チェック が実行される(テスト、リンティング、フォーマッティング)

  2. メンテナーによる 手動レビュー は以下に焦点を当てる:

    • コードの正確性と安全性
    • パフォーマンスへの影響
    • API デザインの一貫性
    • テストカバレッジ
    • ドキュメントの完全性
  3. 以下によって フィードバックに対処 する:

    • 要求された変更を行う
    • アプローチが異なる場合は説明する
    • エッジケースのテストを追加する
    • ドキュメントを更新する

貢献の種類

バグレポート

バグを報告する際は、以下を含めてください:

環境情報:

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: 質問と一般的なディスカッション用 プルリクエスト: コードの貢献用 ドキュメント: 使用方法の質問用

ヘルプの取得

貢献に関してヘルプが必要な場合:

  1. 同様の問題について 既存の Issues をチェック する
  2. ドキュメントを徹底的に読む
  3. ガイダンスについて ディスカッションで質問 する
  4. リアルタイムヘルプのために コミュニティチャンネルに参加 する

評価

私たちはすべての貢献を感謝し、貢献者を評価します:

  • 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

コンテナのビルドが失敗します。何をチェックすべきですか?

よくあるビルド問題:

  1. Docker デーモンが動作していない: sudo systemctl start docker
  2. ネットワーク接続: インターネット接続をチェック
  3. Dockerfile 構文エラー: .devcontainer/Dockerfile を検証
  4. ディスク容量不足: 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 がコンテナに接続しません。何が間違っていますか?

よくある問題:

  1. ホストに Neovim がインストールされていない: Neovim 0.9+ をインストール
  2. ポート競合: dockim port ls でチェックしてポートを解放
  3. ファイアウォールが接続をブロック: ファイアウォール設定をチェック
  4. コンテナが動作していない: 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 でプロジェクトごとにグローバル設定を上書きすることもできます。

パフォーマンス

コンテナビルドが非常に遅いです。どうすれば高速化できますか?

  1. .dockerignore を使用 して不要なファイルを除外:
node_modules/
.git/
*.log
target/
  1. Docker BuildKit を有効化
export DOCKER_BUILDKIT=1
  1. Dockerfile レイヤーの順序を最適化
# 依存関係ファイルを最初にコピー(変更頻度が低い)
COPY package*.json ./
RUN npm ci

# ソースコードを最後にコピー(変更頻度が高い)
COPY . .
  1. ビルドキャッシュを使用
dockim build --cache-from previous-image

IDE でのファイル変更がコンテナにすぐに表示されません。なぜですか?

これは通常ファイル同期の問題です:

  1. キャッシュボリューム使用(macOS/Windows):
volumes:
  - ..:/workspace:cached
  1. 大きなディレクトリを除外
volumes:
  - ..:/workspace:cached
  - /workspace/node_modules  # 匿名ボリューム
  1. Linux でファイル権限をチェック
ls -la .devcontainer

コンテナがメモリを使いすぎます。どう制限しますか?

compose.yml でメモリ制限を設定:

services:
  dev:
    deploy:
      resources:
        limits:
          memory: 4G
        reservations:
          memory: 2G

トラブルシューティング

コンテナが開始しますがすぐに終了します。何が間違っていますか?

  1. コンテナログをチェック
docker logs $(docker ps -aq --filter "label=dockim")
  1. コンテナコマンドを検証
# compose.yml で以下を確実に:
command: sleep infinity
  1. 不足している依存関係をチェック
dockim exec which bash
dockim exec which zsh

コンテナで実行中のアプリケーションにブラウザからアクセスできません。なぜですか?

  1. ポートフォワーディングをチェック
dockim port ls
  1. アプリケーションが 127.0.0.1 ではなく 0.0.0.0 にバインドすることを確認
// 間違い
app.listen(3000, '127.0.0.1');

// 正しい
app.listen(3000, '0.0.0.0');
  1. 接続性をテスト
# コンテナ内から
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 設定を生成します。次のことができます:

  1. Dockim でプロジェクトを初期化
  2. VS Code で開く
  3. 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 のヘルプはどこで得られますか?

  1. ドキュメント: この本を徹底的に読む
  2. GitHub Issues: バグレポートと機能リクエスト用
  3. GitHub Discussions: 質問とコミュニティサポート用
  4. Stack Overflow: 似た問題を検索(タグ:dockim)

効果的にバグを報告するにはどうすればよいですか?

以下の情報を含めてください:

  1. システム情報: OS、Docker バージョン、Dockim バージョン
  2. 問題を再現する手順
  3. 期待される動作 vs 実際の動作
  4. エラーメッセージ(完全なテキスト)
  5. 設定ファイル(シークレットを除く)
  6. 既に試したこと

Dockim に貢献するにはどうすればよいですか?

詳細なガイドラインについては コントリビューション 章を参照してください:

  • バグの報告と機能提案
  • コード改善への貢献
  • ドキュメント改善
  • 他のユーザーの支援

将来の機能のロードマップはありますか?

プロジェクトの GitHub リポジトリで以下をチェックしてください:

  • マイルストーン: 計画されたリリースと機能
  • Issues: リクエストされた機能とそのステータス
  • Discussions: コミュニティのアイデアとフィードバック
  • Projects: 開発計画ボード

ここで質問への答えが見つからない場合は、GitHub Discussions をチェックするか、Issue を作成してください。ユーザーフィードバックに基づいてこの FAQ を継続的に改善しています!