初めてのDocker&ECS

ちょっとDockerを勉強してみたついでにまとめました。

前提知識

スライド作りました。良ければ見てください。

speakerdeck.com

実際にやってみる

参考:Amazon ECS における Docker の基本

Dockerイメージ作成用のEC2インスタンスの作成

1. EC2インスタンスの起動

  • AMIはAmazon Linux 2を使う
  • 自動割り当てパブリックIPは有効化にする
  • SGは最低でも22番と80番を許可しておく

2. Dockerのインストール

Ⅰ. 起動したEC2インスタンスssh接続したら「yum update」を行う。

$ sudo yum update -y

Ⅱ. Dockerをインストールする。

$ sudo amazon-linux-extras install docker

Ⅲ. Dockerを起動する。

$ sudo systemctl start docker.service

Ⅳ. ec2-userをdockerグループに追加する。これをやるとsudoを使用せずにDockerコマンドを実行できる。

$ sudo usermod -a -G docker ec2-user

Ⅴ. 一度ログアウトし、もう一度ssh接続して下記コマンドを実行する。Dockerの環境情報が出力されればOK(Ⅳを実行したことでsudo無しでコマンド実行できるようになった)。

$ docker info

※Dockerの環境情報を表示される。

Dockerイメージの作成

  1. ディレクトリを作成する。
$ mkdir docker_test
$ cd docker_test

Ⅱ. 下記3つのファイルを作成する。

  • ファイル名:dockerfile
FROM php:8-apache
COPY php.ini /usr/local/etc/php/
COPY index.php /var/www/html/

※補足

FROM php:8-apache

dockerhubにあるphp:8-apacheというイメージを取得するという意味。このイメージを用いるとPHP8とapacheがインストールされたコンテナが立ち上げる。

COPY php.ini /usr/local/etc/php/ COPY index.php /var/www/html/

PHP8とapacheをインストールしたら /usr/local/etc/php/ 配下に php.ini/var/www/html/ 配下に index.php をコピーするという意味。

  • ファイル名:index.php
<?php echo 'Hello World'; ?>
  • ファイル名:php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

Ⅲ. DockerfileからDockerイメージを作成する。

$ docker build -t hello-world .

-t :Dockerイメージの名前

※Dockerイメージが作成されたかは下記コマンドで確認できる

$ docker images

Ⅳ. Dockerイメージを実行する。上手く動作すればコンテナIDが出力される。

$ docker run -d -p 80:80 --name hello-world hello-world:latest

-d:コンテナをバックグラウンドで実行し、コンテナ ID を表示

-p:ポートマッピング

--name:コンテナの名前

Ⅴ. 起動したインスタンスのパブリックIPにアクセスし、「Hello World」と表示されたらOK。

Ⅵ. 実行したDockerイメージを停止する。コンテナIDはⅣで出力されているもの。

$ docker stop <コンテナID>

Ⅶ. 起動したインスタンスのパブリックIPにアクセスし、「Hello World」と表示されなくなっている事を確認する。

DockerイメージをECRへプッシュ

1. IAMロールの作成

  • AmazonEC2ContainerRegistryPowerUserをアタッチしたIAMロールを作成する。
  • Dockerイメージ作成用のEC2インスタンスにこのロールをアタッチする。
  • これによりEC2インスタンスからDockerイメージをECRへプッシュできるようになる。

2. ECRの作成

Ⅰ. AWSのサービス一覧から「ECR」を選択する。

Ⅱ. 「リポジトリの作成」を押す。

Ⅲ. リポジトリ名を入力しリポジトリの作成を押す。

Ⅳ. 作成されたリポジトリを選択し「プッシュコマンドの表示」を押す。

Ⅴ. プッシュコマンドが表示されるのでEC2インスタンス上で順番に実行する。実行例も載せておきます。

Ⅵ. AWSコンソール画面に戻ってリポジトリ名をクリックしDockerイメージがプッシュされていることを確認できればOK。

Ⅶ. プッシュされたDockerイメージをクリックしイメージURI予めコピーしておく。(タスク定義の作成で使用します。)

タスク定義の作成

Ⅰ. AWSのサービス一覧からECSを選択する。

Ⅱ. タスク定義を押す。

Ⅲ. 新しいタスク定義の作成を押す。

Ⅳ. EC2を選択して次のステップ

Ⅴ. 「タスク定義名」を入力(故なきは例としてhello-worldにしました)

Ⅵ. 下にスクロールしてコンテナの定義から「コンテナの追加」を押す。

Ⅶ. 下記項目を入力する。

コンテナ名 *:hello-world(任意)
イメージ *:2.ECRの作成のⅦでコピーしたイメージURIを貼り付ける
メモリ:128M(任意)
ポートマッピング:ホストポート 80、コンテナポート 80
CPUユニット:1

Ⅷ. 入力が終わったら適用を押す。

Ⅸ. タスクとコンテナの定義の設定の画面に戻るので「作成」を押す。

Ⅹ. 「タスク定義が正常に作成されました」と表示されればOK。

クラスターの作成

Ⅰ. Amazon ECSのクラスターを押す。

Ⅱ. クラスターの作成を押す。

Ⅲ. 「EC2 Linux + ネットワーキング」を選択して「次のステップ」を押す。

Ⅳ. 下記入力例を参考に埋めていく。

クラスター名*:hello-world
EC2 インスタンスタイプ*:t2.micro
インスタンス数*:1
キーペア:任意
ネットワーキング:必要に応じてVPCやSG等を設定する。この辺はEC2作成するのと同じ要領でやればOK。

Ⅶ. 入力が完了したら作成を押す。するとクラスターの作成が始まる(1分ほどかかる)。

Ⅷ. 全て正常に実行されたら「クラスターの表示」を押す。

Ⅸ. 「タスク」を押し、「新しいタスクの実行」を押す。

Ⅹ. 下記項目を入力する。

起動タイプ:EC2
タスク定義:hello-world:1
タスクの数:1

Ⅺ. 入力が終わったら「タスクの実行」を押す。

Ⅻ. 下記のように状態が「RUNNING」になっていればOK。

動作確認

Ⅰ. 「ECSインスタンス」をクリックするとコンテナが起動されているEC2インスタンスが表示される。

Ⅱ. インスタンスIDをクリックしてパブリックIPにアクセスし「Hello World」と表示されていればOK。

Ⅲ. ECSインスタンスssh接続してみる。

Ⅳ. コンテナ情報が出力されることを確認する。

$ docker ps

Ⅴ. Dockerのコンテナの中に入ってみる

$ docker exec -it <CONTAINER ID> /bin/bash

/var/www/html に移動すると index.php があることを確認できる。

後片付け

Ⅰ. 作成したクラスターを削除する。

Ⅱ. 作成したタスクを選択し登録解除のボタンを押す。

Ⅲ. Dockerイメージ作成用のEC2インスタンスの作成を削除する。