クラウド時代が到来し、ますます広がりを見せつつあるコンテナ技術。第2回は、AWS ECS上でSpringアプリケーションを構築する方法を説明します。本稿は以下のステップに沿って、解説しています。
前回の記事「 【第6回】ECSコンテナAP開発(3)SpringBootアプリケーション実装 」までに、以下イメージの構成に沿って、VPC環境・ALBを構築し、ECSコンテナ上で動くパブリック・プライベートサブネット用2種類のアプリケーションを作成しました。 今回は「4. Dockerコンテナの作成・DockerHubへのプッシュ」です。
ECSの実態はDockerコンテナなので、前回実装したSpringアプリケーションのコンテナイメージを作成し、DockerHubやAWS Elastic Container Registry(ECR)などのレジストリにプッシュしておくと、 次回以降後述する、ECSクラスタ・タスク・サービスの定義で、レジストリからコンテナイメージを取得して、ECSコンテナとして実行することができるようになります。
それでは、前回実装したSpringアプリケーションのプロジェクトを元にDockerイメージを作成していきます。Dockerイメージを作成する場合は、Dockerfileと呼ばれる定義ファイルを作成します。
前回作成したSpringBootアプリケーションのMavenプロジェクト内に、各々以下のようなDockerファイルを作成してコミットし、GitHubへプッシュします。
# Dockerfile for sample service using embedded tomcat server
# (A)
FROM centos:centos7
# (B)
MAINTAINER debugroom
# (C)
RUN yum install -y \
java-1.8.0-openjdk \
java-1.8.0-openjdk-devel \
wget tar iproute git
# (D)
RUN wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo
# (E)
RUN sed -i s/\$releasever/6/g /etc/yum.repos.d/epel-apache-maven.repo
# (F)
RUN yum install -y apache-maven
# (G)
ENV JAVA_HOME /etc/alternatives/jre
# (H)
RUN git clone https://github.com/debugroom/mynavi-sample-aws-ecs.git /var/local/mynavi-sample-aws-ecs
# (I)
RUN mvn install -f /var/local/mynavi-sample-aws-ecs/pom.xml
# (J)
RUN cp /etc/localtime /etc/localtime.org
# (K)
RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# (L)
EXPOSE 8080
# (M)
CMD java -jar -Dspring.profiles.active=production /var/local/mynavi-sample-aws-ecs/backend/target/mynavi-sample-aws-ecs-backend-0.0.1-SNAPSHOT.jar
# Dockerfile for sample service using embedded tomcat server
# (A)
FROM centos:centos7
# (B)
MAINTAINER debugroom
# (C)
RUN yum install -y \
java-1.8.0-openjdk \
java-1.8.0-openjdk-devel \
wget tar iproute git
# (D)
RUN wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo
# (E)
RUN sed -i s/\$releasever/6/g /etc/yum.repos.d/epel-apache-maven.repo
# (F)
RUN yum install -y apache-maven
# (G)
ENV JAVA_HOME /etc/alternatives/jre
# (H)
RUN git clone https://github.com/debugroom/mynavi-sample-aws-ecs.git /var/local/mynavi-sample-aws-ecs
# (I)
RUN mvn install -f /var/local/mynavi-sample-aws-ecs/pom.xml
# (J)
RUN cp /etc/localtime /etc/localtime.org
# (K)
RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# (L)
EXPOSE 8080
# (M)
CMD java -jar -Dspring.profiles.active=production /var/local/mynavi-sample-aws-ecs/backend-for-frontend/target/mynavi-sample-aws-ecs-backend-for-frontend-0.0.1-SNAPSHOT.jar
内容は2つともほぼ同一のため、BackendアプリケーションプロジェクトのDockerfileを元に解説します。
項番 | コマンド |
説明 | |
FROM centos:centos7 | |
コンテナイメージのベースとなるOSイメージを指定します。 | |
MAINTAINER debugroom | |
メンテナンスしている組織や個人の名称を指定します。省略可能です。 | |
RUN yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel wget tar iproute git | |
OSにJDK、wgetコマンド、tarコマンド、iprouteコマンド、gitをインストールしてます。 | |
RUN wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo | |
Apache Mavenのインストールに必要な資材をwgetコマンドで取得しています。 | |
RUN sed -i s/$releasever/6/g /etc/yum.repos.d/epel-apache-maven.repo | |
/etc/yum.repos.d/epel-apache-maven.repoのリリースバージョンを置換しています。 | |
RUN yum install -y apache-maven | |
Apache Mavenをインストールしています。 | |
ENV JAVA_HOME /etc/alternatives/jre | |
JAVA_HOME環境変数をインストールされたJDKのディレクトリに設定しています。 | |
RUN git clone https://github.com/debugroom/mynavi-sample-aws-ecs.git /var/local/mynavi-sample-aws-ecs | |
GitHubへプッシュしたSpringアプリケーションを/var/local/mynavi-sample-aws-ecsへgit cloneしています。ディレクトリは適宜変更しても可能です。 | |
RUN mvn install -f /var/local/mynavi-sample-aws-ecs/pom.xml | |
アプリケーションをmvn installコマンドでビルドしています。 | |
RUN cp /etc/localtime /etc/localtime.org | |
OSのタイムゾーンを変更するため、タイムゾーンファイルを一度バックアップします。 | |
RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime | |
シンボリックリンクを上書き作成して、アプリケーション実行環境のタイムゾーンを東京に変更しています。 | |
EXPOSE 8080 | |
コンテナのポート8080をオープンします。 | |
CMD java -jar -Dspring.profiles.active=production /var/local/mynavi-sample-aws-ecs/backend-for-frontend/target/mynavi-sample-aws-ecs-backend-for-frontend-0.0.1-SNAPSHOT.jar | |
IでビルドしたSpringBootアプリケーションをプロファイルproductionで実行しています。ExecutableJar形式ですので、アプリケーションが組み込みTomcat内で起動します。 |
上記のDockerfileを、DockerがインストールされたLinuxマシン上で、docker buildコマンドを実行することによりDockerイメージを作成することができます。
注釈
CentOSのDockerインストール方法
EC2でCentOS7を実行した場合、以下のコマンドでDockerをインストールできます。
[centos@ip-XXXX-XXX-XXX-XXX ~]$ sudo yum update -y
// omit
[centos@ip-XXX-XXX-XXX-XXX ~]$ sudo yum install -y docker
// omit
[centos@ip-XXX-XXX-XXX-XXX ~]$ sudo systemctl enable docker.service
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[centos@ip-XXX-XXX-XXX-XXX ~]$ sudo systemctl start docker.service
注釈
dockerコマンドの実行
dockerコマンドを利用する際は sudoが必要です。 sudoなしでdockerコマンドを実行するには、dockerグループを作成し、実行ユーザを追加する必要があります。
[centos@ip-XXX-XXX-XXX-XXX ~]$ sudo groupadd docker
[centos@ip-XXX-XXX-XXX-XXX ~]$ sudo gpasswd -a $USER docker
Adding user centos to group docker
[centos@ip-XXX-XXX-XXX-XXX ~]$ sudo systemctl restart docker
[centos@ip-XXX-XXX-XXX-XXX ~]$ exit
注釈
CentOSのGitインストール方法
EC2でCentOS7を実行した場合では、以下のコマンドでGitをインストールできます。適当なディレクトリでインストールコマンドを実行してください。
[centos@ip-XXXX-XXX-XXX-XXX ~]$ sudo yum -y install wget make gcc perl-ExtUtils-MakeMaker curl-devel expat-devel gettext-devel openssl-devel zlib-devel autoconf
// omit
[centos@ip-XXXX-XXX-XXX-XXX ~]$ sudo wget https://www.kernel.org/pub/software/scm/git/git-2.9.5.tar.gz
// omit
[centos@ip-XXXX-XXX-XXX-XXX ~]$ sudo tar xvzf git-2.9.5.tar.gz
// omit
[centos@ip-XXXX-XXX-XXX-XXX ~]$ cd git-2.9.5
[centos@ip-XXXX-XXX-XXX-XXX ~]$ sudo make configure
// omit
[centos@ip-XXXX-XXX-XXX-XXX ~]$ sudo ./configure --prefix=/usr
// omit
[centos@ip-XXXX-XXX-XXX-XXX ~]$ sudo make install
// omit
[centos@ip-XXXX-XXX-XXX-XXX ~]$ git --version
git version 2.9.5
以降は、EC2でCentOS7を実行し、DockerやGitをインストール済みしたマシン上での操作を前提に話を進めていきます。
GitHubへプッシュしたBackend、Backend For Frontend双方のソースコードプロジェクトにあるDockerfileを使って、Dockerイメージを作成します。 以下では、ソースコードをGitHubからクローンし、Backendアプリケーションのプロジェクト直下にあるDockerfileを指定して、docker buildコマンドでDockerイメージを作成しています。 GitHubからチェックアウトするソースコードのプロジェクトやdocker buildコマンドで指定する-tオプションのレポジトリ名は適宜、自身が実行する環境に合わせて変更してください。 また、下記ではレジストリをDocker Hubを前提にしたコマンド実行例です。
[centos@ip-XXX-XXX-XXX-XXX ~]$ sudo git clone https://github.com/debugroom/mynavi-sample-aws-ecs.git
[centos@ip-XXX-XXX-XXX-XXX ~]$ cd mynavi-sample-aws-ecs
[centos@ip-XXX-XXX-XXX-XXX mynavi-sample-aws-ecs]$ docker build backend/ -t debugroom/mynavi-sample-ecs-backend:latest
// omit
[centos@ip-XXX-XXX-XXX-XXX ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
debugroom/mynavi-sample-ecs-backend latest 1f3ea8c79c62 1 minites ago 985 MB
Dockerイメージが作成されたら、Docker Hubへプッシュします。
[centos@ip-XXX-XXX-XXX-XXX ~]$ docker login
// omit - enter USERID and password
[centos@ip-XXX-XXX-XXX-XXX ~]$ docker push debugroom/mynavi-sample-ecs-backend:latest
これでコンテナイメージをレジストリにプッシュできました。次回は、実際にECSコンテナを実行するためのECSクラスタを構築します。