cubenoy22.com

LightsailにDockerイメージをデプロイ

Cover Image for LightsailにDockerイメージをデプロイ

Fargateは安定していないかもという話を聞いたのと、EC2より簡単にデプロイできそうだったので Lightsail を選択した。サーバーは Node.js + Puppeteer だったので Docker なしでも動きそうだったけどどこでも開発とデプロイができる環境が理想なので Docker を利用することにした。

インスタンス作成

  • インスタンスローケション ... 今回は国内向けなので東京を選択
  • インスタンスイメージ ... Dockerさえ動けばよし
    • プラットフォーム: Linux/Unix
    • 設計図の選択: OSのみ - Amazon Linux 2
  • インスタンスプランの選択
    • 人数分(最大10名程度が同時利用する想定) Chromium のタブが開かれることを考慮し $20 のプランを選択、Chromiumはメモリを大量に消費するイメージがあるのと、お試しで一番安いプランにしたらレンダリングがタイムアウトする自体に陥った
  • インスタンスを確認 ... わかりやすい名前をつける

ネットワーキングの設定

Lightsail は 静的IPが簡単にアタッチできるのがとてもありがたい。社内専用サービスなのでファイアウォールのHTTP:80にIPアドレス制限を追加しておいた。

Dockerのインストール

SSH慣れていないのでとりあえずブラウザ上で操作。。

開発では docker-compose も利用していたが、サーバーでの実行は docker だけで良さそうなので、docker-compose は使用しないことにした。

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/docker-basics.html

Lightsail 上でイメージを使用できるようにする

ソースコードはローカルにあってイメージのビルドもできている状態、サーバー上で動かすには

  • ソースコード自体を転送しサーバー上でビルドする
  • プライベートなDockerレジストリサーバーにpushし、それをpullして使う

の二パターンがあると考え後者であればLightsailでレジストリできるようにすれば簡単そうだったので試してみた。

レジストリサーバーを動かす

こちら の記事を参考にプライベートレジストリを起動してみた。

  • -v /hostdir/registry については ~/docker/registry をアサインしてみた
  • --restart=always オプションについてはこのサーバーはレジストリ用として常に動かすわけではないのでつけないことにした

レジストリサーバーへpush

こちら の記事を参考に自分のイメージをpushしようとしたところ、

http: server gave HTTP response to HTTPS client

こんなエラーが出たのでググったところ、pushする側のDockerの設定に insecure-registries オプションを追加しないといけないことがわかった( 参考 )。Macを利用している場合 /etc/docker/daemon.json にファイルを追加してもダメで Docker.app の Preferences > Docker Engine に追加するのが正しいらしい ( 参考 )。

これでめでたくイメージが登録されたはず。

LightsailのDockerでpullする

ローカルで動いているレジストリからpullするだけ。

$ docker pull 0.0.0.0:5000/<イメージ名>

イメージを動かす

$ docker run -it --privileged --restart=always --env="PORT=3000" -p=80:3000 0.0.0.0:5000/<イメージ名>
  • --privileged オプションは Puppeteer で動かす時にエラーを回避するためにつけている
  • --env オプションは Node.js 側に環境変数を渡すためにつけている
  • -p オプションは Lightsail の 80番ポートを内部で3000番に変換している
    • 80番は well known port で Node.js で使用している Express サーバーでエラーになるのでとりあえず好きなポートで動くようにしておいた