[Docker] MySQLコンテナと連携したTomcatコンテナのデータソース設定を動的に行うメモ

| コメントをどうぞ

Dockerにはコンテナ同士をリンクする機能があり、IPアドレスやポート番号などの情報をリンク先コンテナに渡すことができます。

この機能を使って、MySQLコンテナから渡される接続情報をTomcatコンテナのデータソース設定として動的に定義する方法を調査してみました。

以下はTomcatコンテナ “tomcat_test” を作成し、MySQLコンテナ “some-mysql” をリンクするコマンドです。

docker run --link some-mysql:mysql -it -p 8888:8080 --name tomcat_test tomcat:7.0 /bin/bash

Dockerイメージはオフィシャルで提供されているものを利用しています。

printenv で確認すると、以下のような環境変数が追加されていることが確認できます。

MYSQL_ENV_MYSQL_MAJOR=5.6
MYSQL_ENV_MYSQL_VERSION=5.6.22
MYSQL_ENV_MYSQL_ROOT_PASSWORD=mysecretpassword
MYSQL_PORT_3306_TCP=tcp://172.17.0.9:3306
MYSQL_PORT_3306_TCP_ADDR=172.17.0.9
MYSQL_PORT_3306_TCP_PORT=3306
MYSQL_PORT_3306_TCP_PROTO=tcp
MYSQL_PORT=tcp://172.17.0.9:3306
MYSQL_NAME=/tomcat_test/mysql

接頭辞の “MYSQL” はリンク時に指定したエイリアス名です。( –link [MySQLコンテナ名]:[エイリアス名] )

Tomcatのデータソース設定は、 sever.xml の GlobalNamingResources 要素を編集することで行います。

環境変数の値を server.xml に直接渡すことはできません。 server.xml に変数を指定するためには、Tomcat起動時にシステムプロパティ(-Dオプション)を設定する必要があります。

catalina.shを編集して、 -Dオプションを指定している箇所を直接修正します。

elif [ "$1" = "run" ]; then

 shift
 if [ "$1" = "-security" ] ; then
 if [ $have_tty -eq 1 ]; then
 echo "Using Security Manager"
 fi
 shift
 eval exec \"$_RUNJAVA\" \"$LOGGING_CONFIG\" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
 -Djava.endorsed.dirs=\"$JAVA_ENDORSED_DIRS\" -classpath \"$CLASSPATH\" \
 -Djava.security.manager \
 -Djava.security.policy==\"$CATALINA_BASE/conf/catalina.policy\" \
 -Dcatalina.base=\"$CATALINA_BASE\" \
 -Dcatalina.home=\"$CATALINA_HOME\" \
 -Djava.io.tmpdir=\"$CATALINA_TMPDIR\" \
 -DMYSQL_ENV_MYSQL_ROOT_PASSWORD=\"$MYSQL_ENV_MYSQL_ROOT_PASSWORD\" \
 -DMYSQL_PORT_3306_TCP_ADDR=\"$MYSQL_PORT_3306_TCP_ADDR\" \
 -DMYSQL_PORT_3306_TCP_PORT=\"$MYSQL_PORT_3306_TCP_PORT\" \
 org.apache.catalina.startup.Bootstrap "$@" start
 else
 eval exec \"$_RUNJAVA\" \"$LOGGING_CONFIG\" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
 -Djava.endorsed.dirs=\"$JAVA_ENDORSED_DIRS\" -classpath \"$CLASSPATH\" \
 -Dcatalina.base=\"$CATALINA_BASE\" \
 -Dcatalina.home=\"$CATALINA_HOME\" \
 -Djava.io.tmpdir=\"$CATALINA_TMPDIR\" \
 -DMYSQL_ENV_MYSQL_ROOT_PASSWORD=\"$MYSQL_ENV_MYSQL_ROOT_PASSWORD\" \
 -DMYSQL_PORT_3306_TCP_ADDR=\"$MYSQL_PORT_3306_TCP_ADDR\" \
 -DMYSQL_PORT_3306_TCP_PORT=\"$MYSQL_PORT_3306_TCP_PORT\" \
 org.apache.catalina.startup.Bootstrap "$@" start
 fi

青字部分が追記箇所です。

server.xml の GlobalNamingResources に設定を追記します。

<GlobalNamingResources>
<!-- Editable user database that can also be used by
UserDatabaseRealm to authenticate users
-->
<Resource name="UserDatabase" auth="Container"
 type="org.apache.catalina.UserDatabase"
 description="User database that can be updated and saved"
 factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
 pathname="conf/tomcat-users.xml" />
<Resource name="jdbc/infoscoop" type="javax.sql.DataSource" 
 username="root" 
 password="${MYSQL_ENV_MYSQL_ROOT_PASSWORD}" 
 driverClassName="com.mysql.jdbc.Driver" 
 url="jdbc:mysql://${MYSQL_PORT_3306_TCP_ADDR}:${MYSQL_PORT_3306_TCP_PORT}/iscoop?useUnicode=true&amp;characterEncoding=UTF-8" 
 validationQuery="select 1" 
 maxActive="8" maxIdle="4" maxWait="-1"/>
</GlobalNamingResources>

青字部分が追記箇所です。システムプロパティは ${システムプロパティ名} で設定することができます。password と url にシステムプロパティの値を設定しています。

この状態でTomcatコンテナをイメージ化しておくと、MySQLコンテナとリンクするだけでデータソースを介してすぐに接続できるDockerイメージとして利用できます。

追記: 設定編集時、Tomcat/libにMySQLのJDBCドライバも入れておくと良いでしょう

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>