😸

EC2 インスタンスを開始するたびに指定のコンテナを自動で起動する

2024/01/26に公開

前回、nginx + Ruby on Rails + Postgresql を 1台の EC2 で動かす環境構築を行いました。

https://zenn.dev/ndjndj/articles/9ab0f2ff5756aa

検証用途のサーバーなので、基本的にサーバーに触れていない時間はインスタンスを停止しておいています。
Docker で環境を構築しているので、インスタンス開始後にインスタンスに SSH で接続してdocker compose up する必要があります。

サーバー側を検証する分には問題ないのですが、EC2 上で稼働している API サーバーの API 呼び出しのクライアント側の実装をしたりしたい場合には、ちょっと面倒です。
なので今回は、インスタンスを開始したら、自動で指定の compose.ymldocker 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 コマンドが以降で利用可能になります。

compose ファイルの各 service に restart:always を追加する

compose ファイルの各サービスに restart:always を追加します。

ex.) compose.yml

version: '3'
services: 
  web: 
    image: rails-ec2-verification-web:latest
    restart: always
    volumes: 
      -

コンテナが停止すると常に再起動するオプションです。
Docker デーモンが再起動された際にコンテナが再起動されます。手動で停止した場合は、再起動されません。

https://docs.docker.jp/config/container/start-containers-automatically.html

compose up しなおしてから、EC2 を再起動してみる

設定を追加したので立ち上げなおしておきます

docker compose up -d

その後、EC2 インスタンスを再起動してみて、Docker コンテナが立ち上がっていれば OK です。
今回は Rails コンテナを立ち上げていたので、EC2 のパブリック v4 DNS にアクセスして、Rails の初期画面が表示されることを確認しました。

参考

https://docs.docker.jp/config/container/start-containers-automatically.html
https://qol-kk.com/wp2/blog/2020/03/04/post-1532/
https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units-ja

Discussion