そごうソフトウェア研究所

SOA、開発プロセス、ITアーキテクチャなどについて書いています。Twitterやってます@rsogo

Docker上でのJBossの構築 on OSX

これまでOSX(Yosemite 10.10.1)で下記の実験を行いました。

Mac OSXでDocker(インストール編) - そごうソフトウェア研究所

DockerでコンテナにJavaを入れるまで - そごうソフトウェア研究所

今回はJBossを入れて動かすところまでやっていきたいと思います。

Dockerfile

# Dockerfile
FROM centos:6

MAINTAINER Ryohei Sogo

# install package
RUN yum update -y

RUN yum install -y java-1.7.0-openjdk
RUN yum install -y java-1.7.0-openjdk-devel
RUN yum install -y wget
RUN yum install -y tar

# JBoss
ADD ./files/jboss-as-7.1.1.Final.tar.gz /opt
# なぜかADDしただけで解凍されている
# RUN tar -zxf /var/tmp/jboss-as-7.1.1.Final.tar.gz -C /opt
ADD ./files/standalone.xml /opt/jboss-as-7.1.1.Final/standalone/configuration/

# Create user
RUN useradd jboss
RUN chown -R jboss /opt/jboss-as-7.1.1.Final

# JBoss
EXPOSE 9080

Dockerfileの内容としては、次のような感じです。

  1. 事前にダウンロードしておいたjboss-as-7.1.1をADDでイメージに追加する
  2. 設定ファイルを変更する必要があるので、standalone.xmlもADDでイメージに追加する
  3. JBoss実行用のjbossユーザーを作成し、jboss-as-7.1.1の所有者をjbossユーザーに変える
  4. 9080ポートをEXPOSEで公開(standalone.xmlの中で9080ポートを使用するように指定している)

standalone.xmlも晒しておきます。 standalone.xml

なんでか、ADDしただけでtar.gzファイルが解凍されてて、確認しないといけないです。 ADD ./files/jboss-as-7.1.1.Final.tar.gz /opt

コンテナの起動

コンテナを起動します

あとでデーモンモードで起動させるようにするけど、取りあえず今は'-t -i'オプションを指定して、インタラクティブモードでコンテナを起動します。

$ docker run -t -i -P rsogo/apppot_runtime /bin/bash
[root@fbf427c7d0a4 /]# 

コンテナにはいれましたので、jbossユーザーになって、JBossを起動させます。

[root@fbf427c7d0a4 /]# su jboss
[jboss@fbf427c7d0a4 /]$ /opt/jboss-as-7.1.1.Final/bin/standalone.sh 
=========================================================================

  JBoss Bootstrap Environment

  JBOSS_HOME: /opt/jboss-as-7.1.1.Final

  JAVA: java

  JAVA_OPTS:  -server -XX:+UseCompressedOops -XX:+TieredCompilation -Xms64m -Xmx512m -XX:MaxPermSize=256m -Djava.net.preferIPv4Stack=true -Dorg.jboss.resolver.warning=true -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true -Djboss.server.default.config=standalone.xml

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

ホスト側でコンテナの状況を確認します。

起動していますね。コンテナでEXPOSEした9080ポートがホスト側の49158ポートに割り当てられていることも確認できます。

$ docker  ps
CONTAINER ID        IMAGE                         COMMAND             CREATED             STATUS              PORTS                                                                     NAMES
fbf427c7d0a4        rsogo/apppot_runtime:latest   "/bin/bash"         42 seconds ago      Up 40 seconds       0.0.0.0:49155->9080/tcp   pensive_lovelace  

確認

アドレスの確認

$ boot2docker ip
192.168.59.103

実際にアクセスします。 URLはboot2docker ipで確認したIPアドレスと、docker psで確認した際に9080がマッピングされているポートです。 今回の例だとhttp://192.168.59.103:49155です。

f:id:begirama:20150128100335p:plain

OKですね。

OSXのboot2dockerでのIPアドレス確認ではまった

AnsibleからからDocker上のコンテナにsshでアクセスしたいだけなのにえらい時間がかかった。 結論から言うと'boot2docker ip'でOK。

  • 使用例

      $ boot2docker ip
      192.168.59.103
    

はまった経緯は、いろんなDockerのネットワーク周りのブログを見るとdocker0というネットワークインターフェイスができるよ、と書いてあるがifconfigしてもでてこない。

docker inspectでコンテナの情報が表示され、その中のIPアドレスでアクセスできるんだろうと思っていたけど、できない。

 docker inspect --format ' {{ .NetworkSettings.IPAddress }} ' test01
172.17.0.71

$ telnet 172.17.0.71 22
Trying 172.17.0.71...
telnet: connect to address 172.17.0.71: Operation timed out
telnet: Unable to connect to remote host

'boot2docker ip'を使ってみる。

$ boot2docker ip
192.168.59.103

$ telnet 192.168.59.103 22
Trying 192.168.59.103...
Connected to 192.168.59.103.
Escape character is '^]'.
SSH-2.0-OpenSSH_6.0
^C

OK。ちなみにこのIPアドレスの特定の仕方は下記のOSX用のインストールのマニュアルに記載されていた。ブログ等を見るのも良いけど、トラブった時は一次情報を参照せよという良い例。

https://docs.docker.com/installation/mac/

DockerでコンテナにJavaを入れるまで

年末にDockerを入れて、サンプルを実行してみました。

Mac OSXでDocker(インストール編) - そごうソフトウェア研究所

冬休み中に試験環境をDockerで準備することが目標です。

dotinstallを見ながら色々遊んでいましたが、実際の試験環境の構築を始めようと思います。今日はCentOS上にJava環境を構築します。

docker pullでCentOSのイメージを取得

rsogo$ docker pull centos
centos:latest: The image you are pulling has been verified
5b12ef8fd570: Pull complete 
34943839435d: Pull complete 
511136ea3c5a: Already exists 
Status: Downloaded newer image for centos:latest

イメージの確認

rsogo$ docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
rsogo/sshd           latest              296067ca835f        6 minutes ago       625.8 MB
centos               6                   510cf09a7986        5 days ago          202.6 MB
centos               latest              8efe422e6104        5 days ago          210 MB
rsogo/jboss          latest              67acbf60269a        8 days ago          855.2 MB

この記事では、centosのlatestを使用しているけれど、現時点で最新はCentOS 7で、テスト環境としては6が欲しかったので、実際のテスト環境はcentos:6でやっている。

Dockerfileの作成

何度でも同じイメージが作成できるように環境の準備はDockerfileで行います。

FROM centos
MAINTAINER Ryohei Sogo

# ビルド時に実行
RUN yum install -y java-1.7.0-openjdk
RUN yum install -y java-1.7.0-openjdk-devel

# 起動時に実行
CMD ["java", "-version"]

このDockerfileは次の内容を書いています。

  • centosイメージを基に作成する
  • ビルド時にjava-1.7.0-openjdkと、 java-1.7.0-openjdk-develをyumコマンドでインストールするよう
  • 実行時にはjava -versionでインストールされたjavaのバージョンを出力する

ビルドの実行

docker buildコマンドでビルドを行います。 ここではrsogo/javaというタグ名を付けています。

rsogo$ docker build -t rsogo/java .
Sending build context to Docker daemon 3.072 kB
Sending build context to Docker daemon 
Step 0 : FROM centos
 ---> 34943839435d
Step 1 : MAINTAINER Ryohei Sogo
 ---> Using cache
 ---> fa1f439f448f
Step 2 : RUN yum install -y java-1.7.0-openjdk
 ---> Using cache
 ---> 3841ca600101
Step 3 : RUN yum install -y java-1.7.0-openjdk-devel
 ---> Using cache
 ---> bd0a1d4c9937
Step 4 : CMD java -version
 ---> Using cache
 ---> 3adf3b598444
Successfully built 3adf3b598444

このログを取る前に何度かビルドを行っているので、Using cacheと出力されているとおり、Docker内のキャッシュを使ってビルドを行っているようです。 初回は関連パッケージの取得とインストールが行われていました。

実行

docker runコマンドで実行します。

rsogo$ docker run rsogo/java
java version "1.7.0_71"
OpenJDK Runtime Environment (rhel-2.5.3.1.el7_0-x86_64 u71-b14)
OpenJDK 64-Bit Server VM (build 24.65-b04, mixed mode)

DockerfileのCMDで記載したとおり、java -versionが実行され、インストールが成功していることが確認できます。

ps -lで確認すると、実行が終わったプロセスは終了状態になっています。

rsogo$ docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
980ab9c8b558        rsogo/java:latest   "java -version"     18 minutes ago      Exited (0) 18 minutes ago                       naughty_elion       

次はJBossをインストールします。 WebLogicyumでインストールできればいいのに。。。

Mac OSXでDocker(インストール編)

公式サイト

Mac OS X - Docker Documentation

インストール

ダウンロードしたBoot2Docker-1.4.1.pkgを開くと、2ステップでboot2dockerツールのインストールは完了します。

f:id:begirama:20141222082724p:plain

f:id:begirama:20141222082730p:plain

ここまで5分。後は環境設定などをやっていきます。

初期化

boot2docker initで初期化を行います。公開鍵方式の鍵ペアを作成されました。

rsogo$ boot2docker init
Latest release for boot2docker/boot2docker is v1.4.1
Downloading boot2docker ISO image...
Success: downloaded     https://github.com/boot2docker/boot2docker/releases/download/v1.4.1/boot2docker.iso
to /Users/rsogo/.boot2docker/boot2docker.iso
Generating public/private rsa key pair.
Your identification has been saved in /Users/rsogo/.ssh/id_boot2docker.
Your public key has been saved in /Users/rsogo/.ssh/id_boot2docker.pub.

起動

Docker daemonを起動します。

rsogo$ boot2docker start
Waiting for VM and Docker daemon to start...
........................ooooooooooooooooooo
Started.
Writing /Users/rsogo/.boot2docker/certs/boot2docker-vm/ca.pem
Writing /Users/rsogo/.boot2docker/certs/boot2docker-vm/cert.pem
Writing /Users/rsogo/.boot2docker/certs/boot2docker-vm/key.pem

To connect the Docker client to the Docker daemon, please set:
    export DOCKER_HOST=tcp://192.168.59.103:2376
    export DOCKER_CERT_PATH=/Users/rsogo/.boot2docker/certs/boot2docker-vm
    export DOCKER_TLS_VERIFY=1

環境変数等の設定

$(boot2docker shellinit)を($や()もそのまま)実行して、環境変数などをセットします。環境変数を直接.bashrcなどに書くのではなく、このコマンドが実行されるように設定するのが推奨されています。

rsogo$ $(boot2docker shellinit)
Writing /Users/rsogo/.boot2docker/certs/boot2docker-vm/ca.pem
Writing /Users/rsogo/.boot2docker/certs/boot2docker-vm/cert.pem
Writing /Users/rsogo/.boot2docker/certs/boot2docker-vm/key.pem

サンプルの実行

ここまでで準備はできたみたいなので、hello-worldというサンプルがあるのでそれを実行してみます。

rsogo$ docker run hello-world
Unable to find image 'hello-world:latest' locally
hello-world:latest: The image you are pulling has been verified
511136ea3c5a: Pull complete 
7fa0dcdc88de: Pull complete 
ef872312fe1b: Pull complete 
Status: Downloaded newer image for hello-world:latest
Hello from Docker.
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (Assuming it was not already locally available.)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

For more examples and ideas, visit:
 http://docs.docker.com/userguide/

出力された内容を見ると、ローカルにないから、hello-worldのイメージをDocker Hubからダウンロードしています。 その後、"Hello from Docker"という文字列が表示されました。

このエラーが出るときは環境変数の初期化ができていない

rsogo$ docker run hello-world
FATA[0000] Post http:///var/run/docker.sock/v1.16/containers/create: dial unix /var/run/docker.sock: no such file or directory. Are you trying to connect to a TLS-enabled daemon without TLS? 

Mac OSXへのGradleのセットアップ

完全にメモです。

Android Annotationsが使いたかっただけなんだけど、ついでにいろいろ整備する。

Android Annotationsを使うためにGradleを入れたい。GradleをセットアップするためにHomebrewを入れたい。Homebrewは前から気になってたけど、入れてなかったのでついでに入れる。

こちらを参考にさせてていただきつつ、セットアップ。 eclipseでgradleを使うための環境構築 - mi_kami's diary

Rubyが必要らしい。入ってる。

sogo$ ruby -v
ruby 2.0.0p481 (2014-05-08 revision 45883) [universal.x86_64-darwin13]

公式サイトによると、これで一発で入れられるみたい。パスワードを途中で1回入れるだけでセットアップ完了。

    sogo$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    sogo$ brew -v
    Homebrew 0.9.5

このままGradleをインストール

    sogo$ brew install gradle

    ・・・・

    ==> Downloading https://downloads.gradle.org/distributions/gradle-2.1-bin.zip
    ######################################################################## 100.0%
    🍺  /usr/local/Cellar/gradle/2.1: 149 files, 44M, built in 36 seconds

セットアップ完了。

sogo$ /usr/local/Cellar/gradle/2.1/bin/gradle -v

------------------------------------------------------------
Gradle 2.1
------------------------------------------------------------

Build time:   2014-09-08 10:40:39 UTC
Build number: none
Revision:     e6cf70745ac11fa943e19294d19a2c527a669a53

Groovy:       2.3.6
Ant:          Apache Ant(TM) version 1.9.3 compiled on December 23 2013
JVM:          1.8.0 (Oracle Corporation 25.0-b70)
OS:           Mac OS X 10.9.5 x86_64

Mule 3.5のセットアップとサンプルの実行

会社の方で公式ドキュメントして書くのだけど、ひとまずこちらに書いてみます。

目標は、取りあえずインストールして、実行してみるところまで。

インストール

使用可能な環境はここでチェック。OSはMuleがサポートしているJDKがサポートしていればOKっぽい。

http://www.mulesoft.org/documentation/display/current/Hardware+and+Software+Requirements

どんな構成にするか

デプロイモードを選択する。

http://www.mulesoft.org/documentation/display/current/Deployment+Scenarios

ここでいうデプロイメントとは、Mule自体の配置のこと。Mule上で動作するモジュールのデプロイメントではない。

MuleはAPサーバー上でも動かすことができるけど、基本はスタンドアローンでOK。

Mule Management Consoleって使うの?

http://www.mulesoft.org/documentation/display/current/Mule+Management+Console

いろいろな管理機能が提供される。Enterprise Editionが必要。

インストールの手順はこれの「Mule Community Runtime」のタブに従ってやればOK。基本、スタンドアローン構成ならZipを解凍するだけ。

http://www.mulesoft.org/documentation/display/current/Downloading+and+Launching+Mule+ESB+-+hid

  1. Javaセットアップ Javaをセットアップして、JAVA_HOME設定

export JAVA_HOME=/usr/java/jdk1.7.0_60/

  1. Muleセットアップ 解凍するだけ。まじ簡単。

bin/muleを実行で起動。終了するときはCtlr+C。

起動停止

$MULE_HOME\bin\mule.bat start|stop

起動オプションなんかは下記にまとまっている。

http://www.mulesoft.org/documentation/display/current/Starting+and+Stopping+Mule+ESB

自分で作ったモジュールを動かしてみよう

Anypont Studioを入れるとSampleが一緒に付いてくるから、それを実行してみましょう。

f:id:begirama:20140627084110p:plain

スタートページのOpen Sampleでサンプルの一覧が見られる。

f:id:begirama:20140627084119p:plain

まあ、最初はHelloWorldだろうと。

f:id:begirama:20140627084123p:plain

フロー定義の見た目はこんな感じ。 HTTPでリッスンして、文字列を返すだけのフロー。

取りあえず試すだけなら、Anypont Studioの中に埋め込みMuleが入っているのでプロジェクトを右クリックして、「Run AS-> Mule Application」でOK。

サーバー上のMuleへのデプロイは上記のURLの「Deploy on a Mule Enterprise Server」の通りにやればOK。

Anypont StudioでExportする

f:id:begirama:20140627084441p:plain

f:id:begirama:20140627084448p:plain

f:id:begirama:20140627084455p:plain

Muleへのデプロイ

Mule HOMEのappsフォルダにzipを置くだけ。 Muleがポーリングをしていて、しばらくするとzipが解凍されます。

[sogo@localhost mule-standalone-3.5.0]$ cd apps/
[sogo@localhost apps]$ ls
default  default-anchor.txt

appsフォルダにエクスポートしたhello-world.zipを置くと・・・・

[sogo@localhost apps]$ cp ~/hello-world.zip .
[sogo@localhost apps]$ ls
default  default-anchor.txt  hello-world.zip

しばらくするとzipが展開されてデプロイされている。

[sogo@localhost apps]$ ls
default  default-anchor.txt  hello-world  hello-world-anchor.txt

Muleのデプロイログ

同じタイミングでMule側のログには、サンプルアプリが置かれたことを検知して、インストールして起動した旨のログがでます。

INFO  2014-06-26 21:26:12,950 [Mule.app.deployer.monitor.1.thread.1] org.mule.module.launcher.ArtifactArchiveInstaller: Exploding a Mule artifact archive: file:/home/sogo/mule/mule-standalone-3.5.0/apps/hello-world.zip
INFO  2014-06-26 21:26:13,008 [Mule.app.deployer.monitor.1.thread.1] org.mule.module.launcher.application.DefaultMuleApplication: 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ New app 'hello-world'                                    +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
INFO  2014-06-26 21:26:13,009 [Mule.app.deployer.monitor.1.thread.1] org.mule.module.launcher.log4j.ArtifactAwareRepositorySelector: Found logging config for application 'hello-world' at 'file:/home/sogo/mule/mule-standalone-3.5.0/conf/log4j.properties'
INFO  2014-06-26 21:26:15,796 [Mule.app.deployer.monitor.1.thread.1] org.mule.module.launcher.MuleDeploymentService: 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Started app 'hello-world'                                +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

いやー簡単ですね。

ITmediaのセミナーでの成田空港さんの事例

ITmediaさんのセミナーで、企業でのモバイルアプリの取り組みの事例などをお話しさせてもらいました。

そちらの内容は、別途、公開しますが、今日は同じセミナーで成田空港さんが事例を紹介されていましたので、Twitterの内容からまとめます。

元々はカウンターではNotesを使ってご案内ができていたが、後述の巡回案内ではNotesにアクセスできないという情報の差が課題だったそうです。Notesをモバイルで持ち出すというのは面白いですね。需要ありそう。

これは、いつもモバイルならではの使い易いUIにしましょうと、提案することが多いので、そうなんだ!と思いました。

これ、理想。

これは自分のセミナーでも同じメッセージです。 小さく、素早く始めて、利用状況を見ながら、改善していく。

iBeacon面白そうですね!