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の内容としては、次のような感じです。
- 事前にダウンロードしておいたjboss-as-7.1.1をADDでイメージに追加する
- 設定ファイルを変更する必要があるので、standalone.xmlもADDでイメージに追加する
- JBoss実行用のjbossユーザーを作成し、jboss-as-7.1.1の所有者をjbossユーザーに変える
- 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
です。
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用のインストールのマニュアルに記載されていた。ブログ等を見るのも良いけど、トラブった時は一次情報を参照せよという良い例。
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
Mac OSXでDocker(インストール編)
公式サイト
Mac OS X - Docker Documentation
インストール
ダウンロードしたBoot2Docker-1.4.1.pkgを開くと、2ステップでboot2dockerツールのインストールは完了します。
ここまで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
export JAVA_HOME=/usr/java/jdk1.7.0_60/
- 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が一緒に付いてくるから、それを実行してみましょう。
スタートページのOpen Sampleでサンプルの一覧が見られる。
まあ、最初はHelloWorldだろうと。
フロー定義の見た目はこんな感じ。 HTTPでリッスンして、文字列を返すだけのフロー。
取りあえず試すだけなら、Anypont Studioの中に埋め込みMuleが入っているのでプロジェクトを右クリックして、「Run AS-> Mule Application」でOK。
サーバー上のMuleへのデプロイは上記のURLの「Deploy on a Mule Enterprise Server」の通りにやればOK。
Anypont StudioでExportする
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の内容からまとめます。
ITmediaのセミナーで成田空港さんの話し。iAirport戦略。
NariTra、NRT_AirportNavi、成田コンシェルNariCo。
— ryohei sogo (@rsogo) 2014, 6月 24
タブレット端末を活用した、旅客案内。
もともとはNotesで作ったナレッジDBの情報をもとに、対面ベースで案内していた。
— ryohei sogo (@rsogo) 2014, 6月 24
元々はカウンターではNotesを使ってご案内ができていたが、後述の巡回案内ではNotesにアクセスできないという情報の差が課題だったそうです。Notesをモバイルで持ち出すというのは面白いですね。需要ありそう。
Notesベースの場合は、インフォメーションセンターで情報提供。各カウンターで同レベルの情報を持つことができ、上手く行っていた。
一方、巡回案内は紙と携帯電話で調べて情報提供。こちらをタブレット化。
— ryohei sogo (@rsogo) 2014, 6月 24
タブレットに搭載している機能。
旅客案内、運行情報、各種マニュアル、ナビゲーションアプリ、筆談アプリ、音声翻訳アプリ、乗換案内アプリ。
筆談アプリは結構便利に使われている。
— ryohei sogo (@rsogo) 2014, 6月 24
@rsogo 巡回案内の方からのニーズは、カウンターとの情報格差を無くして欲しいというもの。Notesの情報を有効活用。使用頻度の髙いDBに絞って、スモールスタートした。
— ryohei sogo (@rsogo) 2014, 6月 24
あえてPCと同じような画面に合わせることで、教育が不要ですぐにユーザーが使い始められた。
— ryohei sogo (@rsogo) 2014, 6月 24
これは、いつもモバイルならではの使い易いUIにしましょうと、提案することが多いので、そうなんだ!と思いました。
@rsogo 3つの導入効果。
サービス品質の向上。
スムーズな利用開始。
スタッフの自発的な業務向上。委託先のスタッフの方であってもタブレットのカメラを使って、情報共有など進んだ使い方が行われている。
— ryohei sogo (@rsogo) 2014, 6月 24
これ、理想。
@rsogo モバイルか推進のポイント。
利用者の声を聞く。
機能を欲張らない。
既存のデータ・資産を有効活用。もともと活用していたシステムを活用。
— ryohei sogo (@rsogo) 2014, 6月 24
これは自分のセミナーでも同じメッセージです。 小さく、素早く始めて、利用状況を見ながら、改善していく。
@rsogo 今後のiAirport戦略。
NariCoのデジタルサイネージ化。
将来的には技術的な課題が解決すれば、音声対話型の総合情報窓口としたい。
— ryohei sogo (@rsogo) 2014, 6月 24
@rsogo 今後のiAirport戦略。
Fast Travel。
ビーコンとアプリを活用した下記を検討中。
・荷物のタグの電子化
・お客さんがどこにいるのか位置情報把握
— ryohei sogo (@rsogo) 2014, 6月 24
iBeacon面白そうですね!
@rsogo コペンハーゲン空港では、空港スタッフがGoogle Glassを使って、案内業務を行っている。
おもしろいなー。
— ryohei sogo (@rsogo) 2014, 6月 24