初めてのDocker&ECS
ちょっとDockerを勉強してみたついでにまとめました。
前提知識
スライド作りました。良ければ見てください。
実際にやってみる
Dockerイメージ作成用のEC2インスタンスの作成
1. EC2インスタンスの起動
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イメージの作成
- ディレクトリを作成する。
$ 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。
クラスターの作成
Ⅱ. クラスターの作成を押す。
Ⅲ. 「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。
Ⅳ. コンテナ情報が出力されることを確認する。
$ docker ps
Ⅴ. Dockerのコンテナの中に入ってみる
$ docker exec -it <CONTAINER ID> /bin/bash
/var/www/html
に移動すると index.php
があることを確認できる。
後片付け
Ⅰ. 作成したクラスターを削除する。
Ⅱ. 作成したタスクを選択し登録解除のボタンを押す。
Ⅲ. Dockerイメージ作成用のEC2インスタンスの作成を削除する。