2014.06.12

ついにバージョン 1.0 リリース!注目を集める Docker の概要と ConoHa・アプリクラウドでの利用方法など


今回は、日頃私たちがプロジェクトで活用している技術の中から最近話題となっている Docker について紹介したいと思います。Docker は今年から初のカンファレンスである DockerCon 2014 が開催されるなど、インフラエンジニアに限らず今幅広く注目を集めている技術の一つです。

Dockerとは


Docker はコンテナ型仮想化と呼ばれる仮想化技術の一種を実装したもので、LXC など Linux カーネルから提供されているコンテナ機能を用いて軽量な仮想化環境を実現しているのが特徴です。Docker を用いることで Linux のアプリケーションを実行する基盤をコンテナという単位で簡単に構築でき、また作成したコンテナをイメージとして保存する事でスムーズに別の環境に移して実行することもできます。イメージへの保存は docker commit などとしてコミットすることで実行されます。

dockerの世界
また、Docker のイメージは pull/push/tagging といった操作を行うことができます。このように git を始めとしたバージョン管理システムと同様の操作を行うことができる為、開発者にとって馴染みやすい点も注目を集めている理由の一つではないかと考えています。

Docker, Inc. (旧dotcloud) によって開発が始まった Docker ですが、冒頭でご紹介した DockerCon 2014 で初の安定版である 1.0 のリリースや開発を支援する仕組みについてのアナウンスもあり、今後本番環境での利用も広がっていくものと思われます。新しく発表されたプロジェクトとしては、


があり、また加えて Google Cloud Platform におけるコンテナのサポートや Kubernetes というコンテナマネージャーの発表がありこちらも注目です。


私どもは主に Web アプリケーション開発のプロジェクトにおいて、プロトタイプの作成や開発環境に Docker を利用しています。Docker の使い方については ConoHa 技術ブログで薄い本が公開されておりこちらが参考になります。

ConoHa の薄い本電子版 Vol.3「ConoHa+Docker」を公開しました! | ConoHa

Docker イメージとレジストリ


DockerCon 2014 では Docker 1.0 だけでなく Docker を軸としたプラットフォーム構築を支援するサービスである DockerHub も発表されました。 DockerHub を中心とした開発を行うことで、Github などと連携した継続的なデプロイ環境の構築が容易にできるようになるのではないかと期待しています。

Docker で作成したイメージを別の Docker 環境で利用するにはレポジトリにイメージを push する事が必要です。レポジトリを利用する方法は2通りあります。

  • Docker Hub Registry (旧Docker Index)
  • docker-registry

元々 Docker Index と呼ばれていたものは DockerHub に取り込まれ Docker Hub Registry となりました。ユーザ登録すれば無料で利用可能で、プライベートレポジトリを1つ作成する事ができますのでお試しにはこれでいいと思います。また公開しても良い場合はパブリックレポジトリという形で更に作成する事ができます。もっとレポジトリを作りたいけれど公開したくないという場合、月額料金を払ってプライベートレポジトリを利用するか、または docker-registry で自前でレジストリサーバをたてる事でプライベートレポジトリを好きなだけ作る事ができます。

ここでは docker-registry の利用方法について簡単にご紹介いたします。

docker-registry は python で作られており pip でインストール可能です。しかしながら docker-registry 自体が Docker イメージで提供されているのでこちらを利用するのが簡単でおすすめです。

以下の例では ConoHa 上に2台の Docker ホストを作成し、docker-registry によって片方の Docker ホストにて作成したコンテナをイメージ化し、別の Docker ホストで起動します。

  • CentOS 6.5 (6.4をupdate)
  • docker-io-0.11.1-4.el6.x86_64
  • Dockerホスト1 192.168.0.11 (ConoHaのローカルネットワーク利用)
  • Dockerホスト2 192.168.0.12 (同上)

システムの概要を図で示すと下記のようになります。

概要図
まず薄い本を参考に telnet コマンド入りのコンテナを作成します。 コミットする際のイメージの名前を以下に変えて実行します。

#  docker run -i -t centos /bin/bash

// telnetをインストール
Docker # yum -y install telnet
Docker # exit
// commit
# docker commit `dl` 192.168.0.11:5000/telnet


docker-registry の設定ファイルを準備します。保存先を /home/[user]/registry-conf/config.yml とします。[user]は適宜変更します。

common:
    loglevel: info
    search_backend: "_env:SEARCH_BACKEND:"
    sqlalchemy_index_database:
        "_env:SQLALCHEMY_INDEX_DATABASE:sqlite:////tmp/docker-registry.db"
dev:
    loglevel: debug
    storage: local
    storage_path: /var/tmp/docker

docker-registry の イメージを pull した後、起動します。pull を実行する際に latest を指定する事により、最新版のみ取得する事ができ容量を節約できます。今回取得した docker-registry のイメージは 0.7.0 でした。

# docker pull registry:latest

# docker run -d --name=myregistry -p 5000:5000 -v /home/user/registry-conf:/registry-conf -e DOCKER_REGISTRY_CONFIG=/registry-conf/config.yml registry

docker-registry にイメージをプッシュしてみます。

// imageをpush
# docker push 192.168.0.11:5000/telnet

// 別のDockerホストからpullする
# docker pull 192.168.0.11:5000/telnet

// 直接runしてもよい
# docker run -i -t 192.168.0.11:5000/telnet /bin/bash

これでドカドカ作成したコンテナを別の Docker ホストで起動する事ができました。 ところがこの場合、レポジトリがコンテナ内にあるため永続化するにはコミットが必要となり少々不便です。docker-registry はレポジトリの保存先に外部ストレージを利用する事ができます。

そこで下記にアプリクラウドのオブジェクトストレージを利用する方法をご紹介します。

アプリクラウドのオブジェクトストレージを利用する為の準備をします。 アプリクラウドのコントロールパネルの「サービス→アプリ名→API情報」から下記の情報をメモします

  • テナント名
  • 認証URL

ConoHa に構築した Docker ホストに swift クライアント実行環境を準備します。

// swiftクライアントをインストール
# yum install openstack-swift python-keystoneclient.noarch
// 環境変数
# export OS_TENANT_NAME=‘テナント名’
# export OS_USERNAME=‘コントロールパネルのID’
# export OS_PASSWORD=‘コントロールパネルのパスワード’
# export OS_AUTH_URL=‘認証URL’
// レポジトリ用container作成
# swift post myrepo

起動した docker-registry のコンテナを一旦削除します ※先ほど保存したイメージも削除されます

# docker rm -f myregistry

docker-registryの設定ファイル/home/[user]/registry-conf/config.ymlにswiftの項目を追記します。

common:
    loglevel: info
    search_backend: "_env:SEARCH_BACKEND:"
    sqlalchemy_index_database:
        "_env:SQLALCHEMY_INDEX_DATABASE:sqlite:////tmp/docker-registry.db"

dev:
    loglevel: debug
    storage: local
    storage_path: /var/tmp/docker

swift:
    storage: swift
    storage_path: /registry
    swift_authurl: ‘認証URL’ 
    swift_tenant_name: ‘テナント名’ 
    swift_user: ‘コントロールパネルのID’
    swift_password: ‘コントロールパネルのパスワード’
    swift_container: ‘myrepo’

docker-registry 0.7.0 では swift ドライバーを追加する必要がありますので、Dockerfile からイメージを作成します。

// build用dir作成
# mkdir swift-registry && cd swift-registry
// Dockerfile編集
# vi Dockerfile

編集した Dockerfile は下記のようになります。

FROM registry
RUN pip install docker-registry-driver-swift python-keystoneclient
// buildする
# docker build -t user/swift-registry .
docker-registryを起動します
# docker run -d --name=myregistry -p 5000:5000 \
  -v /home/user/registry-conf:/registry-conf \
  -e SETTINGS_FLAVOR=swift\
  -e DOCKER_REGISTRY_CONFIG='/registry-conf/config.yml'  user/swift-registry

これで先ほど起動した docker-registry 同様に push/pull する事が可能です。

今回は Docker を利用する上での手順を簡単にご紹介しましたが、次世代システム研究室では開発環境の構築やテストといった用途にすでに導入しており、ポータブルな開発環境の実現や開発環境と本番環境の差異をできる限り無くす取り組みを続けています。このような仮想化技術を活用した環境構築・開発支援に興味のある方がいらっしゃいましたら是非募集一覧からご連絡いただければと思います。

また、今回ご紹介した利用方法は弊社サービスでお試し頂く事ができますのでぜひご利用下さい!

ConoHa | VPSは、まだまだ楽しくなる。

ソーシャルアプリの開発・運営を支援する【GMOアプリクラウド】