はじめに:なぜDockerなのか?

ホームサーバーを運用していると、色々なプログラムをインストールしたくなります。メディアサーバー、ファイル同期、広告ブロック、パスワードマネージャー...しかし、プログラムを直接インストールすると様々な問題が発生します。依存関係の競合、アップデート時の設定の消失、別のサーバーへの移行時に最初から設定し直す手間などが代表的です。

Dockerはこれらの問題をきれいに解決してくれます。コンテナという隔離された環境でプログラムを実行するため、互いに影響を与えず、数行の設定ファイルで複雑なサービスをデプロイできます。この編では、Dockerの基本概念から実際に便利なサービスをデプロイする方法まで詳しく見ていきます。

1. Dockerとは何か?

1.1 コンテナの概念

コンテナとは、アプリケーションとその実行に必要なすべて(ライブラリ、設定ファイルなど)を一つのパッケージにまとめたものです。仮想マシンと似ているように見えますが、はるかに軽量で高速です。

  • 仮想マシン(VM):OS全体を含むため重く、起動に時間がかかります。
  • コンテナ:ホストOSのカーネルを共有するため軽量で、ほぼ即座に起動します。

簡単に例えると、仮想マシンは家全体をまるごと引っ越すようなもので、コンテナは必要な家具だけをコンテナボックスに入れて引っ越すようなものです。

1.2 Dockerの主要概念

  • イメージ(Image):コンテナを作成するためのテンプレートです。プログラムと必要な環境がすべて含まれています。
  • コンテナ(Container):イメージを実行したインスタンスです。実際に動いているプログラムと考えてください。
  • レジストリ(Registry):イメージを保存・配布するストレージです。Docker Hubが代表的です。
  • ボリューム(Volume):コンテナのデータを永続的に保存する領域です。

1.3 Dockerのメリット

  • 隔離性:各コンテナは独立した環境で実行され、互いに影響を与えません。
  • 移植性:一度作成したイメージはどこでも同じように実行できます。
  • 再現性:設定ファイルさえあれば、いつでも同じ環境を再現できます。
  • 効率性:仮想マシンよりはるかに少ないリソースを使用します。
  • エコシステム:数多くのイメージがDocker Hubで公開されており、すぐに使用できます。

2. Dockerのインストール

2.1 Ubuntu/Debianでのインストール

公式リポジトリを使用して最新バージョンのDockerをインストールします。

# 既存パッケージの削除
sudo apt remove docker docker-engine docker.io containerd runc

# 必要なパッケージのインストール
sudo apt update
sudo apt install ca-certificates curl gnupg lsb-release

# Docker GPGキーの追加
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# Dockerリポジトリの追加
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Dockerのインストール
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# サービス開始と自動起動設定
sudo systemctl start docker
sudo systemctl enable docker

2.2 現在のユーザーをdockerグループに追加

毎回sudoを入力しなくて済むように、現在のユーザーをdockerグループに追加します。

sudo usermod -aG docker $USER
# ログアウト後、再ログインすると反映されます

2.3 インストール確認

# Dockerバージョン確認
docker --version

# Docker Composeバージョン確認
docker compose version

# テストコンテナの実行
docker run hello-world

3. Docker基本コマンド

3.1 イメージ関連コマンド

# イメージのダウンロード
docker pull nginx

# ローカルイメージ一覧の確認
docker images

# イメージの削除
docker rmi nginx

# 使用していないイメージの整理
docker image prune

3.2 コンテナの実行(docker run)

docker runは最もよく使うコマンドです。主なオプションを見てみましょう。

# 基本実行
docker run nginx

# バックグラウンド実行(-d)
docker run -d nginx

# コンテナ名の指定(--name)
docker run -d --name my-nginx nginx

# ポートマッピング(-p ホストポート:コンテナポート)
docker run -d -p 8080:80 nginx

# ボリュームマウント(-v ホストパス:コンテナパス)
docker run -d -v /my/content:/usr/share/nginx/html nginx

# 環境変数設定(-e)
docker run -d -e MYSQL_ROOT_PASSWORD=secret mysql

# 再起動ポリシー設定(--restart)
docker run -d --restart unless-stopped nginx

# 複数オプションの組み合わせ
docker run -d \
  --name webserver \
  -p 80:80 \
  -v /var/www:/usr/share/nginx/html:ro \
  --restart unless-stopped \
  nginx

3.3 コンテナ管理(docker ps)

# 実行中のコンテナ一覧
docker ps

# すべてのコンテナ一覧(停止中も含む)
docker ps -a

# コンテナの停止
docker stop my-nginx

# コンテナの開始
docker start my-nginx

# コンテナの再起動
docker restart my-nginx

# コンテナの削除
docker rm my-nginx

# 実行中のコンテナを強制削除
docker rm -f my-nginx

# 停止中のコンテナをすべて削除
docker container prune

3.4 ログ確認(docker logs)

# ログ表示
docker logs my-nginx

# リアルタイムログ表示(-f: follow)
docker logs -f my-nginx

# 最後の100行のみ表示
docker logs --tail 100 my-nginx

# タイムスタンプ付き
docker logs -t my-nginx

3.5 コンテナ内部へのアクセス(docker exec)

# コンテナ内部でコマンド実行
docker exec my-nginx ls /etc/nginx

# コンテナシェルへ接続(-it: 対話型ターミナル)
docker exec -it my-nginx /bin/bash

# シェルがbashでない場合(Alpineなど)
docker exec -it my-nginx /bin/sh

4. Docker Composeの活用

4.1 Docker Composeとは?

Docker Composeは複数のコンテナを定義・管理するためのツールです。YAMLファイルにサービス構成を定義すると、一つのコマンドですべてのサービスを開始または停止できます。

4.2 docker-compose.ymlの基本構造

version: "3.8"

services:
  web:
    image: nginx:latest
    container_name: my-web
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html:ro
    restart: unless-stopped

  db:
    image: mariadb:latest
    container_name: my-db
    environment:
      - MYSQL_ROOT_PASSWORD=secretpassword
      - MYSQL_DATABASE=myapp
    volumes:
      - db_data:/var/lib/mysql
    restart: unless-stopped

volumes:
  db_data:

4.3 Docker Composeコマンド

# サービス開始(バックグラウンド)
docker compose up -d

# サービス停止とコンテナ削除
docker compose down

# サービス停止(コンテナ維持)
docker compose stop

# サービス再起動
docker compose restart

# ログ表示
docker compose logs -f

# 特定サービスのみ再起動
docker compose restart web

# イメージ更新後の再デプロイ
docker compose pull
docker compose up -d

4.4 実践例:WordPress + MariaDB

version: "3.8"

services:
  wordpress:
    image: wordpress:latest
    container_name: wordpress
    ports:
      - "8080:80"
    environment:
      - WORDPRESS_DB_HOST=db
      - WORDPRESS_DB_USER=wordpress
      - WORDPRESS_DB_PASSWORD=wordpress_password
      - WORDPRESS_DB_NAME=wordpress
    volumes:
      - wordpress_data:/var/www/html
    depends_on:
      - db
    restart: unless-stopped

  db:
    image: mariadb:latest
    container_name: wordpress-db
    environment:
      - MYSQL_ROOT_PASSWORD=root_password
      - MYSQL_DATABASE=wordpress
      - MYSQL_USER=wordpress
      - MYSQL_PASSWORD=wordpress_password
    volumes:
      - db_data:/var/lib/mysql
    restart: unless-stopped

volumes:
  wordpress_data:
  db_data:

5. PortainerでWeb GUI管理

5.1 Portainerの紹介

PortainerはDockerをWebブラウザで管理できるようにするツールです。コンテナの開始/停止、ログ確認、イメージ管理など、ほとんどの作業をGUIで行えるため、ターミナルに慣れていない方に特に便利です。

5.2 Portainerのインストール

# ボリューム作成
docker volume create portainer_data

# Portainer実行
docker run -d \
  -p 9443:9443 \
  --name portainer \
  --restart unless-stopped \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:latest

5.3 Portainer初期設定

  1. Webブラウザでhttps://サーバーIP:9443にアクセス
  2. 管理者アカウント作成(パスワード12文字以上)
  3. 「Get Started」または「Local」環境を選択
  4. ダッシュボードでコンテナ、イメージ、ボリュームなどを管理

5.4 Portainerの主な機能

  • コンテナ管理:開始、停止、再起動、削除、ログ確認
  • スタック(Stack):docker-composeファイルをWebで管理
  • イメージ管理:イメージのダウンロード、削除、ビルド
  • ボリューム管理:ボリュームの作成、削除、バックアップ
  • ネットワーク管理:Dockerネットワーク設定
  • テンプレート:事前定義されたアプリテンプレートで素早くデプロイ

6. 便利なDockerアプリ

6.1 Pi-hole:ネットワーク広告ブロック

Pi-holeはDNSレベルで広告をブロックするサービスです。一度設定すれば、ネットワークに接続されたすべてのデバイスで広告がブロックされます。

version: "3.8"

services:
  pihole:
    container_name: pihole
    image: pihole/pihole:latest
    ports:
      - "53:53/tcp"
      - "53:53/udp"
      - "80:80/tcp"
    environment:
      TZ: 'Asia/Tokyo'
      WEBPASSWORD: 'your_password_here'
    volumes:
      - './etc-pihole:/etc/pihole'
      - './etc-dnsmasq.d:/etc/dnsmasq.d'
    restart: unless-stopped

インストール後、ルーターのDNSサーバーをPi-holeサーバーのIPに変更すると、ネットワーク全体に適用されます。

6.2 Nginx Proxy Manager:リバースプロキシ

Nginx Proxy Managerは複数のサービスにドメインを接続し、SSL証明書を自動管理してくれるツールです。

version: "3.8"

services:
  npm:
    image: 'jc21/nginx-proxy-manager:latest'
    container_name: nginx-proxy-manager
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    restart: unless-stopped

初期ログイン情報:Email admin@example.com、Password changeme

6.3 Homepage:ホームサーバーダッシュボード

Homepageはホームサーバーのすべてのサービスを一目で見れるダッシュボードです。きれいなデザインと様々なサービスウィジェットを提供します。

version: "3.8"

services:
  homepage:
    image: ghcr.io/gethomepage/homepage:latest
    container_name: homepage
    ports:
      - 3000:3000
    volumes:
      - ./config:/app/config
      - /var/run/docker.sock:/var/run/docker.sock:ro
    restart: unless-stopped

6.4 Uptime Kuma:サービス監視

Uptime KumaはWebサイト、サービス、ポートなどの稼働状態を監視し、通知を送ってくれるツールです。

version: "3.8"

services:
  uptime-kuma:
    image: louislam/uptime-kuma:latest
    container_name: uptime-kuma
    ports:
      - "3001:3001"
    volumes:
      - ./data:/app/data
    restart: unless-stopped

ダウンタイム発生時にTelegram、Discord、メールなどで通知を受け取れます。

6.5 Vaultwarden:パスワードマネージャー

VaultwardenはBitwarden互換のパスワードマネージャーです。公式Bitwardenサーバーよりはるかに軽量で、セルフホスティングに最適化されています。

version: "3.8"

services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    ports:
      - "8000:80"
    environment:
      - SIGNUPS_ALLOWED=true
      - ADMIN_TOKEN=your_random_admin_token
    volumes:
      - ./data:/data
    restart: unless-stopped

HTTPSなしではセキュリティ上危険なので、必ずリバースプロキシ経由でSSLを適用してください。

7. データバックアップとボリューム管理

7.1 ボリュームの種類

  • Named Volume:Dockerが管理するボリューム。docker volume createで作成
  • Bind Mount:ホストの特定パスをコンテナにマウント

一般的に設定ファイルやバックアップが必要なデータはBind Mountを使う方が管理しやすいです。

7.2 ボリューム管理コマンド

# ボリューム一覧確認
docker volume ls

# ボリューム詳細情報
docker volume inspect volume_name

# ボリューム削除
docker volume rm volume_name

# 使用していないボリュームの整理
docker volume prune

7.3 データバックアップ戦略

方法1:Bind Mountディレクトリの直接バックアップ

# サービス停止後バックアップ
docker compose stop
tar -czvf backup_$(date +%Y%m%d).tar.gz ./data
docker compose start

方法2:実行中のコンテナからバックアップ

# MySQL/MariaDBバックアップ
docker exec my-db mysqldump -u root -p'password' --all-databases > backup.sql

# PostgreSQLバックアップ
docker exec my-postgres pg_dumpall -U postgres > backup.sql

方法3:Named Volumeバックアップ

# 一時コンテナでボリューム内容をバックアップ
docker run --rm \
  -v volume_name:/source:ro \
  -v $(pwd):/backup \
  alpine tar -czvf /backup/volume_backup.tar.gz -C /source .

7.4 自動バックアップスクリプト

#!/bin/bash
# backup.sh

BACKUP_DIR="/backup/docker"
DATE=$(date +%Y%m%d_%H%M%S)

# バックアップディレクトリ作成
mkdir -p $BACKUP_DIR

# 各サービスデータのバックアップ
for dir in /opt/docker/*/; do
    service=$(basename $dir)
    tar -czvf "$BACKUP_DIR/${service}_${DATE}.tar.gz" -C $dir .
done

# 30日以上経過したバックアップを削除
find $BACKUP_DIR -type f -mtime +30 -delete

echo "Backup completed: $DATE"

crontabに登録して自動実行できます。

# 毎日深夜3時にバックアップ
0 3 * * * /opt/scripts/backup.sh >> /var/log/docker-backup.log 2>&1

8. Dockerトラブルシューティング

8.1 よくある問題

ポートが既に使用中の場合

# ポートを使用中のプロセス確認
sudo lsof -i :80
# またはdocker-compose.ymlで別のポートに変更

権限問題でボリュームにアクセスできない場合

# ホストディレクトリの権限確認
ls -la ./data
# 権限変更
sudo chown -R 1000:1000 ./data

コンテナが再起動を繰り返す場合

# ログ確認
docker logs container_name
# 再起動ポリシー変更
docker update --restart no container_name

8.2 ディスク領域の整理

# Dockerが使用しているディスク容量確認
docker system df

# 使用していないものをすべて整理(注意!)
docker system prune -a

# ボリュームを除いて整理
docker system prune

まとめ

今回はDockerの基本概念から実際の活用まで幅広く扱いました。Dockerをマスターすると、ホームサーバーの運用が本当に楽になります。新しいサービスをインストールする際、依存関係を気にせずdocker-composeファイル一つで完了でき、問題が発生したらコンテナを削除して再起動するだけです。

最初はコマンドが慣れないかもしれませんが、PortainerのようなGUIツールを併用すると、ずっと簡単に適応できます。この記事で紹介したサービスから一つずつインストールしながら、Dockerに慣れていくことをお勧めします。

次の編では、ホームサーバーのセキュリティを強化する方法について見ていきます。ファイアウォール設定、VPN構築、侵入検知など、安全なホームサーバー運用のための必須知識を扱う予定です。