EC2 インスタンスを開始するたびに指定のコンテナを自動で起動する
前回、nginx + Ruby on Rails + Postgresql を 1台の EC2 で動かす環境構築を行いました。
検証用途のサーバーなので、基本的にサーバーに触れていない時間はインスタンスを停止しておいています。
Docker で環境を構築しているので、インスタンス開始後にインスタンスに SSH で接続してdocker compose up
する必要があります。
サーバー側を検証する分には問題ないのですが、EC2 上で稼働している API サーバーの API 呼び出しのクライアント側の実装をしたりしたい場合には、ちょっと面倒です。
なので今回は、インスタンスを開始したら、自動で指定の compose.yml
で docker compose up
するスクリプトを実行してくれる設定を行っていきます。
流れ
- インスタンス開始時に Docker デーモンを起動するようにする
- compose ファイルに
restart:always
を追加する - compose up しなおしてから、EC2 を再起動してみる
インスタンス開始時に Docker デーモンを起動するようにする
EC2 マシン上で、下記コマンドを実行します。
sudo systemctl status docker
systemd 上で、Docker が有効になっているかどうかを確認します。
docker.service; enabled
と書かれていれば OK です。
確認できなかった場合は、下記を実行します。
sudo systemctl enable docker
systemd 上で、Docker が有効になったことで、インスタンス開始時に Docker デーモンが自動で起動され、Docker コマンドが以降で利用可能になります。
restart:always
を追加する
compose ファイルの各 service に compose ファイルの各サービスに restart:always
を追加します。
ex.) compose.yml
version: '3'
services:
web:
image: rails-ec2-verification-web:latest
restart: always
volumes:
- 略
コンテナが停止すると常に再起動するオプションです。
Docker デーモンが再起動された際にコンテナが再起動されます。手動で停止した場合は、再起動されません。
compose up しなおしてから、EC2 を再起動してみる
設定を追加したので立ち上げなおしておきます
docker compose up -d
その後、EC2 インスタンスを再起動してみて、Docker コンテナが立ち上がっていれば OK です。
今回は Rails コンテナを立ち上げていたので、EC2 のパブリック v4 DNS にアクセスして、Rails の初期画面が表示されることを確認しました。
参考
Discussion