Dockerを利用して、DjangoアプリをAWS(EC2)にデプロイしてみた
大学の授業の作品をデプロイしたときの備忘録
(間違えている部分があったら教えてください)
はじめに
- デプロイ完了までの所要時間→約3時間
ローカルでアプリを完成させた状態からデプロイを始め、エラー解決をしながら進めました。 - 参考にさせて頂いた記事
https://zenn.dev/leon0305/articles/8518e520e3b5ca
本題:デプロイに挑戦!!
AWSでインスタンスを作成済みとします。
↓↓↓作成方法↓↓↓
1. インスタンスを作成・接続する
- 秘密鍵がどこに保存されているか探すコマンド
find ~/ -name "django-app-key-healthsync.pem”
私の場合、鍵ファイルは Downloads フォルダにありましたが、セキュリティと整理のため、鍵ファイルを専用ディレクトリに移動します。
- 鍵ファイルを移動
mkdir -p ~/.ssh
mv /Users/reanogasawara/Downloads/django-app-key-healthsync.pem ~/.ssh/
- 鍵ファイルのパーミッションを修正
chmod 600 ~/.ssh/django-app-key-healthsync.pem
-
作業環境をVSCodeに切り替え、以下のSSH接続方法にある例というコマンドをコピーし、インスタンス名の前に
~/.ssh/
を貼り付け、ターミナルでコマンドを叩くとEC2上に接続できる。
ssh -i "~/.ssh/django-app-key-healthsync.pem" ec2-user@ec2-107-20-4-34.compute-1.amazonaws.com![](https://storage.googleapis.com/zenn-user-upload/32c3e9b24af2-20241124.png)
2. Dockerのインストール
- Dockerパッケージのインストール
sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$\\(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
docker-compose
に実行権限を付与
このままだとdocker-compose
を適切にインストールしたものの、実行可能な権限が付与されていないか、PATH
が正しく設定されていないので、インストールした docker-compose
ファイルに実行権限を付与します。
sudo chmod +x /usr/local/bin/docker-compose
- バージョン確認
docker-compose version
3. ローカルのフォルダをEC2に転送する
EC2インスタンス上とローカル環境は別々のファイルシステムを持っています。
そのため、DjangoプロジェクトをEC2インスタンスにアップロードする必要があります。
私は今回HealthSync
というプロジェクトを転送します。
SCPでプロジェクトをアップロード
ローカル環境からEC2インスタンスにプロジェクトフォルダを転送します。
※めっちゃ時間かかる
scp -i ~/.ssh/django-app-key-healthsync.pem -r ~/Desktop/HealthSync ec2-user@ec2-54-227-75-144.compute-1.amazonaws.com:~
-
i
: 秘密鍵ファイルを指定。 -
r
: フォルダを再帰的に転送。 -
~/Desktop/HealthSync
: ローカルのプロジェクトパス。 -
ec2-user@<IP>:~
: EC2のユーザーと転送先パス(ホームディレクトリ)。
EC2でフォルダを確認
ファイル転送後、EC2インスタンスで以下を実行してプロジェクトが転送されていることを確認します。
ls -l ~
プロジェクトディレクトリに移動
転送が成功したら、プロジェクトディレクトリに移動します。
cd ~/HealthSync
Docker Composeコマンドを実行
docker-compose.yml
があるディレクトリに移動してから、再度コマンドを実行します。
docker-compose run --rm web python manage.py migrate
4.コンテナを起動する
sudo docker-compose up --build
-
8000
を使うので、AWS上で設定します。必要のない方はスキップしてください🐼- AWSマネジメントコンソールで、該当インスタンスを選択。
- セキュリティタブから「セキュリティグループ」を開きます。
-
インバウンドルールを確認し、ポート
8000
を追加:- タイプ: カスタムTCPルール
- ポート範囲: 8000
-
送信元: 0.0.0.0/0 (全世界からアクセスを許可)または、自分のIPアドレスを指定。
5. ついに!!ブラウザで開くと確認できる!
リンクhttp://107.20.4.34:8000/
を開くとついに自分の作ったWebサイトが確認できました!
6. その他、私が直面したトラブル
iptables
を正しく設定できない
Dockerが[ec2-user@ip-172-31-27-22 HealthSync]$ docker-compose up -d
[+] Running 1/0
✘ Network healthsync_default Error 0.0s
failed to create network healthsync_default: Error response from daemon: Failed to Setup IP tables: Unable to enable SKIP DNAT rule: (iptables failed: iptables --wait -t nat -I DOCKER -i br-2680222b99be -j RETURN: iptables: No chain/target/match by that name.
(exit status 1))
このエラーは、Dockerがネットワークの作成時にiptables
関連の設定に問題があり、カスタムネットワークを作成できないために発生しています。Amazon Linux 2023やEC2インスタンスでは、特にDockerがiptables
を正しく設定できない場合があります。
解決方法
Dockerのデフォルトのネットワークドライバー設定を変更して、iptables
の処理をスキップします。
- Dockerデーモン設定を編集
Dockerの設定ファイルを編集します:
sudo nano /etc/docker/daemon.json
- 以下の内容を追記または追加します:
{
"iptables": false
}
- ファイルを保存して終了します(Ctrl + O、Ctrl + X)。
- Dockerを再起動
sudo systemctl restart docker
まだエラーが解決しない場合
- 既存のDockerネットワークを削除
docker network prune
- 全てのDockerコンテナとネットワークを再作成
docker-compose down docker-compose up -d
反省
- やってみたことや自分で調べた事などを書き起こすことで、自分の頭の整理もできて良い習慣だなぁと思いました。
- 後に文章として書き起こすつもりで知識をインプットすると、一つ一つのコマンドやコードの意味を理解できるように心がけられるので、これからも続けようと思います。
Discussion