RedisがインストールされたDockerイメージの作成

はじめに

本記事では、Installing Redis on Docker - John Costa's Blogの記事をもとに、RedisがインストールされたDockerイメージの作成手順を説明します。本記事は、Dockerがインストール済であることを前提としています。DockerがプリインストールされたVagrant boxは、以下のリンクより取得頂けます。(Vagrant boxファイルへの直接リンクです。私がPackerにて作成したものになります。)本記事にて記載しているコマンドは、現時点でのDockerの最新安定版である0.7.6にて動作確認を行っております。

https://s3-ap-northeast-1.amazonaws.com/yosssi/vagrant-boxes/ubuntu-13.10-server-amd64-docker.box

手順

Dockerの公式イメージであるubuntuイメージを使ってコンテナを新規に立ち上げます。

$ docker run -i -t ubuntu /bin/bash
root@aaadab642e4c:/# 

runコマンドは、引数で指定されたイメージ(今回の場合はubuntu)上にコンテナを新規に作成し、そのコンテナ上で引数で指定されたコマンド(今回の場合は/bin/bash)を実行します。-iオプションを指定することで標準入力からの入力を可能にします。-tオプションを指定することで疑似端末(pseudo-tty)が割り当てられます。

パッケージリストを最新化し、redis-serverをインストールします。

root@aaadab642e4c:/# apt-get update
root@aaadab642e4c:/# apt-get install -y redis-server

redis-serverがインストールされていることを確認します。

root@aaadab642e4c:/# which redis-server
/usr/bin/redis-server

コンテナのシェルから退出します。

root@aaadab642e4c:/# exit
exit
$

コンテナの一覧を出力し、先ほど作成したコンテナのIDを確認します。

$ docker ps -a
CONTAINER ID        IMAGE                     COMMAND                CREATED             STATUS              PORTS               NAMES
aaadab642e4c        ubuntu:12.04              /bin/bash              28 minutes ago      Exit 0                                  pensive_torvalds

psコマンドは、コンテナの一覧を表示します。-aオプションを指定することで、現在実行されていないコンテナを含めた全てのコンテナが表示されます。このオプションが指定されていない場合は、現在実行中のコンテナのみが表示されます。

今回の場合、コンテナIDはaaadab642e4cとなります。

Dockerレジストリサーバへログインします。アカウントをお持ちでない場合は、ご希望のEメール、パスワード、ユーザ名を指定することで、アカウントが作成されます。

$ docker login -e あなたのEメール -p あなたのパスワード -u あなたのユーザ名
Login Succeeded

今回作成したコンテナのイメージを作成します。

$ docker commit aaadab642e4c あなたのユーザ名/redis
4b4b6b00568083fe438374c9078a3da75fbd0657b1ec8da572068803fbe1b8ac

commitコマンドは、引数のコンテナID(今回の場合はaaadab642e4c)に合致するコンテナからイメージを作成します。引数「あなたのユーザ名/redis」は、作成されるイメージのリポジトリとタグを表します。リポジトリにはあなたのユーザ名を指定します。

イメージが作成されたことを確認します。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
yosssi/redis        latest              4b4b6b005680        5 seconds ago       205.8 MB
ubuntu              12.10               426130da57f7        5 days ago          127.6 MB
ubuntu              quantal             426130da57f7        5 days ago          127.6 MB
ubuntu              10.04               8589d4e9c7c6        5 days ago          139.6 MB
ubuntu              lucid               8589d4e9c7c6        5 days ago          139.6 MB
ubuntu              12.04               72e10143e54a        5 days ago          125.9 MB
ubuntu              latest              72e10143e54a        5 days ago          125.9 MB
ubuntu              precise             72e10143e54a        5 days ago          125.9 MB
ubuntu              13.10               721f07d19f96        5 days ago          144.6 MB
ubuntu              saucy               721f07d19f96        5 days ago          144.6 MB
ubuntu              raring              476aa49de636        5 days ago          133.6 MB
ubuntu              13.04               476aa49de636        5 days ago          133.6 MB

imagesコマンドはイメージの一覧を出力します。

作成したイメージをDockerレジストリサーバへアップロードします。

$ docker push あなたのユーザ名/redis

pushコマンドはイメージ・リポジトリレジストリへアップロードします。

本コマンドの実行後、Docker indexにて、アップロードしたイメージが存在することを確認することができます。

作成したイメージのコンテナを実行し、Redisサーバを起動します。

$ docker run -p 6379 -d あなたのユーザ名/redis /usr/bin/redis-server

runコマンドで-pオプションを指定することで、ネットワークポートをコンテナに設定することができます。また、-dオプションを指定することで、コマンドをバックグラウンドで実行することができます。

実行中のコンテナのステータスを確認します。

$ docker ps
CONTAINER ID        IMAGE                 COMMAND                CREATED             STATUS              PORTS                     NAMES
79a9719d914f        yosssi/redis:latest   /usr/bin/redis-serve   3 minutes ago       Up 3 minutes        0.0.0.0:49158->6379/tcp   backstabbing_poincare  

PORTSの項を見ると、コンテナ内のポート番号6379が、外部のポート番号(今回の例では49158)に紐付けられていることが分かります。コンテナ外からは、この外部ポート番号を指定することで、コンテナのポート番号6379のプロセスへアクセスすることができます。

telnetを使ってコンテナの外からコンテナ内のRedisサーバへアクセスしてみます。

$ telnet 0.0.0.0 49158
Trying 0.0.0.0...
Connected to 0.0.0.0.
Escape character is '^]'.
monitor
+OK
+1391159705.184861 "monitor"
set docker awesome
+OK
+1391159714.071889 "set" "docker" "awesome"
get docker
$7
awesome
+1391159720.705523 "get" "docker"
quit
+OK
Connection closed by foreign host.
$

最後に

今回の例では、公式イメージubuntuをベースにコンテナを立ち上げ、RedisをインストールしてDockerイメージを新規に作成しました。その後、作成したイメージをリポジトリへアップロードする作業を実施しました。最後に、作成したDockerイメージよりコンテナを立ち上げ、そのコンテナ上でRedisサーバをバックグラウンドで起動し、コンテナ外からRedisサーバへアクセスする方法を確認しました。

参考資料