ついにバージョン 1.0 リリース!注目を集める Docker の概要と ConoHa・アプリクラウドでの利用方法など
今回は、日頃私たちがプロジェクトで活用している技術の中から最近話題となっている Docker について紹介したいと思います。Docker は今年から初のカンファレンスである DockerCon 2014 が開催されるなど、インフラエンジニアに限らず今幅広く注目を集めている技術の一つです。
Dockerとは
Docker はコンテナ型仮想化と呼ばれる仮想化技術の一種を実装したもので、LXC など Linux カーネルから提供されているコンテナ機能を用いて軽量な仮想化環境を実現しているのが特徴です。Docker を用いることで Linux のアプリケーションを実行する基盤をコンテナという単位で簡単に構築でき、また作成したコンテナをイメージとして保存する事でスムーズに別の環境に移して実行することもできます。イメージへの保存は docker commit などとしてコミットすることで実行されます。また、Docker のイメージは pull/push/tagging といった操作を行うことができます。このように git を始めとしたバージョン管理システムと同様の操作を行うことができる為、開発者にとって馴染みやすい点も注目を集めている理由の一つではないかと考えています。
Docker, Inc. (旧dotcloud) によって開発が始まった Docker ですが、冒頭でご紹介した DockerCon 2014 で初の安定版である 1.0 のリリースや開発を支援する仕組みについてのアナウンスもあり、今後本番環境での利用も広がっていくものと思われます。新しく発表されたプロジェクトとしては、
- libcontainer – reference implementation for containers
- libchan: like Go channels over the network
- Libswarm
私どもは主に 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-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/dockerdocker-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 registrydocker-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
// 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 myregistrydocker-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アプリクラウド】