読者です 読者をやめる 読者になる 読者になる

あさのひとりごと

3日坊主にならないように、全力を尽くします。 記事は個人のひとりごとです。所属する組織の意見を代表するほど、仕事熱心じゃないです。

Docker on AzureでJavaEE実行環境を構築する手順

はじめに

Microsoftが提供しているクラウドサービスであるAzureを使って、Ubuntuで動くJavaEEによるWebアプリケーションの実行環境をDockerを使って作ってみたいとおもいます。

前提知識

Microsoft Azureは、マイクロソフトクラウドプラットフォーム(PaaS/IaaS)です。WindowsServerだけでなくUbuntuなどのLinuxサーバも動作するオープンなクラウドサービスです。

  • Dockerとは?

Docker(ドッカー)は、仮想化環境でアプリケーションを管理/実行するためのオープンソースのミドルウエアです。Linuxカーネル上で動作するのが特徴です。アプリケーションと実行環境をすべて含めて「Dockerイメージ」にパッケージングして、管理できます。

JavaEEとは、Javaによる大規模Webアプリケーション構築のためのエンタープライズなプラットフォームです。JSF/EJB/JDBC/JNDI/Servlet/JSP/JTA/JAX-RS/CDI/ELなどの技術仕様を総称したもので、、、(続きを読む)

1. JavaEEアプリのwar作成

適当なWebAPSampleという名前のサンプルアプリを作ります。 今回は、動かすだけなのでJSFのひな形そのままな感じのもので。 作成したWebAPSample.warファイルを使ってDockerイメージを作っていきます。

2. Dockerイメージ作成

作成したwarファイルをGlassFishで動かすためのDockerfileを作成します。

なお、Dockerをクライアントにインストールしていないときは、DockerToolboxをダウンロードしてインストールします。

Dockerイメージは、GlassFish公式イメージをベースに作ります。

GlassFishは、オープンソースのWebアプリケーションサーバで、JavaEEの参照実装です。

GlassFishのWeb管理コンソールを使うため、パスワードの設定やセキュリティの設定をして、サービス用の8080番ポートと管理コンソール用の4848番ポートを開放します。

Dockerfileはこんな感じで。

# GlassFishでWebアプリケーションをデプロイする
# 
# ベースイメージの取得
FROM glassfish:4.1-jdk8

# 作成者情報
MAINTAINER 0.1 asashiho@mail.asa.yokohama

# 環境変数の設定
ENV GLASSFISH_HOME /usr/local/glassfish4
ENV PASSWORD glasspass
ENV TMPFILE /tmp/passfile

# 管理者パスワードとセキュリティの設定
RUN echo "AS_ADMIN_PASSWORD=" > $TMPFILE && \
    echo "AS_ADMIN_NEWPASSWORD=${PASSWORD}" >> $TMPFILE  && \
    asadmin --user=admin --passwordfile=$TMPFILE change-admin-password --domain_name domain1 && \
    asadmin start-domain && \
    echo "AS_ADMIN_PASSWORD=${PASSWORD}" > $TMPFILE && \
    asadmin --user=admin --passwordfile=$TMPFILE enable-secure-admin && \
    asadmin --user=admin stop-domain && \
    rm $TMPFILE

# warコンテンツの配置
ADD WebAPSample.war $GLASSFISH_HOME/glassfish/domains/domain1/autodeploy

# ポートの解放
EXPOSE 4848 8080

# glassfishの実行
CMD ["asadmin", "start-domain", "-v"]

このDockerfileと作成したWebAPSample.warを同じディレクトリに置きます。 そして、docker buildコマンドでイメージを作成します。

$ ls
Dockerfile  WebAPSample.war

$ docker build -t asashiho/glassfish .

作成したイメージをDockerHubにアップロードします。

$ docker login
$ docker push asashiho/glassfish

作成が面倒な方は、こちらのDockerイメージを使ってください。 docker-glassfish

3. AzureでのDocker実行環境作成

Azure上でGlassFishコンテナを動かすために、Dockerの実行環境を作ります。 Docker Machineは、Dockerの実行環境を自動生成するためのコマンドです。各種クラウドVMなどに環境を作ってくれます。

Azureだけじゃなくて、AWS/SoftLayer/Rackspace/VirtualBoxなどさまざまな環境にDocker実行環境を自動生成できます。

今回は、docker-machneコマンドで、Azure上にDocker実行環境を構築します。

まず事前準備として、Azureにアクセスするため、証明書を作成します。 こんな感じで。

$ openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mycert.pem -out mycert.pem
$ openssl pkcs12 -export -out mycert.pfx -in mycert.pem -name "My Certificate"
$ openssl x509 -inform pem -in mycert.pem -outform der -out mycert.cer

生成した証明書(mycert.cer)を[Azure クラシック ポータル]-[設定]-[管理証明書]-[アップロード]からアップロードします。

これで、準備完了です。

準備が完了したので、いよいよAzure仮想マシン上にDocker実行環境を構築します。 仮想マシン名(docker-asaasa)は任意の名前に変更してください。

$ docker-machine create -d azure \
 --azure-subscription-id="サブスクリプションID" \
 --azure-subscription-cert="mycert.pem" \
 --azure-location "Japan Wast" \
 --azure-username "ユーザ名" \
 --azure-password "パスワード" \
 docker-asaasa

これでAzureの仮想マシン生成&Dockerの環境構築が完了です。 ちゃんと動いているのが分かります。

$ docker-machine ls
NAME             ACTIVE   DRIVER       STATE     URL                                      SWARM
default          -        virtualbox   Running   tcp://192.168.99.100:2376      
docker-asaasa   *        azure        Running   tcp://docker-asaasa.cloudapp.net:2376

4. GlassFishコンテナを動かす

作成したAzure仮想マシンに以下のコマンドでアクセスします。

$ docker-machine env docker-asaasa
$ export DOCKER_TLS_VERIFY="1"
$ export DOCKER_HOST="****"
$ export DOCKER_CERT_PATH="****"
$ export DOCKER_MACHINE_NAME="docker-asaasa"


$ docker-machine ssh docker-asaasa
Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-36-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

 System information disabled due to load higher than 1.0

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

次のコマンドで、先ほど作成したGlassFishのDockerイメージをダウンロードします。

$ sudo docker pull asashiho/glassfish

Dockerイメージからコンテナを起動します。 ここで、あらかじめAzure仮想マシンのエンドポイントに8080ポートと4848ポートを設定しておいてください。

# コンテナの起動
$ sudo docker run -d -p 8080:8080 -p 4848:4848 asashiho/glassfish

# コンテナの確認
$ sudo docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                                        NAMES
6ea4bd4c5368        asashiho/glassfish   "asadmin start-domain"   30 minutes ago      Up 29 minutes       4848/tcp, 8181/tcp, 0.0.0.0:8080->8080/tcp   thirsty_poincare

5. 動作確認

GlassFishでサンプルアプリが動作していることを確認するために、ブラウザから以下のURLにアクセスします。

http://(Azure仮想マシンDNS名):8080/WebAPSample/ docker1.png

6. Azure上のDocker実行環境削除

削除もばさっと。

$ docker-machine stop docker-asaasa
$ docker-machine rm docker-asaasa

今回はAzureで動作させましたが、DockerMachineを使うと、どのクラウドサービスで動かしてもdocker-machineコマンドで一括操作できます。 クラウドごとのCLIは不要です。

まとめ

AzureといえばMicrosoftMicrosoftといえばWindowsMicrosoftといえば.NETなイメージなのですが、Dockerも動くし、UbuntuJavaも動きました。