Dockerを使って自宅サーバ環境を構築する

複数のサーバー環境を必要としていても、Dockerを使用することで容易に、様々なバージョンのランタイムやライブラリがインストールされた環境を混在することができます。また、仮に環境が壊れてもすぐに作り直すことができます。

この記事では、Docker EngineとDocker ComposeプラグインをインストールしたUbuntu環境を使用しています。

systemdサービスへ登録

サーバーアプリケーションは通常、システム起動時に一緒に起動してくれたほうが、管理上の都合がよいです。 サービスの環境設定等はdocker-compose.yml に記載するため、逆にサービスファイルは単純にdocker compose updocker compose downを呼び出すだけで良いはずです。
そこでdocker-compose.yml毎にサービスファイルを記載するのではなく、docker composeを起動・終了する共通のサービスファイルを作成します。
例えば次のようなコードです。

[email protected]

[Unit]
Description=%i docker compose service
Requires=docker.service

[Service]
Type=simple

Environment=COMPOSE_FILE=/opt/docker-compose-service/%i/docker-compose.yml

ExecStartPre=/usr/bin/docker compose -f ${COMPOSE_FILE} down -v
ExecStart=/usr/bin/docker compose -f ${COMPOSE_FILE} up
ExecStop=/usr/bin/docker compose -f ${COMPOSE_FILE} down -v

[Install]
WantedBy=multi-user.target

dockerやdocker composeのインストール方法によって、各コマンドの/usr/bin/docker composeは変わります。
ここでは、永続データはホスト端末とのバインドマウントを使用する前提で、 起動前と終了時に名前付きボリュームや匿名ボリュームも削除することで、ゴミが残らないようにしています。

/opt/docker-compose-service/ディレクトリ上にサービス名のディレクトリを作成し、そこにアプリケーションを実行するdocker-compose.ymlファイルを置くようにします。

例えば軽量なセルフホストgitサーバである、giteaをセルフホストする場合は、/opt/docker-compose-service/gitea上にgitea用のサーバコンテナとDBコンテナを記述したdocker-compose.ymlを配置し、

# サービス起動
$ systemctl start [email protected]
# サービス登録
$ systemctl enable [email protected]

とすると起動・サービス登録ができます。

注意点として、systemctlを使用して起動した場合は、systemctl statusで状況やログを確認できますが、直接docker composeコマンドを使用して起動した場合は、確認できません。