Oracle Linux 7.1 の Docker コンテナに SSH で接続する

今回は、表題の通り、Oracle Linux 7.1 の Docker コンテナにSSHでアクセスするために必要な手順を紹介します。

前提として、VirtualBox 上の Oracle LinuxVagrant でゲストOSを構成し、そこに Docker コンテナを立てているものとします。今回は、この Docker コンテナにホストOS からSSHで接続します。

f:id:charlier_shoe:20151022120149p:plain

今回は、過去の記事で作成した環境をベースに作業を行いますので、前提条件の詳細については、左記の記事を参照ください。

手順

1. Vagrantfile の編集

1-1. ポートマッピング

Docker コンテナの22ポートにアクセスするため、ゲストOS <-> Docker コンテナ、およびホストOS <-> ゲストOSのポートマッピングを設定します。

ゲストOS <-> Docker コンテナ のポートマッピングは、”docker run" コマンドのオプションで指定します。Vagrant から Docker コンテナをプロビジョニングをしているので、Vagrantfile 内に run コマンドを記述しています。したがって、この記述にポートマッピングのオプションを追記します。

今回は、Docker コンテナの22番ポートをゲストOSの10022番ポートにマップします("-p 10022:22" という部分)。

Vagrant.configure(2) do |config|
…
    # Provisioner settings
    config.vm.provision "docker" do |d|
        d.build_image "/vagrant", args: "-t charlier_shoe/hoge"
        d.run "charlier_shoe/hoge",
               args: "-d -t -p 10022:22 -p 17001:7001 -v /vagrant:/tmp/shared --memory-swap -1"
    endend

ホストOS <-> ゲストOS のポートマッピングは、Vagrantfile 内のゲストOSの設定で行います。

以下の例では、ゲストOSの10022番ポートを、ホストOSの10022番ポートにマップしています。

Vagrant.configure(2) do |config|
…
    # VM settings
    config.vm.define :dock, primary: true do |dock|
        …
        dock.vm.network "forwarded_port", host: 10022, guest: 10022
    endend

以上の設定により、ゲストOSの22番ポートが、localhostの10022番ポートにマッピングされます。

以下、Vagrantfile の全体を示します。今後 Docker コンテナ上で WebLogic Server を動作させる予定なので、コンテナの7001番に対するポートマッピングの設定も記述しています。

Vagrant.configure(2) do |config|

    # VM settings
    config.vm.define :dock, primary: true do |dock|
        dock.vm.box = "oraclelinux-7.1-x86_64"
        dock.vm.provider "virtualbox" do |v|
            v.name = "dock"
            v.cpus = "2"
            v.memory = "4096"
        end
        dock.vm.network "forwarded_port", host: 10022, guest: 10022
        dock.vm.network "forwarded_port", host: 17001, guest: 17001
    end

    # Provisioner settings
    config.vm.provision "docker" do |d|
        d.build_image "/vagrant", args: "-t charlier_shoe/hoge"
        d.run "charlier_shoe/hoge",
               args: "-d -t -p 10022:22 -p 17001:7001 -v /vagrant:/tmp/shared --memory-swap -1"
    end
end

2. Dockerfile の編集

Dockerfile を編集して、コンテナのビルド時に、コンテナに対して必要な構成変更をおこなうようにします。
今回利用するコンテナの場合、以下の構成変更を行う必要があります。

  • root ユーザーのパスワードの変更
  • PAM認証の設定変更
  • SSH ホストキーの構成
  • 22番ポートの開放
  • "docker run" 実行時の、SSH デーモンの起動

2-1. root ユーザーのパスワードの設定

本記事では、root ユーザーで接続することにします。
今回利用するコンテナ(Oracle のオフィシャル)では、root ユーザーのパスワードがわからない(設定されていない?)ので、ここで所望のパスワードに変更しておきます。

Dockerfile に記述する内容は、以下のとおりです。

RUN echo 'root:root' | chpasswd

2-2. PAM認証の設定変更

この手順をやっておかないと、SSH 接続で認証が終わった直後に切断される現象が起きます。

Docker の公式サイトのガイドにしたがって、Dockerfile に以下の記述を追加します。

RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

/etc/pam.d/sshd ファイルを編集して、SSH デーモンに適用される PAM認証の設定に手を入れているようです。
ちなみに、/etc/ssh/sshd_config を編集して PAM認証を無効にする方法が紹介されている場合もありますが、Oracle Linux のような RedHat 系のディストリビューションでは、この方法はサポートされていないようです。

2-3. SSH ホストキーの構成

今回利用するコンテナは、そのままでは SSH のホストキーが配置されていないので、新たに作成する必要があります。

Dockerfile に記述する内容は、以下のとおりです。

RUN /usr/bin/ssh-keygen -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''
RUN /usr/bin/ssh-keygen -t ecdsa -b 256 -f /etc/ssh/ssh_host_ecdsa_key -N ''
RUN /usr/bin/ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ''

ssh-keygen コマンドで、所定のパスにキーを生成しています。
キーのアクセス権を絞っておかないと、SSH デーモンの起動時にエラーになるような気がしますが、今回は不要でした。

2-4. 22番ポートの開放

22番ポート(SSH の通信用のポート)を解放して、外部からのアクセスを受け付けるようにします。

Dockerfile に記述する内容は、以下のとおりです。

EXPOSE 22

2-5. "docker run" 実行時の、SSH デーモンの起動

コンテナの起動とともに SSH デーモンが起動するようにしておきます。

Dockerfile に記述する内容は、以下のとおりです。

CMD ["/usr/sbin/sshd", "-D"]

以上で Dockerfile の編集は完了です。以下に Dockerfile の全体を示します。

FROM oraclelinux:latest
MAINTAINER Oracle Linux Product Team <ol-ovm-info_ww@oracle.com>

RUN yum install -y openssh-server
RUN yum install -y openssh-clients

RUN echo 'root:root' | chpasswd
# RUN sed -i 's/#PermitRootLogin yes/PermitRootLogin without-password/' /etc/ssh/sshd_config
# RUN sed -i 's/PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config

# edit PAM auth configuration
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

# generate SSH host key
RUN /usr/bin/ssh-keygen -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''
## For ECDSA keys, the -b flag determines the key length by selecting from one of
## three elliptic curve sizes: 256, 384 or 521 bits.
RUN /usr/bin/ssh-keygen -t ecdsa -b 256 -f /etc/ssh/ssh_host_ecdsa_key -N ''
## Ed25519 keys have a fixed length and the -b flag will be ignored.
RUN /usr/bin/ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ''

EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

3. Docker コンテナをプロビジョニングする

いよいよ Docker コンテナをプロビジョニングします。
Vagrantfile を配置したフォルダをカレントにして、以下のコマンドを実行してください。

(vagrant up が終わっている状態)
$ vagrant provision

続いて、SSH でコンテナに接続してみます。

$ ssh -p 10022 root@localhost

パスワードが聞かれるので、"root" と入力します。これでコンテナにアクセスできるはずです。

英字キーボードで [CapsLock] と [Ctrl]、[ESC] と "`~" を入れ替える

今回は、入力装置系の記事です。 英字キーボードで、以下のようなキー配列の変更をする方法を紹介します。

  • キー配列
    • [CapsLock] <-> [Ctrl]
    • [ESC] <-> "`~"
  • OS

普段エディタとしてVimを使っていると、[ESC] を頻繁に利用することになります。一般的なキーボードは[ESC]がFnキーの列の一番左にあり、ホームポジションの手の位置から、かなり離れています。
そこで、[ESC] を、普段ほとんど使うことのない "`~" キーと入替えてしまいます。
また、ついでに [CapsLock] と [Ctrl] も入替えます。これはまあ、定番なので、理由は気にしないでください。

手順

今回紹介する手順では、レジストリにScancode Mapという設定を追加します。具体的な手順は「CapsLockキーとCtrlキーを入れ替え、さらに半角・全角キーとESCキーを入れ替える」を参考にしてください。

上記の手順の中で、Sacncode Mapに記述するバイナリ値を以下のように設定します。

00 00 00 00 00 00 00 00
05 00 00 00 1d 00 3a 00
3a 00 1d 00 01 00 29 00
29 00 01 00 00 00 00 00

後はマシンを再起動して、レジストリの編集を反映させればOKです。

レジストリの記述内容の意味は、上記サイトに記載があります。本記事の手順は、[ESC] のスキャンコード "01" と "`~" のスキャンコード "29" を、上記サイトの手順に当てはめている事になります。

あとはスキャンコードがわかれば、自分で好きなようにキー配列をカスタマイズできるはずです。
キーのスキャンコードの一覧は、「Windows-TIPS-レジストリを修正してCAPSLOCKの割り当て変更 - yanor.net-wiki」を参考にしてください。

参考

Vagrant + Docker で Oracle Linux 7.1のコンテナを使う

VagrantVirtualbox 上に Oracle Linux 7.1 を動作させ、その上で Oracle Linux 7.1 の Docker コンテナを動かしてみました。

前提の整理

今回作成した環境の構成は、以下のとおりです。

本記事は、VagrantCygwin はインストール済みの前提で記述します。特に、Cygwin インストール時の注意事項については、過去の記事を参照ください。

Vagrant に vbguest プラグインをインストールする

Docker コンテナの作成で Dokerfile を参照させる際、ホストOSとゲストOSの共有フォルダがあると便利です。
共有フォルダを作るには、Virtualbox の guest additions がゲストOSに適切にインストールされる必要があります。このために、Vagrant にゲストOSの guest additions を自動更新してくれるプラグインをインストールします。

$ vagrant plugin install vagrant-vbguest
Installing the 'vagrant-vbguest' plugin. This can take a few minutes...
Installed the plugin 'vagrant-vbguest (0.10.0)'!

これで、Vagrantfile があるフォルダが、ゲストOS上の /vagrant にマウントされる様になります。

ゲストOSをセットアップする

適当なフォルダを作成し、Vagrantfile を作成します。

$ cd ~/
$ mkdir dock
$ touch ~/dock/Vagrantfile
$ vi ~/dock/Vagrantfile

Vagrantfile の内容は以下のとおりです。

Vagrant.configure(2) do |config|

    # VM settings
    config.vm.define :dock, primary: true do |dock|
        dock.vm.box = "oraclelinux-7.1-x86_64"
    end

    # VM provider settings
    config.vm.provider "virtualbox" do |vb|
        vb.name = "dock"
        vb.cpus = "2"
        vb.memory = "4096"
    end
end

実際にDockerコンテナでアプリケーションを動かしたりする場合、ポートフォワーディングの設定などが必要になりますが、今回はただ動かすだけなので省略します。

ゲストOSを起動します。過去の記事に引き続き、terrywang さんが公開している Oracle Linux 7 の Base Box を利用させていただきます。

$ vagrant box add oraclelinux-7.1-x86_64 http://cloud.terry.im/vagrant/oraclelinux-7-x86_64.box
$ cd dock
$ vagrant up dock

ゲストOSの構築中に、guest additions の更新と再起動が行われます。
また、ssh でゲストOSが利用できるように、/.ssh ファイルの設定もしておきます。こちらは過去の記事の手順を参考にしてください。以降、"ssh dock-root" と打つことで、ゲストOSに root でアクセスできるものとします。

Provisioner(=Docker) をインストールし、Docker デーモンを起動する

ゲストOSに Oracle Linux を使っている場合、 yum のアドオンのリポジトリにアクセスできるように設定をおこなう必要があります。これをやっておかないと、ゲストOSに provisioner (=Docker) をインストールする際に、エラーになってしまいます。

ゲストOSで /etc/yum.repos.d/public-yum-ol7.repo を編集します。

$ ssh dock-root
[root@oraclelinux7:~]$ vim /etc/yum.repos.d/public-yum-ol7.repo

[ol7_addons] 配下の enabled の値を、1 (=有効)に変更します。

…
[ol7_addons]
name=Oracle Linux $releasever Add ons ($basearch)
baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL7/addons/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=1
…

続いて、Vagrantfile に provisioner の設定を追記します。

Vagrant.configure(2) do |config|

    # VM settings
    config.vm.define :dock, primary: true do |dock|
        dock.vm.box = "oraclelinux-7.1-x86_64"
    end

    # VM provider settings
    config.vm.provider "virtualbox" do |vb|
        vb.name = "dock"
        vb.cpus = "2"
        vb.memory = "4096"
    end

    # Provisioner settings
    config.vm.provision "docker"
end

最後に provisioner (=Docker) を起動します。

$ vagrant provision

以上の手順により、ゲストOSに Docker がインストールされ、Docker デーモンが起動します。

Docker イメージをビルドし、コンテナを起動する

いよいよ Docker コンテナを動作させてみます。

まず、ホストOSの Vagrantfile が配置されたフォルダに、Dockerfile という名前でファイルを作成し、以下の内容を記述しておきます。

FROM oraclelinux:latest
MAINTAINER Oracle Linux Product Team <ol-ovm-info_ww@oracle.com>
CMD ["/bin/bash"]

続いて Docker イメージをビルドします。

$ ssh dock-root
root@oraclelinux7:~# docker build -t charlier_shoe/hoge /vagrant

Oracle Linux の Docker イメージは、Docker Hub に公式のものがありますので、それを利用しています。

-t オプションは、ビルドされたイメージにつけるタグ名です。後で、コンテナを起動する際、このタグ名でイメージを指定します。
Dockerfile を配置したフォルダは、ゲストOSの /vagrant に共有フォルダとしてマウントされています。コマンドの最後の "/vagrant" は、Dockerfileの配置先を指定していますが、共有フォルダの設定のおかげで、先の Dockerfile がすでに配置された状態になっています。

続いて、以下のコマンドを実行します。

$ ssh dock-root
root@oraclelinux7:~# docker run -it -v /vagrant:/tmp/shared --name="hoge" charlier_shoe/hoge

上記では、ゲストOSに root でアクセスした後、Docker イメージのビルド、コンテナの起動が行うコマンドを実行しています。オプションの意味は以下のとおりです。

  • -i
    • 標準入力を開いたままにします(=対話モード)
  • -t
    • 擬似ターミナル割り当て(…?)
  • -v /vagrant:/tmp/shared
    • /tmp/shared をゲストOSの /vagrant との共有フォルダに設定します
  • --name="hoge"
    • コンテナの名前を指定します
  • charlier_shoe/hoge
    • イメージのタグの名前を指定しています。この文字列はビルド時につけた名前です。

無事にコンテナが起動すると、コンテナに root ユーザーでアクセスした状態になります。

[root@a76d0766aba6 /]# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
[root@a76d0766aba6 /]# ls /tmp/shared/
Dockerfile  Vagrantfile

/tmp/shared/ に、共有フォルダに配置したファイルがあるのがわかります。
アプリケーションサーバーをインストールしたいときなど、共有フォルダを使うとインストーラを転送する手間が省けて便利です。

exit コマンドを打つと、コンテナがシャットダウンします。

[root@a76d0766aba6 ~]# exit

run コマンドでは、新たにコンテナを作成しようとするため、既存のコンテナを起動するときは start コマンドを使います。

root@oraclelinux7:~# docker start hoge
hoge

起動中のコンテナに複数のターミナルからアクセスしたい場合、ゲストOSから、exec コマンドで bash を起動してやります。

root@oraclelinux7:~# docker exec -it hoge bash

コンテナの停止は stop コマンドです。

root@oraclelinux7:~# docker stop hoge
hoge

VagrantVirtualbox 上に Oracle Linux 7.1 を動作させ、その上で Oracle Linux 7.1 の Docker コンテナを動かす手順は、以上です。

JRockit JVMのガベージコレクションのまとめ

JRockit JVMガベージコレクションの仕組みを、公式のドキュメント読んでざっくりまとめてみました。
改めて調べてみると、HotSpot JVM とほとんど変わらないみたいです。既にご存知の方には釈迦に説法ですが、JVM のメモリ管理について初学者の方は、参考にしてみてください。

JRockit JVM が使用するメモリ領域

スタック領域や、パーマネント領域といった分け方もありますが、参照先では以下のような分け方で説明されています。

  • ヒープメモリ
    • 二世代のガベージコレクションが利用される場合、「ナーサリ(若い領域)」と「古い領域」の2つの領域(世代)に分割される *1
    • ナーサリ(若い領域)
      • 新しいオブジェクトの割り当てのために予約されている領域
    • 古い領域
      • 若いコレクションで昇格されたオブジェクトや、大規模オブジェクトが割り当てられる領域
  • ヒープメモリ以外のメモリ領域

若いコレクションと、古いコレクション

二世代のガベージコレクションを利用する場合、ガベージコレクションには、「若いコレクション」と「古いコレクション」とがあります。

  • 若いコレクション
    • ナーサリに保持された古いオブジェクトを、古い領域に「昇格(移動)」する処理
    • 古いコレクション(後述)や一世代のガベージコレクション(ナーサリのないヒープに対するガベージコレクション)よりも、格段に速くメモリ領域を開放できる
    • ナーサリの「保持領域」
      • ナーサリの一部に確保される領域
      • ここに保管されたオブジェクトは、直後の若いコレクションで昇格されない。このことにより、オブジェクトが割り当てられた直後に昇格してしまうのを防止する
  • 古いコレクション

小規模オブジェクトと大規模オブジェクト

JRockit JVM では、オブジェクト割り当て時に小規模オブジェクトと大規模オブジェクトが区別されます。

  • 小模オブジェクトと大規模オブジェクト

    • 通常 2 ~ 128 KB が区別の基準となる
    • 小規模か大規模化は、おおよそ以下の項目により決定される
  • 小規模オブジェクト

    • スレッドローカル領域(TLA)に割り当てられる
    • 二世代のガベージコレクションの場合、TLA はナーサリから確保される
  • 大規模オブジェクト
    • TLA に収まらないオブジェクト
    • 二世代のガベージコレクションの場合、古い領域に割り当てられる
    • 大規模オブジェクトの割り当てには、複数Java スレッド間の、オブジェクトキャッシュの同期を頻繁に行う必要がある *2

ガベージコレクション

二世代のガベージコレクションを利用している場合、ここでの記述内容は、古いコレクションに該当します。 マーク アンド スイープ モデルという、ガベージコレクションアルゴリズムについての説明です。

  • マーク アンド スイープ モデル
    • JRockit JVMガベージコレクションモデル
    • マークフェーズとスイープフェーズからなる
    • マークフェーズの動作
      • 現在使用されているオブジェクトを識別し、マークを付ける
      • 以下のようなオブジェクトが生存状態としてマークされる
        • Java スレッド、ネイティブ ハンドルおよびその他のルートソースから到達可能なオブジェクト
        • 上記のオブジェクトから到達可能なオブジェクト
    • スイープフェーズの動作
      • オブジェクトの木構造をたどることにより、生存状態としてマークされなかったオブジェクトを見つける。そのオブジェクトが配置されていた領域はフリーリストに記録され、新しいオブジェクトの割り当てに利用される。 *3
    • マークフェーズとスイープフェーズの組み合わせ方により、いくつかの方式がある

モースト コンカレント マーク アンド スイープ における処理の詳細

モースト コンカレント マーク アンド スイープ では、マーク処理とスイープ処理において、それぞれ4つのフェーズが順に実行されます。

モーストリ コンカレント マークの4つのフェーズ

名前 動作 Java スレッドの停止
初期マーキング 生存しているオブジェクトのルートセットを識別する あり
コンカレント マーキング ルートセットからの参照にしたがって、生存している残りのオブジェクトを検索してマークする なし
プレクリーニング コンカレント マーキング中のヒープの変更を識別し、生存しているオブジェクトを検索してマークする なし
最終マーキング プレクリーニング中のヒープの変更を識別し、生存しているオブジェクトを検索してマークする あり

モーストリ コンカレント スイープ の4つのフェーズ

名前 動作 Java スレッドの停止
スイープ(1回目) ヒープの半分をスイープする。この間、オブジェクトは残り半分のヒープ領域に割り当てられる なし
休止(1回目) 残り半分に切り替えるための休止 N/A
スイープ(2回目) 残り半分のヒープをスイープする。この間、オブジェクトは残り半分のヒープ領域に割り当てられる なし
休止(2回目) 同期、および統計の記録のための休止 N/A

世代別ガベージコレクション(若いコレクション)

二世代のガベージコレクションを利用している場合、ヒープメモリ上にナーサリが存在します。ナーサリの保持領域外のオブジェクトを古い領域に昇格するのが、若いコレクションです。
若いコレクションの間、Java スレッドは停止します。

*1:二世代のガベージコレクションが利用されない場合は、すべてのヒープが古い領域なのと同じことだと思われる

*2:Oracleの公式ドキュメントには、「大規模なオブジェクトの割り当てには Java スレッド間の同期をより頻繁に行う必要があります。」とありますが、たぶんこういうことでしょう。

*3:Oracleの公式ドキュメントには、「生存しているオブジェクト間のギャップを見つけるために、ヒープがトラバースされます。」とありますが、たぶんこういうことでしょう。

*4:コンカレント マーク アンド スイープとの違いは、マーク中のヒープの変更を識別して、選択的にマークし直す機構があることです。

Windows + Cygwin + Vagrant で WebLogic Server を動かす ~ java、WebLogic インストール編

前回の記事に引き続き、VirtualBox 上のゲストOSに、java と WegLogic サーバーをインストールしていきます。
本記事は、Vagrant を使ってゲストOSを構成する記事の続きですが、手順自体は Vagrant に依存するものではありません。LinuxWebLogic サーバーをインストールする際には、広く参考にしていただけると思います。

java のインストール

1. java のダウンロード

Oracle のダウンロードサイトより、最新のJDKを取得します。*1
Linux x64 用の tar.gz アーカイブをダウンロードして下さい(本記事の執筆時点では、jdk-8u60-linux-x64.tar.gz が最新です。以降の手順は、これをダウンロードしたものとして記します)。

2. java の tar.gz アーカイブをゲストマシンに転送

ダウンロードした tar.gz アーカイブを Cygwin のホームディレクトリに配置しておき、以下のコマンドを実行します。

$ scp ~/jdk-8u60-linux-x64.gz wls_ol:~/

このコマンドで、wls_ol の ssh 接続設定を使って、ホームディレクトリ直下にファイルを転送します。
以下のようにコンソールに出力されたら、転送完了です。

jdk-8u60-linux-x64.gz                      100%  173MB  43.2MB/s   00:04

3. java のアーカイブを展開して、PATH を設定

以下のコマンドを順次実行し、java のアーカイブを展開します。

$ ssh wls_ol
$ mkdir ~/java
$ mv ~/jdk-8u60-linux-x64.gz ~/java
$ tar zxvf ~/java/jdk-8u60-linux-x64.gz -C ~/java

続いて、.bashrc に java コマンドへの PATH を通す記述を追加し、再読み込みします。

$ echo export JAVA_HOME=~/java/jdk1.8.0_60 >> ~/.bashrc
$ echo export PATH=\$PATH:\$JAVA_HOME/bin >> ~/.bashrc
$ source ~/.bashrc

java コマンドの動作を確認しておきます。
以下のコマンドで java のバージョン情報が表示されれはOK。

$ java -version

WebLogic サーバーのインストール

1. WebLogic サーバーのダウンロード

java と同じく、Oracle のダウンロードサイトより、最新の開発者用zipアーカイブを取得します(本記事の執筆時点では、wls1213_dev.zip が最新です。以降の手順は、これをダウンロードしたものとして記します)。

2. WebLogic サーバーの zip アーカイブをゲストマシンに転送

ダウンロードした zip アーカイブを Cygwin のホームディレクトリに配置しておき、以下のコマンドを実行します。

$ scp ~/wls1213_dev.zip wls_ol:~/

3. unzip のインストール

今回使用している Oracle Linux には、unzip が入っていないので、yum で取得します。 以下のコマンドを実行してください。

$ ssh wls_ol
$ sudo yum install unzip

途中、インストールしてもOKか確認するメッセージが表示されますので、y + [Enter] を入力します。
以下のようにコンソールに出力されればOKです。

Resolving Dependencies
--> Running transaction check
…
Installing : unzip-6.0-15.el7.x86_64                                   1/1
Verifying  : unzip-6.0-15.el7.x86_64                                   1/1

Installed:
unzip.x86_64 0:6.0-15.el7

Complete!

4. zip アーカイブを展開して、PATHを設定

以下のコマンドを順次実行し、WebLogic サーバーの zip アーカイブを展開します。

$ ssh wls_ol
$ mkdir ~/wls
$ mv ~/wls1213_dev.zip ~/wls
$ unzip wls1213_dev.zip -d ~/wls

続いて、環境変数に MW_HOME(WebLogic サーバーのホーム)を追加します。.bashrc に環境変数を設定する追加し、再読み込みします。

$ echo export MW_HOME=~/wls/wls12130 >> ~/.bashrc
$ source ~/.bashrc

5. WebLogic Server のインストール

いよいよ WebLogic Server を実際にインストールしていきます。

$ cd $MW_HOME
$ source $MW_HOME/configure.sh
…
Do you want to configure a new domain?  [y/n]? n

ドメインはこの後で作成するので、ドメインを作成するかどうか聞かれたら、n + [Enter] とします。

続いて WebLogic サーバー用の環境設定を行います。

$ source $MW_HOME/wlserver/server/bin/setWLSEnv.sh
…
Your environment has been set.

最後に、ドメインの作成です。

$ mkdir ~/domain
$ cd ~/domain
$ java $JAVA_OPTIONS -Xmx1024m -XX:MaxPermSize=256m weblogic.Server
…
No config.xml was found.
Would you like the server to create a default configuration and boot? (y/n): y

config.xml を使用せずにデフォルトの構成でドメインを作成するので、y + [Enter] とします。

Enter username to boot WebLogic server:weblogic
Enter password to boot WebLogic server:
For confirmation, please re-enter password required to boot WebLogic server:

WebLogic サーバーの管理ユーザーのユーザー名、パスワードを聞かれるので、設定したい値を入力します。

以下のようにコンソールに出力されたら、無事にインストールが完了し、WebLogic サーバーの管理コンソールが起動しています。

<07/09/2015 2:10:36 PM AEST> <Notice> <WebLogicServer> <BEA-000360> <The server started in RUNNING mode.>
<07/09/2015 2:10:36 PM AEST> <Notice> <WebLogicServer> <BEA-000365> <Server state changed to RUNNING.>

"http://localhost:8001/console" にアクセスすると、管理コンソールのログイン画面が表示されるはずです。
前回の記事で、Vagrant 上にゲストOSを構成するときに 8001 -> 7001 のポートフォワードの設定をしていますので、左記のURLにアクセスすると、ゲストOSの7001番ポートにリクエストを投げていることになります。

f:id:charlier_shoe:20150907133514p:plain

6. Weblogic Serverの停止/起動

WebLogic Server を停止するには、WebLogic サーバーを起動させているコンソールで、[Ctrl] + c を入力します。 また、起動するには以下のコマンドを実行します。

$ ~/domain/startWebLogic.sh

VirtualBox 上のゲストOSに java と WegLogic サーバーをインストールする手順は、以上です。

*1:wgetコマンドで、ゲストOS上に直接ダウンロードする方法もあります: Linuxでjdkをwgetする方法

Windows + Cygwin + Vagrant で WebLogic Server を動かす ~ ゲストOSセットアップ編

Window 上に Vagrant のゲストOSを立てて、WebLogic Server の開発環境を作成しようとしています。2回の記事に分けて手順を紹介する予定で、今回はVagrant でゲストOSをセットアップするまでの手順をまとめてみました。

前提

Cygwin のインストール時の注意

ssh と scp を利用するので、Cygwin のインストール時に、インストールウィザードの [Select Package] で、openssh の Bin を選択しておく必要があります。

f:id:charlier_shoe:20150904101038p:plain

ゲストOSのセットアップ手順

1. ゲストOSの起動まで

Cygwin を起動し、以下のコマンドを順次実行します。

$ vagrant box add oraclelinux-7.1-x86_64 http://cloud.terry.im/vagrant/oraclelinux-7-x86_64.box
$ mkdir vagrant
$ cd vagrant

カレントディレクトリに "Vagrantfile" という名前のファイルを作成し、以下の内容を記述します。

    Vagrant.configure(2) do |config|

        # VM settings
        config.vm.define :wls_ol, primary: true do |wls_ol|
            wls_ol.vm.box = "oraclelinux-7.1-x86_64"
            wls_ol.vm.network "forwarded_port", guest: 7001, host: 8001
        end

        # VM provider settings
        config.vm.provider "virtualbox" do |vb|
            vb.name = "wls_ol"
            vb.cpus = "2"
            vb.memory = "2048"
        end

    end

後々インストールする WebLogic サーバーの管理画面は、ゲストOSの7001番ポートで動作しますので、ポートフォワーディングの設定で 8001 -> 7001 となるようにしています。

続いて先ほどまで操作していた Cygwin ターミナルで、以下のコマンドを実行します。

$ vagrant up wls_ol

コンソールに以下のようなメッセージが表示され、仮想マシンが起動します。

Bringing machine 'wls_ol' up with 'virtualbox' provider...
==> wls_ol: Importing base box 'oraclelinux-7.1-x86_64'...
==> wls_ol: Matching MAC address for NAT networking...
==> wls_ol: Setting the name of the VM: wls_ol
==> wls_ol: Clearing any previously set network interfaces...
==> wls_ol: Preparing network interfaces based on configuration...
    wls_ol: Adapter 1: nat
==> wls_ol: Forwarding ports...
    wls_ol: 7001 => 8001 (adapter 1)
    wls_ol: 22 => 2222 (adapter 1)
==> wls_ol: Running 'pre-boot' VM customizations...
==> wls_ol: Booting VM...
==> wls_ol: Waiting for machine to boot. This may take a few minutes...
    wls_ol: SSH address: 127.0.0.1:2222
    wls_ol: SSH username: vagrant
    wls_ol: SSH auth method: private key
    wls_ol: Warning: Connection timeout. Retrying...
    wls_ol:
    wls_ol: Vagrant insecure key detected. Vagrant will automatically replace
    wls_ol: this with a newly generated keypair for better security.
    wls_ol:
    wls_ol: Inserting generated public key within guest...
    wls_ol: Removing insecure key from the guest if it's present...
    wls_ol: Key inserted! Disconnecting and reconnecting using new SSH key...
==> wls_ol: Machine booted and ready!
==> wls_ol: Checking for guest additions in VM...
    wls_ol: The guest additions on this VM do not match the installed version of
    wls_ol: VirtualBox! In most cases this is fine, but in rare cases it can
    wls_ol: prevent things such as shared folders from working properly. If you see
    wls_ol: shared folder errors, please make sure the guest additions within the
    wls_ol: virtual machine match the version of VirtualBox you have installed on
    wls_ol: your host and reload your VM.
    wls_ol:
    wls_ol: Guest Additions Version: 4.3.24
    wls_ol: VirtualBox Version: 5.0
==> wls_ol: Mounting shared folders...
    wls_ol: /vagrant => C:/cygwin64/home/user/vagrant

ここで、ssh でゲストOSに接続してみます。vagrantssh 接続するには、以下のコマンドを実行します。

$ vagrant ssh wls_ol

vagrant up で仮想マシンを起動した時点で、ssh 接続の構成が行われていますので、上記のコマンドだけで接続が可能です。

2. SSH 接続の設定

今後の作業では、Vagrant のコマンドを使わずに ssh 接続できた方が便利ですので、通常の ssh 接続をするための手順を行います。 exit で現在の ssh 接続から抜けてから、以下のコマンドを実行します。

$ vagrant ssh-config >> ~/.ssh/config
$ vi ~/.ssh/config

~/.ssh/config に、仮想マシン wls_ol に接続するための設定情報が出力されていると思います。これだけで、通常の ssh 接続で "vagrant" ユーザーで仮想マシンにつなぐことができます。

$ ssh wls_ol

例えば "root" ユーザーなどで接続したい場合は、"vagrant" ユーザーの設定を同ファイルの末尾にコピーして、必要な部分を "root" ユーザー用に変更します。 以下、記述例です。

Host wls_ol
    HostName 127.0.0.1
    User vagrant
    Port 2222
    UserKnownHostsFile /dev/null
    StrictHostKeyChecking no
    PasswordAuthentication no
    IdentityFile C:/cygwin64/home/user/vagrant/.vagrant/machines/wls_ol/virtualbox/private_key
    IdentitiesOnly yes
    LogLevel FATAL

Host wls_ol-root
    HostName 127.0.0.1
    User root
    Port 2222
    UserKnownHostsFile /dev/null
    StrictHostKeyChecking no
    PasswordAuthentication yes
    IdentityFile C:/cygwin64/home/user/vagrant/.vagrant/machines/wls_ol/virtualbox/private_key
    IdentitiesOnly yes
    LogLevel FATAL

変更を保存して、以下のコマンドを実行すると、"root" ユーザーで仮想マシンに接続する事ができます。"root" ユーザーのパスワードは "vagrant" なので、パスワードの入力を求められたら、それを入力してください。

$ ssh wls_ol-root

参考までに、セットアップ後のスクリーンショットを。
まずは、Cygwin の画面

f:id:charlier_shoe:20150904102321p:plain

続いて、VirtualBoxの管理画面

f:id:charlier_shoe:20150904102405p:plain

ゲストOSのセットアップは以上です。次回の記事では、ゲストOSに javaWebLogic サーバーのインストールを行っていきます。

Developer Cloud Serviceのビルド成果物をMavenリポジトリに公開する

Developer Cloud Service(以下、DevCS)は、Gitリポジトリ、バグトラッカーなどの開発ツール群を一括で提供する、Oracle社のクラウドサービスです。

DevCSでは、HudsonベースのCI(継続的インテグレーションツールMavenビルドをおこない、さらに成果物をDevCS上のMavenリポジトリに公開することができます。
今回は、DevCSのMavenリポジトリを使って、以下の機能を実現する方法をご紹介します。

  1. ビルド成果物をDevCSのMavenリポジトリに公開する
    1. で公開された成果物に依存するMavenプロジェクトを作成する

1. ビルド成果物をDevCSのMavenリポジトリに公開する

1-1. MavenリポジトリのURLを確認する

DevCSでビルドしたいプロジェクトのHomeにアクセスすると、画面右に、GitリポジトリMavenリポジトリのURLが表示されています。 ここでMavenリポジトリの [HTTP] を選択し、URLをテキストエディタ等にコピーしておきます。

f:id:charlier_shoe:20150825140205p:plain

1ー2. pom.xmlにデプロイ用の設定を記述する

pom.xmlに記述する内容は、通常の記述と同様です。 jackrabbitプラグインと、デプロイ先リポジトリの情報を記述します。

distributionManagement > repository > urlのタグには、1-1で控えておいたリポジトリのURLを記述します。

以下、pom.xmlのサンプルです。

    <project xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                            http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.charleysdiary</groupId>
        <artifactId>HelloWorld</artifactId>
        <version>0.0.1-SNAPSHOT</version>

        <!-- Build Settings -->
        <build>
            <extensions>
                <extension>
                    <groupId>org.apache.maven.wagon</groupId>
                    <artifactId>wagon-webdav-jackrabbit</artifactId>
                </extension>
            </extensions>
        </build>

        <!-- Environment Settings -->
        <distributionManagement>
            <repository>
                <id>com.charleysdiary.HelloWorld</id>
                <name>Sample HelloWorld Project</name>
                <url>dav:https://developer.us2.oraclecloud.com/profile/developer00000-sampledomain00000/s/sampledomain-sampledomain00000_HelloWorld/maven/</url>
            </repository>
        </distributionManagement>

    </project>

この例では、ビルド環境と同じDevCSプロジェクトのMavenリポジトリに、成果物を公開します。このような場合、Mavenリポジトリにアクセスする際の認証情報等の設定は不要です。 
pom.xmlの修正だけで作業完了です。

1-3. Cyberduckで確認してみる

CyberduckWebDAVクライアント)で、公開された成果物を確認してみます*1

まずは、Cyberduckをダウンロード&インストールします。

続いて、Cyberduckを起動し、[新規接続]をクリック

f:id:charlier_shoe:20150825140214p:plain

[新規接続]ダイアログで、以下の画像のように入力します。 [Server]は1-1で控えておいたURLのホスト名、[Path]は同URLのPath部分、ユーザー名とパスワードにはDevCSにログインするときのものを入力します。

f:id:charlier_shoe:20150825140221p:plain

[Connect]をクリックすると、Mavenリポジトリにデプロイされた成果物を確認することができます。

2. 1. で公開された成果物に依存するMavenプロジェクトを作成する

2-1. pom.xmlに依存関係を記述する

依存元のプロジェクトのpom.xmlで、repositoryとdependencyの配下に、依存先のリポジトリとモジュールの情報を記述します。

以下、記述例です。

    <project xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                            http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.charleysdiary</groupId>
        <artifactId>HelloWorldClient</artifactId>
        <version>0.0.1-SNAPSHOT</version>

        <!-- Environment Settings -->
        <dependencies>
            <dependency>
                <groupId>com.charleysdiary</groupId>
                <artifactId>HelloWorld</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
        </dependencies>

        <repositories>
            <repository>
                <id>com.charleysdiary.HelloWorld</id>
                <name>Sample HelloWorld Project</name>
                <url>https://developer.us2.oraclecloud.com/profile/developer00000-sampledomain00000/s/sampledomain-sampledomain00000_HelloWorld/maven/</url>
            </repository>
        </repositories>

依存先のプロジェクトが、DevCSの同一アイデンティティドメイン上のプロジェクトの場合、必要な作業はこれだけです。

2-2. settings.xmlに参照先リポジトリの認証情報を記述する

依存元のプロジェクトが、依存先リポジトリアイデンティティドメイン外にある場合(e.g. ローカルでビルドするとき)、依存先リポジトリにアクセスするための認証情報を、settings.xmlに記述します。

username、passwordには、アイデンティティドメインにログインするときに使用する値を設定します。

以下、記述例です。

    <?xml version="1.0" encoding="UTF-8"?>
    <settings xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.1.0
        http://maven.apache.org/xsd/settings-1.1.0.xsd"
        xmlns="http://maven.apache.org/SETTINGS/1.1.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

        <servers>
            <server>
                <id>com.charleysdiary.HelloWorld</id>
                <username>sample@charleysdiary.com</username>
                <password>password</password>
            </server>
        </servers>
    </settings>

DevCSのMavenリポジトリに成果物を公開し、それを利用する方法は、以上です。