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」
上記ページの説明が非常にわかりやすいので、引用させていただく。
イメージを起動するとコンテナが作成される。その中で何らかの処理を行ったとしても、先ほどのように、再度イメージから起動すると新しいコンテナが作成されるため、行った処理はなかったことになる。
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
途中で、ライセンスに合意する必要があるので、コンテナ内から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 のインストール
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のネットワーク構成については、
の以下の図がわかりやすいので、こちらも引用させていただく。
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 の起動
追記
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) へのアクセス成功!
とりあえずは、こんな感じか。
コンテナが自分の IP アドレスを取得するスクリプト勉強になりました!
(個人的にはちゃんと IP をバインドしたかったのですが、いちいち調べたり、横着して 0.0.0.0 をバインドしてました。。)
なお、今回の場合は合わないですが、ホスト OS から IP アドレスを知りたい場合は以下のように確認できます。
docker inspect | grep IP
“IPAddress”: “172.17.0.2”,
“IPPrefixLen”: 16,
また、JDK のダウンロードですが、以下のようにすれば wget で取得できます。
wget –no-check-certificate –no-cookies –header “Cookie: oraclelicense=accept-securebackup-cookie” http://download.oracle.com/otn-pub/java/jdk/7u67-b01/jdk-7u67-linux-i586.rpm