Dockerでローカル開発環境を作り、AWS-ECSにデプロイする

できるだけ簡易なPHPアプリケーションを題材にDockerでローカル開発環境を作り、AWS ECSにプッシュするところまで行う。

0.事前準備

・Docker for Mac のインストール
https://store.docker.com/editions/community/docker-ce-desktop-mac
・AWSアカウント
https://aws.amazon.com/jp/register-flow/

Dockerでローカル開発環境構築

1.Docker基本コマンドの確認

Dockerを利用したことのない人のために基本コマンドを確認します.
本稿では細かい技術的な内容には触れません.
Dockerの更に詳細な事を知りたい場合はDockerドキュメントを当たりましょう.

・イメージの一覧
docker images
・「すべての」イメージを表示(デフォルトは中間コンテナを非表示)
docker images -a
・すべてのイメージを強制削除
sudo docker rmi $(sudo docker images -q) -f
・「現在起動している」コンテナ
docker ps
・「すべての」コンテナ
docker ps -a
・すべてのコンテナを強制削除
sudo docker rm -f $(sudo docker ps -qa)

2.Dockerでローカル開発環境を構築する

2-1.作業ディレクトリを作成する
mkdir -p ~/work/1/php/
2-2.作業ディレクトリに移動する
cd ~/work/1/php/
・index.phpを作成する

index.php
<?php
echo 'Hello Docker';

2-3.php.iniを作成する

php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

2-4.Dockerfileを作成する

Dockerfile
FROM php:7-apache
COPY php.ini /usr/local/etc/php/
COPY index.php /var/www/html/

2-5.親ディレクトリに移動する
cd ..

・docker-compose.ymlを作成する

docker-compose.yml
version: '2'
services:
  php:
    container_name: php
    image: php:latest
    build: php/
    volumes:
     - ./php:/root/app
    ports:
     - "80:80"

2-6.現在のイメージを確認する
docker images -a
Dockerを使ったことのない人は空の結果になるはず

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

2-7.docker-composeコマンドを実行する
docker-compose.ymlがあるディレクトリで以下コマンドを順番に実行する
docker-compose build
docker-compose up
成功するとDockerfileに書かれた命令を実行し、問題なければ以下URLからローカル環境を確認できる
http://localhost:80
以下を順番に実行してサービスを停止する
Ctrl+C
docker-compose stop

docker-compose build・・・docker-compose.ymlで定義したサービスをビルドする役割を持つ
docker-compose up・・・サービスを開始、再起動する役割を持つ
docker-compose stop・・・サービスを停止する役割を持つ

2-8.index.phpを編集する
index.phpを以下のように編集する

index.php
<?php
echo 'Hello Docker';
echo '<br>';
echo 'Hello Docker';

2-9.docker-composeコマンドを実行する
docker-compose.ymlがあるディレクトリで以下コマンドを順番に実行する
docker-compose build
docker-compose up
問題なければ以下URLから変更を確認できる
http://localhost:80

AWSにデプロイする

AWSの機能について細かく記載してもキリがないので一つ一つのサービスの詳細や概要はドキュメントを当たりましょう.
AWSドキュメント

3.AWS CLIをインストールする

以下コマンドを順番に実行する

terminal
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
$ sudo python get-pip.py
$ sudo pip install awscli
$ aws --version

※curl・・・HTTPアクセスをしてコンテンツを取得できる.-o filenameでファイルとして保存される
https://bootstrap.pypa.io/get-pip.py・・・pipコマンドを取得できる
※Uninstalling a distutils installed project (six) has been deprecated and will be removed in a future version. という内容で怒られる時は以下のコマンドを試してみましょう
sudo pip install awscli --upgrade --ignore-installed six

4.IAMユーザーを作成する

4-1.ユーザーを作成する
4-2.AWSにログインする
https://console.aws.amazon.com/console/home
4-3.サービスよりIAMにアクセスする
4-4.サイドバーより「ユーザー」にアクセスする
4-5.「ユーザーを追加」をクリック
4-6.ユーザー名を入力し、「プログラムによるアクセス」にチェックを入れ「次のステップ:アクセス権限」をクリックする 例:test-user
4-7.「既存のポリシーを直接アタッチ」を選択し、フィルターから以下をチェックし「次のステップ:確認」をクリック
「AmazonEC2ContainerServiceFullAccess」
「AmazonEC2ContainerRegistryFullAccess」
4-8.「ユーザーの作成」をクリック
4-9.「.csvのダウンロード」をクリック
このファイルはアクセスに関わる情報が入っているので人に渡らないように保管しましょう

5.アクセスキーを設定する

5-1.credencials.csvの内容を入力していく

terminal
$ aws configure
AWS Access Key ID [****************]: credencialsのAccess key ID
AWS Secret Access Key [****************]: credencialsのSecret access key
Default region name [ap-northeast-1]: ap-northeast-1
Default output format [json]: json

5-2.設定した内容を確認する

terminal
$ aws configure list

6.ECSリポジトリにローカルのDockerをプッシュする

6-1.リポジトリの作成

6-1-1.サービスより「Elastic Container Service」にアクセスする
6-1-2.サイドバーより「リポジトリ」にアクセスする
6-1-3.「今すぐ始める」をクリック
6-1-4.リポジトリ名をphpと入力し、「次のステップ」をクリック
6-1-5.「Docker イメージの構築、タグ付け、プッシュ」の手順に従い実行する。終了したら完了をクリック。 ※ここまでの手順を踏んでいれば3)は不要
6-1-6.成功していればリポジトリにイメージが作成されていることが確認できる

6-2.タスクの作成

6-2-1.サイドバーより「タスク定義」にアクセスする
6-2-2.「新しいタスク定義の作成」をクリック
6-2-3.タスク定義名をphpと入力する
6-2-4.「コンテナの定義」の「コンテナの追加」をクリック
6-2-5.コンテナ名をphpと入力する
6-2-6.イメージにリポジトリ記載のリポジトリURIとタグを入力する
6-2-7.メモリ制限(MB)**は128M(任意)
6-2-8.ポートマッピングはホストポート80、コンテナポート80とする
6-2-9.CPU ユニット数は1とする
6-2-10.「追加」をクリック
6-2-11.「作成」をクリック

6-3.クラスターの作成

6-3-1.サイドバーより「クラスター」にアクセスする
6-3-2.「クラスターの作成」をクリックする
6-3-3.「EC2 Linux + ネットワーキング」をクリックする
6-3-4.「次のステップ」をクリック
6-3-5.「クラスター名」をphpと入力する
6-3-6.「EC2インスタンスタイプ」を「t2.micro」にする
6-3-7.「インスタンス数」は1
6-3-8.「キーペア」を指定する.無い場合はEC2コンソールより作成する.
6-3-9.「作成」をクリックするとクラスターの作成が開始される
6-3-10.完了するとクラスターが作成され、EC2インスタンスも作成される
6-3-11.作成されたクラスターのタスクの項目をクリックし「新しいタスクの実行」にアクセスする
6-3-12.タスク定義はphp:1、「タスクの数」は1とし、タスクの実行をクリックする
6-3-13.作成されたタスクをクリックし、「EC2 インスタンス」をクリックするとEC2インスタンスを確認できる
6-3-14.「パブリック DNS (IPv4)」にアクセスするとローカルで作成したindex.phpの内容が確認できる

6-4.ローカルで編集してデプロイする

6-4-1.ローカルのindex.phpを任意に編集する

index.php
<?php
echo 'Hello Docker';
echo '<br>';
echo 'Hello AWS';

6-4-2.リポジトリ:phpの「プッシュコマンドの表示」の手順を実行する ※3)はdocker-compose buildでも可
6-4-3.クラスター:phpのタスクより「すべてを停止」を実行し、「新しいタスク」を実行する
6-4-4.「パブリック DNS (IPv4)」にアクセスするとローカルで編集したindex.phpの内容が確認できる

7.EC2にSSH接続(おまけ)

EC2にSSH接続するとログを見ることができたりインスタンス内のパーミッションや設定ファイルを確認修正できたりする.

7-1.ECSのセキュリティグループを編集する

7-1-1.作成されたタスクをクリックし、「EC2 インスタンス」をクリックするとEC2インスタンスを確認できる
7-1-2.「説明」の「セキュリティグループ」にアクセスする
7-1-3.「アクション」から「インバウンドのルールの編集」をクリック
7-1-4.「タイプ」をSSH、「ソース」を「マイ IP」とする
※回線が変わると繋がらなくなります

7-2.EC2にSSH接続

7-2-1.EC2インスタンスの「接続」をクリックすると「インスタンスへの接続」が出てくるので、手順に沿って実行する
※rootと指定されてるところはec2-userに変えてアクセスする

8.不要なリソースを削除する

インスタンスは放置しておくと起動しっぱなしになってしまい無料利用枠でも課金されてしまうことがあるので、不要な場合は下記手順で不要なリソースを削除しておきましょう。

8-1.IAMの削除

8-1-1.IAM のコンソールからサイドバー「ユーザー」をクリック
8-1-2.作成したユーザーを選択し、「ユーザーの削除」をクリック」
8-1-3.チェックボックスにチェックを入れ「はい、削除します」をクリック

8-2.ECSの削除

8-2-1.クラスターは「クラスターの削除」→「削除」を実行
8-2-2.タスクは「アクション」→「登録解除」を実行
8-2-3.リポジトリは対象を選択し「リポジトリの削除」を実行

8-3.EC2インスタンスの削除

8-3-1.作成したインスタンスを選択する
8-3-2.「アクション」→「インスタンスの状態」→「削除」を実行
8-3-3.「セキュリティグループ」も削除

終わりに

今回は簡易なPHPアプリケーションを題材にDocker環境構築、AWS-ECSへのデプロイまで行った。実際の開発においては上記のような手作業もスクリプトで自動化できるので、そのあたりも今後の記事にしていきたい。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.