記事を読んでいただきありがとうございます。
モブエンジニア(@mob-engineer)です。
個人的にDockerをキャッチアップを行っています。
キャッチアップの一環として「自作アプリをEC2でコンテナ起動させる」手順を記事としてアウトプットしたいと思います。
対象読者
- Dockerについて学び始めた方
- 簡単なハンズオンを触ってDockerについてキャッチアップしたい
自作アプリ
ソースコードは以下GitHubリポジトリに格納済みです。
サンプルアプリなのでご自身のGitHubアカウントへForkしてから利用してください。
EC2での作業
あらかじめEC2環境を構築しておいてください。
EC2起動後画面
構築後なので、システムアップデートを行っておきましょう。
sudo yum update -y
Amazon Linuxで構築している場合gitがインストールされていないためインストールを行いましょう。
sudo yum install git -y
今回のサンプルアプリではNode.jsを利用しているためnpmもインストールします。
curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash -
sudo yum install -y nodejs
インストール後、Dockerのインストール⇒起動設定を行いましょう。
sudo yum install -y docker
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -a -G docker ec2-user
インストール完了後Docker Composeの設定を行いましょう。
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
インストール完了後リポジトリのクローンを行います。
git clone https://github.com/<fork先リポジトリ>/docker_sample.git
docker_sampleディレクトリに移動し依存関係をインストールしましょう
cd docker_sample
npm install
依存関係インストール完了後Dockerイメージをビルドします。
docker build -t your-app-name .
Docker Composeを利用してコンテナ起動を行ってみましょう。
docker-compose up -d
コンテナが起動しているか確認しましょう。
[ec2-user@ip-172-31-33-211 docker_sample]$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATU S PORTS NAMES
f94d7aff0589 test-app "docker-entrypoint.s…" About a minute ago Up A bout a minute (healthy) 0.0.0.0:80->3000/tcp, :::80->3000/tcp your-app-co ntainer
ログ情報も見てみましょう。
[ec2-user@ip-172-31-33-211 docker_sample]$ sudo docker logs your-app-container
> node-task-manager@1.0.0 start
> node app.js
🚀 Server is running on port 3000
📝 Task Manager API is available at http://localhost:3000
❤️ Health check: http://localhost:3000/health
[ec2-user@ip-172-31-33-211 docker_sample]$
リアルタイムログ監視も行えるか確認しましょう。
[ec2-user@ip-172-31-33-211 docker_sample]$ sudo docker logs your-app-container
> node-task-manager@1.0.0 start
> node app.js
🚀 Server is running on port 3000
📝 Task Manager API is available at http://localhost:3000
❤️ Health check: http://localhost:3000/health
[ec2-user@ip-172-31-33-211 docker_sample]$ sudo docker logs -f your-app-container
> node-task-manager@1.0.0 start
> node app.js
🚀 Server is running on port 3000
📝 Task Manager API is available at http://localhost:3000
❤️ Health check: http://localhost:3000/health
Error: [Error: ENOENT: no such file or directory, stat '/app/public/index.html'] {
errno: -2,
code: 'ENOENT',
syscall: 'stat',
path: '/app/public/index.html',
expose: false,
statusCode: 404,
status: 404
}
Error: [Error: ENOENT: no such file or directory, stat '/app/public/index.html'] {
errno: -2,
code: 'ENOENT',
syscall: 'stat',
path: '/app/public/index.html',
expose: false,
statusCode: 404,
status: 404
}
404エラーの原因については調査が必要ですが、リアルタイムでログが出ています。
本来index.htmlがpublic上に格納されている必要があります。
publicディレクトリを作成⇒index.htmlを移動する必要があります。
そのうえで、ビルド済みのDockerを再度ビルドする必要があります。
古いコンテナを削除しましょう。
sudo docker stop your-app-container
sudo docker rm your-app-container
再度Dockerイメージをビルドします。
sudo docker build -t test-app .
Dockerコンテナを起動させます。
sudo docker run -d -p 80:3000 --name your-app-container test-app
でブラウザへアクセスしてみましょう。
無事、自作アプリをコンテナ起動させることが出来ました。
所感
本手順を通じて「Dockerイメージの構築~Dockerイメージの削除~Dockerコンテナの正常性確認」まで行うことが出来ました。そのうえで、今回構築したアプリはあくまでハンズオン用の手順となります。実務で構築する場合、セキュリティ面での考慮・CI/CDを考慮した運用なども求められます。
Docker公式のドキュメントを読んでみることでコンテナへの解像度を高めることが出来ると考えています。(私も継続して読んでいきます)
ざっくりとした記事ですが最後までお読みいただきありがとうございました。