Redis サービスの Docker 化

非常にシンプルで飾り気のない Redis サービスを、リンク機能を使ってウェブ・アプリケーションにアタッチします。

Redis 用の Docker コンテナを作成

まず、新しい Redis イメージ用の Dockerfile を作成します。

FROM        ubuntu:14.04
RUN         apt-get update && apt-get install -y redis-server
EXPOSE      6379
ENTRYPOINT  ["/usr/bin/redis-server"]

次に、 Dockerfile からイメージを構築します。 <自分のユーザ前> の場所は、自分自身のリポジトリ名に置き換えてください。

$ docker build -t <自分のユーザ名>/redis .

サービスの実行

先ほど作成したイメージを使い、コンテナ名を redis とします。

コンテナに -d を付けて実行すると、デタッチド・モードとして実行され、コンテナはバックグラウンドで動作します。

重要なのは、コンテナ内のポートを全く公開していない点です。そのかわり、Redis データベースに接続するには、コンテナに対するリンク機能を使います。

$ docker run --name redis -d <自分の名前>/redis

ウェブ・アプリケーションのコンテナを作成

次にアプリケーションのコンテナを作成します。 --link フラグを使い、 redis コンテナに対するリンクを作成します。ここでは db というエイリアス(別名)で作成します。これにより、 redis コンテナと安全なトンネルが作成されます。Redis インスタンスが公開しているコンテナ内のポートには、ここで指定したコンテナだけ接続できるようになります。

$ docker run --link redis:db -i -t ubuntu:14.04 /bin/bash

新しく作成したコンテナの中では、接続をテストするために redis-cli バイナリの取得・インストールが必要です。

$ sudo apt-get update
$ sudo apt-get install redis-server
$ sudo service redis-server stop

それから --link redis:db オプションを使い、Docker がウェブ・アプリケーションのコンテナ内で利用可能な環境変数を作成します。

$ env | grep DB_

# Should return something similar to this with your values
DB_NAME=/violet_wolf/db
DB_PORT_6379_TCP_PORT=6379
DB_PORT=tcp://172.17.0.33:6379
DB_PORT_6379_TCP=tcp://172.17.0.33:6379
DB_PORT_6379_TCP_ADDR=172.17.0.33
DB_PORT_6379_TCP_PROTO=tcp

ここでは DB が接頭語となっている複数の環境変数が見えます。 DB とはコンテナ起動時に指定した、リンクのエイリアスです。 DB_PORT_6379_TCP_ADDR を使って Redis コンテナに接続してみましょう。

$ redis-cli -h $DB_PORT_6379_TCP_ADDR
$ redis 172.17.0.33:6379>
$ redis 172.17.0.33:6379> set docker awesome
OK
$ redis 172.17.0.33:6379> get docker
"awesome"
$ redis 172.17.0.33:6379> exit

ウェブ・アプリケーションが redis コンテナに接続するために、この環境変数や他の環境変数を利用できます。