ローカルネットワークでDockerサーバーを常時稼働させる方法
ローカルネットワークでDockerサーバーを常時稼働させる方法をまとめました。
1. はじめに
自宅や社内のローカルネットワークで、サーバーを常時稼働させたい場面があります。Dockerを利用すると、アプリケーションと必要なライブラリをコンテナとしてまとめて管理できます。
ただし、単にコンテナを起動しただけでは、PCの再起動やコンテナの異常終了後にサービスが停止したままになることがあります。
常駐サーバーとして運用するには、次の点を考える必要があります。
・Dockerとコンテナの自動起動
・IPアドレスの固定
・データの永続化
・障害時の再起動
・ログ容量の制限
・停電後の自動復旧
2. Dockerサーバーを構築する
ローカルネットワークでは、Linuxマシン上でDocker EngineとDocker Composeを動かす構成が一般的です。
開発中の一時的なサーバーであれば、MacやWindowsのDocker Desktopでも動かせます。一方、無人で長期間稼働させる場合は、Linux環境へDocker Engineを直接インストールする方が、起動処理や障害対応を単純化できます。
複数のコンテナをまとめて管理する場合は、Docker Composeを利用します。コンテナ、ネットワーク、ボリューム、環境変数などの設定をcompose.yamlへまとめて記述できます。
次のコマンドでバックグラウンド起動します。-dを指定すると、ターミナルを閉じてもコンテナは動作し続けます。
docker compose up -d状態とログは、次のコマンドで確認できます。
docker compose ps
docker compose logs -f一時的に停止する場合は、次のコマンドを使用します。
docker compose stop3. PC再起動後に自動復旧させる
Dockerサーバーを常駐させるには、Docker Engineとコンテナの両方を自動起動させます。
3-1. コンテナのrestartポリシー
PCやDocker Engineの再起動後にコンテナを自動起動するには、Composeファイルの各サービスにrestartを設定します。
restart: unless-stopped主なrestartポリシーは次のとおりです。
・restart: "no"
自動再起動しません。
・restart: on-failure
終了コードが0以外の場合だけ再起動します。Docker EngineやPCの再起動後にコンテナを自動起動する用途には向きません。
・restart: always
コンテナが停止すると自動再起動します。手動で停止した場合はその場では再起動しませんが、Docker Engineが再起動すると再び起動します。
・restart: unless-stopped
基本は自動再起動しますが、手動停止後は停止状態を維持します。
ローカルサーバーでは、必要に応じて手動停止できるunless-stoppedが扱いやすい設定です。
3-2. Docker Engineの自動起動
Ubuntuでは、Docker Engineはsystemdのサービスとして動作します。
自動起動を有効にするには、次のコマンドを実行します。
sudo systemctl enable --now docker状態は次のコマンドで確認できます。
sudo systemctl status dockerこれにより、PCの再起動後は次の順番でサービスが復旧します。
・PC起動
↓
・systemdがDocker Engineを起動
↓
・Dockerがrestartポリシーを確認
↓
・対象コンテナを自動起動
単純な常駐運用であれば、Composeファイルのrestart設定とDocker Engineの自動起動で十分です。
3-3. 停電後にPCを自動起動する
停電後に自動復旧させるには、BIOSまたはUEFIで電源復旧時の動作を設定します。この設定を有効にすると、停電によって電源が切れたPCでも、給電が戻った際に自動起動できます。
設定名は機種によって異なります。
・Restore on AC Power Loss
・Power On After Power Failure
・AC Back
・State After G3
設定値は、Power OnまたはLast Stateを選択します。Power Onにすると、停電前の状態にかかわらず、電源が復旧した際にPCが自動起動します。Last Stateにすると、停電前にPCが起動していた場合のみ自動起動します。
なお、通常の操作でPCをシャットダウンした場合は、電源が供給されたままなので、この設定による自動起動は行われません。
4. ローカルネットワークから接続する
4-1. IPアドレスを固定する
Dockerサーバーへ別のPCからアクセスするには、サーバーのIPアドレスを指定します。
サーバーが192.168.1.50、公開ポートが8080の場合は、次のアドレスへアクセスします。
http://192.168.1.50:8080DHCPによる自動割り当てでは、ルーターやPCの再起動後にIPアドレスが変わる可能性があります。
一般的には、ルーターのDHCP予約機能を利用します。
サーバーのMACアドレス
↓
192.168.1.50を常に割り当てる
ルーターによっては、次のような名前が使われます。
・DHCP予約
・固定DHCP
・静的リース
・アドレス予約
Linux側で静的IPアドレスを設定することもできますが、ルーター側で管理する方が設定を一元化できます。
4-2. ポートを公開する
Dockerコンテナは、初期状態では外部のPCから直接アクセスできません。ローカルネットワーク上の別のPCからWebアプリへ接続するには、コンテナのポートをDockerサーバー側へ公開します。
Composeファイルでは、portsでホスト側とコンテナ側のポートを対応させます。左側がホスト側、右側がコンテナ側のポートです。
ports:
- "8080:8080"この指定では、Dockerサーバーの8080番ポートへの通信が、コンテナの8080番ポートへ転送されます。
アプリケーション側も、コンテナ外から接続できるアドレスで待ち受ける必要があります。例えば、Uvicornでは次のように0.0.0.0を指定します。
uvicorn main:app --host 0.0.0.0 --port 8080データベースなど、別のPCから直接接続する必要がないサービスには、portsを設定しない方が安全です。
4-3. ファイアウォールを設定する
ローカルネットワーク内だけで利用する場合でも、必要のないポートは公開しない方が安全です。
UbuntuのUFWでは、SSHなど、ホスト上で直接待ち受けるサービスへの接続元を制限できます。
sudo ufw allow from 192.168.1.0/24 to any port 22 proto tcpただし、Dockerで公開したコンテナのポートは、通常のUFWルールを迂回する場合があります。そのため、次の設定だけでDockerの8080番ポートをLAN内に制限できるとは限りません。
sudo ufw allow from 192.168.1.0/24 to any port 8080 proto tcpDockerコンテナへの通信を厳密に制限する場合は、DockerのDOCKER-USERチェーンなどを利用した追加設定が必要です。
5. データを保護して安定運用する
5-1. データを永続化する
コンテナ内へ直接保存したデータは、コンテナを削除して作り直すと失われる可能性があります。
データベースやアップロードファイルは、Docker Volumeまたはホスト側ディレクトリへ保存します。
Docker Volumeを使う例は次のとおりです。
services:
db:
image: postgres:17
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: change-me
POSTGRES_DB: app
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:ホスト側ディレクトリを使う場合は次のように指定します。
services:
app:
image: example/my-app
volumes:
- ./data:/app/dataDocker VolumeはDockerが保存場所を管理します。
ホスト側ディレクトリはファイルを直接確認しやすい一方で、所有者やアクセス権限の管理が必要です。
重要なデータは、ボリュームへ保存するだけでなく、別のストレージへ定期的にバックアップします。
5-2. 起動順序とヘルスチェック
Webアプリとデータベースを同時に起動すると、データベースの準備が完了する前にWebアプリが接続を始める場合があります。
depends_onとhealthcheckを組み合わせると、サービスの準備完了を待ってから依存するサービスを起動できます。
services:
app:
depends_on:
db:
condition: service_healthy
db:
healthcheck:
test: ["CMD-SHELL", "pg_isready -U app -d app"]
interval: 10s
timeout: 5s
retries: 5
start_period: 20s
ただし、ネットワークやデータベースが一時的に停止することもあるため、アプリケーション側にも再接続処理を持たせる方が安全です。
5-3. ログ容量を制限する
Dockerの標準設定では、コンテナの標準出力がログファイルとして保存されます。長期間運用するとログが増え続け、ディスク容量を圧迫する可能性があります。
Composeでは、次のようにログ容量を制限できます。
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"この例では、ログ1ファイルを最大10MB、保存数を3ファイルに制限します。
設定変更後は、コンテナを再作成します。
docker compose up -d --force-recreate