JenkinsからWildFlyへのリモートデプロイ(DockerコンテナのLink)
自社製品のAppPotの開発、運用環境は次のような構成になっています。
- 自社クラウド本番環境:クラウド運用しているバージョンのみ
- 自社クラウドテスト環境:クラウド運用しているバージョンのみ
- 自社クラウド開発環境:クラウド運用しているバージョンのみ
- 自社CI環境:製品バージョンごとに存在
- 受託プロジェクト開発開発:プロジェクトごとに存在
バージョンごとに環境を立てるのは大変なので、自社CI環境と受託プロジェクト開発環境はDockerコンテナ上で運用しています。常にすごい負荷がかかっているわけではないので、小規模なさくらインターネットのサーバーで3〜5つくらいのコンテナが動作しています。
このうち、CI環境の一部だけはJenkinsを使ったビルド、デプロイ、テストのプロセスが自動で回っています。この一部というのは、Jenkinsと同居しているアプリケーションサーバーのみ。 なぜかというと、コンテナ間の連携をちゃんとやる時間が無かったから・・。
というわけで、コンテナ間の連携、JenkinsからのWildFlyへのリモートデプロイをできるようにするのが、本エントリの目標です。
Dockerコンテナ間連携
まだしばらく同一サーバー内でのコンテナ間連携で行けそうなので、--link
を使います。
https://docs.docker.com/docker/userguide/dockerlinks/#communication-across-links
今回の場合はJenkinsサーバーコンテナから、アプリケーションサーバーコンテナへリンクします。
アプリケーションサーバーの起動
--name
オプションで、apppot_runtime1.7
という名前でコンテナを起動させています。
docker run -it --expose 9181 -p 9181:8080 -p 9991:9990 --name apppot_runtime1.7 rsogo/wildfly8:v1 /bin/bash
Jenkinsサーバーコンテナの起動
--link
オプションで、apppot_runtime1.7
という名前のコンテナをリンクさせています。
docker run -it --expose 8081 -p 8081:8080 --name jenkins --link apppot_runtime1.7:apppot_runtime1.7 rsogo/jenkins:v5 /bin/bash
コンテナIDでもリンクで指定することはできますが、コンテナIDはコンテナの起動の度に変わります。 上のような起動スクリプトはシェルとして用意しておきたいと思いますので、コンテナIDより、コンテナ名を定義しておいた方が便利です。
Jenkinsサーバーコンテナでのhostsファイル、環境変数の確認
apppot_runtime1.7
がhostsファイルに追加されていることが分かります。
# cat /etc/hosts 172.17.0.71 cfc8c054ccf8 127.0.0.1 localhost 172.17.0.69 apppot_runtime1.7 9b5ee14ff469
env
コマンドを実行した結果、環境変数にアプリケーションサーバーコンテナが公開しているポートごとに次のような環境変数が定義されています。
APPPOT_RUNTIME1.7_PORT_8080_TCP_ADDR=172.17.0.69 APPPOT_RUNTIME1.7_PORT=tcp://172.17.0.69:22 APPPOT_RUNTIME1.7_PORT_22_TCP_PORT=22 APPPOT_RUNTIME1.7_PORT_22_TCP_ADDR=172.17.0.69 APPPOT_RUNTIME1.7_PORT_22_TCP=tcp://172.17.0.69:22 APPPOT_RUNTIME1.7_PORT_9181_TCP_PORT=9181 APPPOT_RUNTIME1.7_PORT_22_TCP_PROTO=tcp APPPOT_RUNTIME1.7_PORT_8080_TCP_PORT=8080 APPPOT_RUNTIME1.7_PORT_9990_TCP=tcp://172.17.0.69:9990 APPPOT_RUNTIME1.7_PORT_9080_TCP_PORT=9080 APPPOT_RUNTIME1.7_PORT_9181_TCP_PROTO=tcp APPPOT_RUNTIME1.7_PORT_8080_TCP=tcp://172.17.0.69:8080 APPPOT_RUNTIME1.7_PORT_8080_TCP_PROTO=tcp APPPOT_RUNTIME1.7_PORT_9080_TCP_PROTO=tcp APPPOT_RUNTIME1.7_PORT_9990_TCP_ADDR=172.17.0.69 APPPOT_RUNTIME1.7_PORT_9080_TCP_ADDR=172.17.0.69
この状態で、Jenkinsサーバーコンテナから以下のコマンドを実行することで、JenkinsサーバーからWildFlyのポートにアクセスできることを確認できます。
# curl http://apppot_runtime1.7:8080 <!-- ~ JBoss, Home of Professional Open Source. ~ Copyright (c) 2011, Red Hat, Inc., and individual contributors 略
次は、JenkinsサーバーからWildFlyへリモートデプロイします。
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用のインストールのマニュアルに記載されていた。ブログ等を見るのも良いけど、トラブった時は一次情報を参照せよという良い例。