Docker で 実際に Java EE 環境をつくりながらコマンドを覚える

Java EE の環境をDockerを使って構築してみる。

Docker自体のインストールは、こちら

 

[root@localhost] #プロンプトがDockerが動いているホストOSのもので、bash-4.2# プロンプトが、Docker上で動いているOSのプロンプトとなっている。

 

1.CentOS 7 の作成

1.1 CentOS 7 の Docker イメージを取得する

docker pull で Docker レジストリから Dockerのイメージを取得する。

https://registry.hub.docker.com/_/centos/

[root@localhost ~]# docker pull centos:latest
Pulling repository centos                                                                                  
87e5b6b3ccc1: Download complete                                                                            
511136ea3c5a: Download complete                                                                            
5b12ef8fd570: Download complete 

これだけ。ここまで数分。

1.2 取得したイメージの内容を確認する

docker images でイメージの確認が出来る。

[root@localhost ~]# docker images                                                                          
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos              latest              87e5b6b3ccc1        17 hours ago        224 MB

1.3 対話モードでCentOS を起動し、yum を更新

docker run –i で対話モードで イメージを起動。

[root@localhost ~]# docker run -it centos /bin/bash                                                                     
bash-4.2# yum update -y
Loaded plugins: fastestmirror
base                                                                                             | 3.6 kB  00:00:00     
extras                                                                                           | 3.4 kB  00:00:00     
updates                                                                                          | 3.4 kB  00:00:00     
(1/4): extras/7/x86_64/primary_db                                                                |  26 kB  00:00:00     
(2/4): base/7/x86_64/group_gz                                                                    | 157 kB  00:00:00     
(3/4): updates/7/x86_64/primary_db                                                               | 3.5 MB  00:00:02     
(4/4): base/7/x86_64/primary_db                                                                  | 4.9 MB  00:00:03     
Determining fastest mirrors
 * base: www.ftp.ne.jp
 * extras: www.ftp.ne.jp
 * updates: www.ftp.ne.jp
No packages marked for update

1.4 コンテナを確認

一旦、exit で、対話モードを抜けると、コンテナが作成される。docker ps –a ですべてのコンテナを確認

[root@localhost ~]# docker ps -a                                                                                                                          
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                          PORTS               NAMES
0f7cba6dab86        centos:latest       /bin/bash           5 minutes ago       Exited (0) About a minute ago                       hopeful_sinoussi    

0f7cba6dab86 というIDのコンテナが作成される。先ほど、Dockerリポジトリから取得したのは、Docker イメージで、イメージを起動することでコンテナが作成される。

これから始める「DockerでかんたんLAMP環境 for CentOS」

上記ページの説明が非常にわかりやすいので、引用させていただく。

docker-immutable-infrastructure-51

イメージを起動するとコンテナが作成される。その中で何らかの処理を行ったとしても、先ほどのように、再度イメージから起動すると新しいコンテナが作成されるため、行った処理はなかったことになる。

1.5 コンテナを再開

となると、作業を一旦中断して、後ほど再開出来ないのか?

というわけではなく、docker restart でコンテナを再開出来る。

[root@localhost ~]# docker restart 0f7cba6dab86                                                                                                       
0f7cba6dab86

1.6 コンテナの実行状況を確認

先ほど、docker ps –a でコンテナを確認したが、-a ですべてのコンテナを確認できるが、docker ps で、起動中のコンテナを確認出来る。

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
0f7cba6dab86        centos:latest       /bin/bash           17 minutes ago      Up About a minute                       hopeful_sinoussi    

コンテナが動いていることが確認出来た。

1.7 コンテナに接続

コンテナが動いているので、そこに接続したい。が、SSHでつなく訳ではない。そもそもコンテナで実行されているCentOSでは、sshd が動いていない。docker attach で接続する。

[root@localhost ~]# docker attach 0f7cba6dab86                                                                                                             
bash-4.2#

接続できた。

2. Oracle JDK のインストール

Oracle JDK をダウンロードする。

http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html

oracle_jdk_linux

途中で、ライセンスに合意する必要があるので、コンテナ内からwget を使ってダウンロード出来ない。なので、ホストOSのディレクトリにダウンロードしたファイルを置いておき、Docker コンテナ の ディレクトリに、ダウンロードファイルを置いたホストのパスを docker run –v でアタッチして起動することでホストのディレクトリがコンテナ内から参照可能になる。

以下の例では、ホストの /home/piroto/Downloads を コンテナの /opt/jdk に接続している。

[root@localhost ~]# docker run -it -v /home/piroto/Downloads:/opt/jdk centos /bin/bash                                                                     
bash-4.2# ls /opt/jdk
jdk-7u67-linux-i586.rpm
bash-4.2# 

2.1 JDKを入れるための準備

以下がインストールされていないと、JDKのインストールが失敗する。

bash-4.2# yum install -y libgcc_s.so.1
bash-4.2# yum install -y ld-linux.so.2

2.2 JDKのインストール

bash-4.2# rpm -Uvh /opt/jdk/jdk-7u67-linux-i586.rpm 
Preparing...                          ################################# [100%]
Updating / installing...
   1:jdk-2000:1.7.0_67-fcs            ################################# [100%]
Unpacking JAR files...
        rt.jar...
        jsse.jar...
        charsets.jar...
        tools.jar...
        localedata.jar...
        jfxrt.jar...
        plugin.jar...
        javaws.jar...
        deploy.jar...
bash-4.2# java -version
java version "1.7.0_67"
Java(TM) SE Runtime Environment (build 1.7.0_67-b01)
Java HotSpot(TM) Client VM (build 24.65-b04, mixed mode, sharing)

JDKインストール完了。

2.3 コンテナをコミットしてイメージを作成する

docker ps –a で対象のコンテナを確認し、docker commit でコンテナをコミットする。

[root@localhost ~]# docker commit cfdd3b07a21e centos:jdk                                                                                                  
ff7c1aaf5ac842190b6e7f84c1d4ca6d26643cbe343e51c4da4e7c02addcdb2d

コンテナをコミットするとイメージが作成されるので、docker images で確認

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
centos              jdk                 ff7c1aaf5ac8        About a minute ago   595.7 MB
centos              latest              87e5b6b3ccc1        18 hours ago         224 MB

これで、JDKがインストールされたイメージが作成できた。

2.4 コンテナの削除

イメージ化したので、これまで、実行と停止により作成されたコンテナを削除する。コンテナの削除は、docker rm [コンテナID] を使用する。

すべて一度に削除するには、以下のコマンド。

[root@localhost ~]# docker rm `docker ps -a -q` cfdd3b07a21e

0f7cba6dab86

3.WildFly のインストール

http://wildfly.org/downloads/

8.1.0 Final のダウンロード URL

http://download.jboss.org/wildfly/8.1.0.Final/wildfly-8.1.0.Final.zip

3.1 jdkをインストールしたイメージを起動

対話モードで起動。centos:jdk とタグを指定して、jdk インストール済みイメージを起動する。

[root@localhost ~]# docker run -it centos:jdk /bin/bash                                                                 
bash-4.2# java -version
java version "1.7.0_67"
Java(TM) SE Runtime Environment (build 1.7.0_67-b01)
Java HotSpot(TM) Client VM (build 24.65-b04, mixed mode, sharing)

3.2 ツールをインストール

WildFlyをインストールするためのツールをインストール

bash-4.2# yum install -y unzip
bash-4.2# yum install -y wget

3.3 WildFly をダウンロード、解凍

ダウンロードして、解凍して、zip を削除

bash-4.2# cd /opt
bash-4.2# http://download.jboss.org/wildfly/8.1.0.Final/wildfly-8.1.0.Final.zip
bash-4.2# unzip wildfly-8.1.0.Final.zip
bash-4.2# rm wildfly-8.1.0.Final.zip

3.4 WildFly インストール状態でコミットしておく

[root@localhost ~]# docker commit bfd170f00abf centos:wildfly
5b9f5c0915a1b672c13963b726e042c9c9af3df4390046736bed93f21d882b88

4. WildFly を実行する

Dockerのネットワーク構成については、

Dockerのネットワーク管理とnetnsの関係

の以下の図がわかりやすいので、こちらも引用させていただく。

docker-network-structure

4.1 外部ネットワークにコンテナのポートを公開する

WildFly はデフォルトで、8080ポートと管理用に9990ポートを使用するので、docker run –p でコンテナのポートを同じポート番号のホストに結びつけて起動する

[root@localhost ~]# docker run -i -p 8080:8080 -p 9990:9990 -t centos:wildfly /bin/bash                                                                   
bash-4.2# 

起動させた状態で、ホストへの別のSSHを開き docker ps で確認する。

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                            NAMES
8feabfa7fd0f        centos:wildfly      /bin/bash           6 seconds ago       Up 3 seconds        0.0.0.0:8080->8080/tcp, 0.0.0.0:9990->9990/tcp   grave_morse

4.2 WildFly の起動

追記

以下の記述は、IPアドレスのことがよくわかっていなかった。

standalone モードで起動する場合には、standalone の設定ファイル、例えば、

/opt/wildfly-8.1.0.Final/standalone/configuration/standalone.xml

の記述で 127.0.0.1 を 適宜、0.0.0.0 に変更することで解決した。

127.0.0.1 は、ループバックアドレス。ループバックというのは、宛先にこのIPアドレスを指定してデータを送信すると、自身に宛てたものとして戻ってくる。

0.0.0.0 は、「この」ネットワークのこのホストを表す、特殊なIPアドレス。

 

起動する前に、Docker コンテナの IPアドレスを取得するスクリプトを確認する。

bash-4.2# echo `ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1  -d'/'`
172.17.0.9

IPアドレスが取得できた。

このスクリプトを使用して、WildFly がリッスンするIPアドレスを指定して起動する。

standalone.sh の –b および –bmanagement で 8080、9990 用のIPアドレスを指定する。

しばらくこれに気づかず、ただ単にWildFly を起動し、curl で確認しても以下のようなメッセージが表示されるため、Docker の設定のせいだと思っていた。

追記 設定を0.0.0.0 とすれば、下記の対応は不要 

[root@localhost ~]# curl http://172.17.0.09:8080                                                                                                           
curl: (7) Failed connect to 172.17.0.10:8080; 接続を拒否されました

Dockerでコンテナを動かすと範囲内であいているIPアドレスとなるので、動的にIPアドレスをパラメータに渡せる準備をしておく。

bash-4.2# /opt/wildfly-8.1.0.Final/bin/standalone.sh -b=`ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1  -d'/'` -bmanagement=`ip add
r | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1  -d'/'`
=========================================================================

  JBoss Bootstrap Environment

  JBOSS_HOME: /opt/wildfly-8.1.0.Final

  JAVA: java

  JAVA_OPTS:  -server -Xms64m -Xmx512m -XX:MaxPermSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true

=========================================================================

17:07:06,701 INFO  [org.jboss.modules] (main) JBoss Modules version 1.3.3.Final
17:07:06,961 INFO  [org.jboss.msc] (main) JBoss MSC version 1.2.2.Final
17:07:07,109 INFO  [org.jboss.as] (MSC service thread 1-4) JBAS015899: WildFly 8.1.0.Final "Kenny" starting
17:07:08,325 INFO  [org.jboss.as.server] (Controller Boot Thread) JBAS015888: Creating http management service using socket-binding (management-http)
17:07:08,343 INFO  [org.xnio] (MSC service thread 1-4) XNIO version 3.2.2.Final
17:07:08,354 INFO  [org.xnio.nio] (MSC service thread 1-4) XNIO NIO Implementation Version 3.2.2.Final
17:07:08,405 INFO  [org.jboss.as.connector.subsystems.datasources] (ServerService Thread Pool -- 27) JBAS010403: Deploying JDBC-compliant driver class org.h2.Driver (version 1.3)
17:07:08,430 INFO  [org.wildfly.extension.io] (ServerService Thread Pool -- 31) WFLYIO001: Worker 'default' has auto-configured to 4 core threads with 32 task threads based on your 2 available processors
17:07:08,466 INFO  [org.jboss.as.clustering.infinispan] (ServerService Thread Pool -- 32) JBAS010280: Activating Infinispan subsystem.
17:07:08,475 INFO  [org.jboss.as.webservices] (ServerService Thread Pool -- 48) JBAS015537: Activating WebServices Extension
17:07:08,476 WARN  [org.jboss.as.txn] (ServerService Thread Pool -- 46) JBAS010153: Node identifier property is set to the default value. Please make sure it is unique.
17:07:08,485 INFO  [org.jboss.as.security] (ServerService Thread Pool -- 45) JBAS013171: Activating Security Subsystem
17:07:08,498 INFO  [org.jboss.as.naming] (ServerService Thread Pool -- 40) JBAS011800: Activating Naming Subsystem
17:07:08,531 INFO  [org.jboss.as.jsf] (ServerService Thread Pool -- 38) JBAS012615: Activated the following JSF Implementations: [main]
17:07:08,543 INFO  [org.jboss.as.security] (MSC service thread 1-2) JBAS013170: Current PicketBox version=4.0.21.Beta1
17:07:08,546 INFO  [org.wildfly.extension.undertow] (ServerService Thread Pool -- 47) JBAS017502: Undertow 1.0.15.Final starting
17:07:08,547 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-3) JBAS017502: Undertow 1.0.15.Final starting
17:07:08,600 INFO  [org.jboss.as.connector.logging] (MSC service thread 1-1) JBAS010408: Starting JCA Subsystem (IronJacamar 1.1.5.Final)
17:07:08,604 INFO  [org.jboss.remoting] (MSC service thread 1-4) JBoss Remoting version 4.0.3.Final
17:07:08,630 INFO  [org.jboss.as.connector.deployers.jdbc] (MSC service thread 1-1) JBAS010417: Started Driver service with driver-name = h2
17:07:08,809 INFO  [org.jboss.as.naming] (MSC service thread 1-2) JBAS011802: Starting Naming Service
17:07:08,845 INFO  [org.wildfly.extension.undertow] (ServerService Thread Pool -- 47) JBAS017527: Creating file handler for path /opt/wildfly-8.1.0.Final/welcome-content
17:07:08,854 INFO  [org.jboss.as.mail.extension] (MSC service thread 1-2) JBAS015400: Bound mail session [java:jboss/mail/Default]
17:07:08,912 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-2) JBAS017525: Started server default-server.
17:07:08,960 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-4) JBAS017531: Host default-host starting
17:07:09,138 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-2) JBAS017519: Undertow HTTP listener default listening on /172.17.0.9:8080
17:07:09,363 INFO  [org.jboss.as.server.deployment.scanner] (MSC service thread 1-3) JBAS015012: Started FileSystemDeploymentService for directory /opt/wildfly-8.1.0.Final/standalone/deployments
17:07:09,527 INFO  [org.jboss.as.connector.subsystems.datasources] (MSC service thread 1-3) JBAS010400: Bound data source [java:jboss/datasources/ExampleDS]
17:07:09,836 INFO  [org.jboss.ws.common.management] (MSC service thread 1-2) JBWS022052: Starting JBoss Web Services - Stack CXF Server 4.2.4.Final
17:07:10,708 INFO  [org.jboss.as] (Controller Boot Thread) JBAS015961: Http management interface listening on http://172.17.0.9:9990/management
17:07:10,709 INFO  [org.jboss.as] (Controller Boot Thread) JBAS015951: Admin console listening on http://172.17.0.9:9990
17:07:10,710 INFO  [org.jboss.as] (Controller Boot Thread) JBAS015874: WildFly 8.1.0.Final "Kenny" started in 4262ms - Started 184 of 233 services (81 services are lazy, passive or on-demand)

4.3 起動

Windows8 –> Hyper-V(CentOS 7) –> Docker(CentOS 7 WildFly) へのアクセス成功!

docker_container_access_external

とりあえずは、こんな感じか。