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