作成するアーキテクチャ
Dockerを本番環境で使うメリット
- エラーの発生を抑えられる。(ローカル環境や本番環境の差分を減らせるため、環境由来のエラーを防げる。)
- 環境構築のコストを下げられる。(docker build, docker runで一発で立ち上がる。)
- コードで管理できるため属人性を排除できる。(ファイルを管理すれば、コマンドで操作できるため誰がやっても同じ結果になる。)
- コードで管理できるためGitと併用できる。(Git,GitHubと連携してver管理ができる。)
Docker基本コマンド
①docker run
docker imageからコンテナを一つ起動する。
②docker build
Dockerfileからイメージを作成。
③docker exec
コンテナ内のコマンドラインにアクセスする。
AWS側の操作
マネジメントコンソールにアクセスした後下記の操作を行う。
①ユーザ作成
rootユーザをそのまま使っていてはセキュリティ上まずいため別にユーザを作成する。
IAMを起動した後左側にある「ユーザー」を選択。
右上のボタン「ユーザーを追加」をクリック。
ユーザ名: yoshizumiadmin #(笑)
AWS 認証情報タイプを選択: アクセスキー、パスワード両方にチェックを入れる
コンソールのパスワード: *******
パスワードのリセットが必要: チェックを外す
AdministratorAccessを付与して
ここまでできたら作成する。
csvをダウンロードしてIAMユーザの作成は完了。
以降はこのユーザを使用してマネジメントコンソールにログインする。
$ aws configure
AWS Access Key ID [******************NW]:
AWS Secret Access Key [******************XF]:
Default region name [ap-northeast-1]:
Default output format [None]: json
上記のように設定してAWS-CLIの設定を終える。
②ECSロール作成
他のAWSサービスと連携するためにもECSにIAMロールを割り当てる。
ECS関連の3つのロールを作成する。
左のタブから「ロール」を選択。
「task」で検索をかけて、ポリシーを絞ることを忘れない。
3つロールを作成したら、この手順は完了。
③VPCの作成
マネジメントコンソールからサービス検索⇨「VPC」を検索⇨「VPCを作成」
名前:ecs-vpc
IP v4CIDR:10.0.0.0/16
あとはデフォルトで作成。この中にパブリックサブネットを二つ作成する。(DBをプライベートサブネットに作成しないのは、あくまで練習用のため)
public-subnet1:AZ-1a,CIDR:10.0.0.1/24
public-subnet2:AZ-1c,CIDR:10.0.1.0/24
あとはデフォルトでサブネットを2つ作成する。
(書き忘れてたけど、インターネットゲートウェイも作成してください!笑)
ルートテーブルをIGW向けに作成してインターネットとの通信を可能にする。
先ほど作成したサブネットとの関連付けをしてこの手順を完了する。
④ECRにDockerfileをアップロード
アップロードするDockerfile
FROM php:7.4.24-apache
# PHPのモジュールなどをインストール
RUN apt-get update \
&& apt-get install -y zlib1g-dev \
&& apt-get install -y zip unzip \
&& apt-get -y install libzip-dev libonig-dev \
&& docker-php-ext-install pdo_mysql mysqli zip \
&& docker-php-ext-enable pdo_mysql mysqli \
&& a2enmod rewrite
# タイムゾーン設定
ENV TZ=Asia/Tokyo
# cronのインストール
RUN apt-get update && apt-get install -y \
busybox-static \
&& apt-get clean
# composerをインストール
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer
ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /composer
ENV PATH $PATH:/composer/vendor/bin
# アプリケーションフォルダを環境変数として設定
ENV APP_HOME /var/www/html
# apacheのuidとgidをdocker user uid/gidに変更。
RUN usermod -u 1000 www-data && groupmod -g 1000 www-data
#change the web_root to laravel /var/www/html/public folder
# RUN sed -i -e "s/html/html\/public/g" /etc/apache2/sites-enabled/000-default.conf
COPY ./php/vhost.conf /etc/apache2/conf-enabled/vhost.conf
# apache module rewrite を有効にする
RUN a2enmod rewrite
# ソースコードと.envファイルをDockerImageに埋め込む
COPY . $APP_HOME
COPY .env.production /var/www/html/.env
# 初回起動時に行うスクリプトファイルをコピーして実行権限を与える
COPY ./php/start.sh /var/www/html/start.sh
RUN chmod 744 ./php/start.sh
# 必ずキャッシュ用のディレクトリを作っておくこと→ Fargateの場合ずっとキャッシュが残ることになる
RUN mkdir bootstrap/sessions && \
mkdir storage/framework/cache/data
# フレームワークに必要なモジュールをDockerImageにインストール
RUN composer install --no-dev --no-interaction
# 書き込み権限を与える
RUN chown -R www-data:www-data $APP_HOME
# RUN chmod -R 777 storage && \
# chmod -R 777 bootstrap
# CMD php artisan migrate --force
CMD ["bash", "start.sh"]
※細かいDockerfileの解説は省きます。
DBのDockerfileも作成しておく。
FROM mysql:5.7.30
COPY ./init.sql /docker-entrypoint-initdb.d
※シェルスクリプトを書いてbuildの際に走らせる。
#!/usr/bin/env bash
php artisan migrate --force
chmod -R 777 bootstrap
chmod -R 777 storage
/usr/sbin/apache2ctl -D FOREGROUND
マネジメントコンソールからECSを検索し、右側のタブからリポジトリを選択
プライベートのlaravel-ecsというリポジトリを作成する。
イメージスキャンの設定を有効にしておくことを忘れない。
リポジトリを作成する。
右上の「プッシュコマンドを表示」で表示されたコマンドをターミナルから実行する。
先ほど作成したDockerfileがあるディレクトリに移動したあと、ECR「プッシュコマンドの表示」で表示されるコマンドを順に実行していく。
①aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 071667546372.dkr.ecr.ap-northeast-1.amazonaws.com
②docker build -t laravel-ecs .
うまくbuildできている。
③docker tag laravel-ecs:latest 071667546372.dkr.ecr.ap-northeast-1.amazonaws.com/laravel-ecs:latest
tag付けをしている。
④docker push 071667546372.dkr.ecr.ap-northeast-1.amazonaws.com/laravel-ecs:latest
無事pushされていることがわかる。
同様にしてDBのリポジトリを作成していく。
名前だけ変えて作成する。
次は同様にしてイメージをプッシュしていく。
①aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 071667546372.dkr.ecr.ap-northeast-1.amazonaws.com
②docker build -t mysqlecs .
今度はすぐbuildされる。
③docker tag mysqlecs:latest 071667546372.dkr.ecr.ap-northeast-1.amazonaws.com/mysqlecs:latest
④docker push 071667546372.dkr.ecr.ap-northeast-1.amazonaws.com/mysqlecs:latest
こちらも無事pushできた。
Fargateの操作
※ローカルにDockerのインストールが済んでいない場合はインストールする。
①クラスター作成
マネジメントコンソールからECSを開き、「クラスター」⇨「クラスターの作成」をクリック。
②タスク定義
左側のタブから「タスク定義」を選択。
「新しいタスク定義の作成」⇨「起動タイプの互換性の選択」:Fargateを選択して次のステップ。
タスク定義名:simpleapp
タスクロール:AmazonECSTaskExecutionRole
オペレーティングシステムファミリー:Linux
タスクメモリ (GB):0.5GB
タスク CPU (vCPU):0.25vCPU
「コンテナの追加」⇨コンテナ名:laravel⇨イメージ:先ほど作成したECRのリポジトリURI
メモリ制限 (MiB):128
ポートマッピング:80
あとはデフォルトで「作成」
起動タイプ:FARGATE
オペレーティングシステムファミリー:Linux
リビジョン:latest
プラットフォームのバージョン:LATEST
クラスター:simple-ecs
サービス名:simple-ecs-service
タスクの数:1
デプロイメントタイプ:ローリングアップデート
あとはデフォルトで「次のステップ」
クラスター VPC:先ほど作成したVPC
サブネット:先ほど作成したサブネット2つ
あとはデフォルトで「次のステップ」
Autoscaling:何も変更せずに「次のステップ」
DBとうまく接続できていませんでしたね。これで完了です!!