Chapter 03

Docker でデプロイ

まちゅけん
まちゅけん
2023.12.16に更新

この章では Docker を利用して SSH 接続可能なクラウド環境に bot をデプロイする方法を学んでいきます。 またデプロイした bot を管理する方法についても学んでいきます。

事前準備

まずクラウド環境の準備が必要です。 もし AWS アカウントがない場合は作成しましょう。

学習用に AWS で新しい EC2 インスタンスを建てましょう。

インスタンスを建てる際には以下の項目を設定してください。

  • Amazon マシンイメージ (AMI): Amazon Linux 2023 AMI
    • Amazon Linux 2023 より最新の AMI がある場合はそちらを選択してください。
  • キーペア名: お使いのキーペア
  • インターネットからの HTTPS トラフィックを許可、にチェック
  • インターネットからの HTTP トラフィックを許可、にチェック

インスタンスの作成方法が分からなければ、以下の AWS ドキュメントが参考になります。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/option3-task1-launch-ec2-instance.html

インスタンスが立ち上がったらパブリック IPv4 アドレスを確認して SSH でログインします。

local $
ssh ec2-user@xx.x.x.xx

以下のコマンドで Docker をセットアップします。

cloud $
sudo dnf -y install docker \
  && sudo systemctl enable --now docker \
  && sudo usermod -aG docker $USER

インストールができたら正しく Docker エンジンが動作しているかテストしてみましょう。

まずは docker グループの権限を反映する為に一旦 SSH 接続からログアウトして、再度 SSH でログインします。 その後以下のコマンドを実行しましょう。

cloud $
docker run --rm hello-world

Hello from Docker! という文言と共に Docker ドキュメントの URL などが表示されていれば正常に動作しています。

確認ができたら SSH 接続からログアウトしてローカル環境に戻っておいてください。

デプロイ 🐳

では準備ができたら早速、前の章のサンプル bot をローカルからクラウド環境にデプロイしてみましょう! 前の章を飛ばしてきた方は main.py, requirements.txt, Dockerfile, compose.yaml のサンプルコードをコピーして作成してください。

以下 docker コマンドの -H オプションの ssh:// 以降をご自身の SSH 接続文字列 (ssh ec2-user@xx.x.x.xx) に置き換えて実行してみてください。

local $
docker -H ssh://ec2-user@xx.x.x.xx compose up --build -d

ローカル環境で実行したのと同じような感覚でコンテナが実行されます 🚀

-H オプションは Docker エンジンのホストを指定する設定です。 Docker は SSH 上のホストに対応している為このような事が可能になります。

でも本当にクラウド環境で実行されているか不安になりますよね? docker compose ps コマンドで確認してみましょう。

local $
docker compose ps
local $
docker -H ssh://ec2-user@xx.x.x.xx compose ps

-H を指定していないローカルでは何も表示されず (他に実行中のコンテナがなければ)、-H を指定したクラウド環境では先ほど立ち上げたコマンドが起動しているはずです!

-H を指定して前の章で学習した docker compose logs でログを確認したり、docker compose down でコンテナの削除を試してみてください。

管理画面 (Portainer)

bot のコンテナをクラウドにデプロイできるようになったは良いものの、ログを確認したり bot を停止する結局コマンドをしなくてはいけないのは面倒です。

そこで Portainer というソフトウェアを利用することで GUI でログ監視、コンテナの実行管理ができるようになります。

https://www.portainer.io/

Portainer では次のような GUI の管理画面が利用できます。 コンテナの一覧を確認 → コンテナのログを確認している様子です (公式ドキュメントより引用)。

Portainer 自体もコンテナアプリケーションなので、コマンド一つでデプロイすることが可能です。 実際にやってみましょう。

local $
docker -H ssh://ec2-user@xx.x.x.xx volume create portainer_data
docker -H ssh://ec2-user@xx.x.x.xx run -d -p 80:8000 -p 443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest

Portainer のコンテナが立ち上がったら、インスタンスの IP アドレスに https:// を付けて Web ブラウザで開いてください (例: https:///xx.x.x.xx)。これで Portainer の管理画面が立ち上がります。

Portainer は自己署名というものを行って https:// のアドレスを公開しているので、ブラウザの警告が表示されます。 自分で立ち上げたアプリケーションなので無視して、詳細設定 → xx.x.x.xx に進む (安全ではありません) で管理画面に進んでください。

最初 URL を開くと、管理者ユーザー作成が促されるのでそれに従ってパスワードを設定します。

トップに表示される local を選択すると、クラウド環境 (上のローカルで動いている) コンテナが一覧できます。

とてもシンプルで分かりやすい GUI をしているので、触ってみると直ぐにどんな操作ができるか理解できると思います 👀

この章のまとめ

  • -H オプションを利用することでクラウド環境に bot をデプロイできるようになりました。
  • Portainer を利用することで bot のログや実行管理ができるようになりました。

しかし bot のソースコードを更新したあと docker -H ssh://... compose up --build -d のコマンドを手作業で実行するのも面倒です。 いくらローカルから 1 コマンドでデプロイ可能だからといってできるなら自動化したいです。

そこで GitHub Actions を利用することでソースコード更新 → デプロイというワークフローを自動化することができます! 次の章では GitHub Actions による自動デプロイを学んでいきます。