Dockerコンテナをクラウドサービス上で共有できる「Docker Hub」を使ってみる

近年注目されているコンテナ作成ツール「Docker」向けに、作成したコンテナを公開するための「Docker Hub」というサービスが開始された。今回はDockerで作成したコンテナをこのDocker Hubにて公開する方法を紹介する。

Dockerとは

前回/前々回の記事ではLinux上でコンテナ環境を構築するためのツール「LXC」(Linux Container)について紹介した(15分で分かるLXC(Linux Containers)の仕組みと基本的な使い方LXCを使った権限分離とテンプレートのカスタマイズ)。LXCでは比較的容易にコンテナの作成や運用ができるいっぽうで、独自のコンテナを作成したり、また作成したコンテナを別のマシンに複製する、といった機能についてはあまり注力されていない。そのため注目されているのが、「Docker」というツールだ。

DockerはLXCで不足しているコンテナの管理機能を実装したもので、当初はLXCと組み合わせて利用するツールだったが、徐々にLXCへの依存関係を減らし、最新バージョンではLXCなしでも動作する、独立したコンテナ管理ソフトウェアとなっている。さらに、WindowsやMac OS Xで仮想化ソフトウェア「VirtualBox」経由でDockerを利用するための「Boot2Docker」というツール(厳密にはLinuxディストリビューション)も提供され、マルチプラットフォームで動作するソフトウェアとなっている。

DockerとDocker Hub

2014年6月9日にリリースされたDocker 1.0とともにDocker向けのコンテナ共有サービス「Docker Hub」も発表された。Docker Hubは従来「docker index」(index.docker.io)という名前で提供されていたものだが、Docker 1.0のリリースとともにGitHub風のインターフェイスを備えたサービスにリニューアルされるとともに、名称も変更された(図1)。

図1 Docker Hubのユーザーページ
図1 Docker Hubのユーザーページ

 Docker Hubはユーザーが作成したコンテナをアップロードして公開・共有できるサービスで、ここで公開されているコンテナは自由にダウンロードして自分のサーバーに簡単にデプロイできる。公開されているコンテナは「リポジトリ」という単位で管理され、タグを使ったバージョン管理も可能だ。

Docker HubはDockerを開発するDocker社が営利目的で開発・運営しているサービスだが、無料ですべての機能が利用可能だ。無制限に作成できる公開リポジトリ(パブリックリポジトリ)のほか、一般公開されないプライベートリポジトリも作成できる。無料ユーザーの場合作成できるプライベートリポジトリは1つだけだが、有料プランを利用することで作成できるプライベートリポジトリの数を増やすことができる(図2)。

図2 Docker Hubの有料プラン
図2 Docker Hubの有料プラン

 今回は、このDocker Hubに独自に作成したコンテナをアップロードして利用する方法について紹介しよう。なお、Dockerの基本的な使い方やコンテナの作成方法については、『これから始める「DockerでかんたんLAMP環境 for CentOS」』記事が詳しいので、そちらをぜひご参照願いたい。

Docker Hubのアカウント作成

Docker Hubを利用するには、Docker Hubのアカウントが必要だ。これはDocker HubのWebサイト上で行えるので、事前に実行しておこう。Docker Hub(https://hub.docker.com/)にWebブラウザでアクセスするとアカウント登録画面(「Create your Docker account」画面)が表示されるので、ここにユーザー名およびパスワード、メールアドレスを入力して「Sign up」をクリックする(図3)。

図3 Docker Hubのアカウント作成画面
図3 Docker Hubのアカウント作成画面

 すると登録したメールアドレス宛に確認用のメールが届くので、そこに記載されているURL、もしくは「Confirm Your Email」リンクをクリックすることで認証が完了する。

Docker Hubのアカウントには、ユーザーのフルネームや所属企業、所在地といったプロフィールも設定できるので、必要に応じて設定しておこう。

Docker Hubを使う

Docker Hubへのコンテナのアップロードやダウンロードなどは、すべてdockerコマンドを使って実行する。たとえばコンテナをアップロードするには「docker push」コマンドを、ダウンロードするには「docker pull」コマンドを使用する。また、「docker search」コマンドでDocker Hubに登録されているコンテナを検索することが可能だ。

Docker Hubに作成したコンテナをアップロードする

それでは、まずはDocker Hubに自分で作成したコンテナをアップロードする例を紹介しよう。今回は、nodejs環境を構築したコンテナ「centos:nodejs」というコンテナをアップロードするという前提でその手順を紹介する。

コンテナをアップロードするには、まずコンテナをアップロードするリポジトリ名を決める必要がある。リポジトリはDocker Hub上でコンテナを管理する単位となる。リポジトリ名に利用できるのは英小文字と数字、「_」「-」「.」のみで、最小3文字、最大30文字の文字列だ。今回は、「nodejs」というリポジトリ名を使用することとする。

コンテナ名を決めたら、アップロードするコンテナに「<Docker Hubのアカウント名>/<リポジトリ名>:<タグ名>」というタグを付与する。タグ名については任意だが、そのコンテナの最新バージョンについては「latest」とするのが慣例となっている。今回はアカウント名が「hylom」、リポジトリ名が「nodejs」なので、「hylom/nodejs:latest」というタグ名を付けることにする。

アップロードするコンテナにこのタグを付与するには、まず「docker images」コマンドでこのコンテナに対応するイメージIDを調べる。

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
centos              nodejs              7ca04c054d89        About a minute ago   328.7 MB
centos              latest              0c752394b855        4 weeks ago          124.1 MB

ここで、「centos:nodejs」に対応するイメージIDは「7ca04c054d89」であることが分かるので、このイメージに対し「docker tag」コマンドでタグを設定する。

# docker tag 7ca04c054d89 hylom/nodejs:latest

設定後、「docker images」コマンドを実行すると、リポジトリ名に「hylom/nodejs」、タグ名に「latest」が指定されていることが確認できる。

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos              nodejs              7ca04c054d89        12 minutes ago      328.7 MB
hylom/nodejs        latest              7ca04c054d89        12 minutes ago      328.7 MB
centos              latest              0c752394b855        4 weeks ago         124.1 MB

タグを付与したら、そのタグ名を引数として与えて「docker push」コマンドを実行し、コンテナをアップロードする。ちなみに、Docker Hubのユーザー個別ページに「Add Repository]ボタンがあるが、公開リポジトリを作成する場合は事前にリポジトリ作成を行っておく必要は無い。pushコマンドの実行時に自動的にリポジトリが作成される。

# docker push hylom/nodejs:latest
The push refers to a repository [hylom/nodejs] (len: 1)
Sending image list
Please login prior to push:
Username: hylom
Password:
Email: ******@********
Login Succeeded
The push refers to a repository [hylom/nodejs] (len: 1)
Sending image list
Pushing repository hylom/nodejs (1 tags)
511136ea3c5a: Image already pushed, skipping
34e94e67e63a: Image already pushed, skipping
0c752394b855: Image already pushed, skipping
674a51d2b85b: Image successfully pushed
 
 
7ca04c054d89: Image successfully pushed
Pushing tag for rev [7ca04c054d89] on {https://registry-1.docker.io/v1/repositories/hylom/nodejs/tags/latest}

なお、初回実行時にはDocker Hubのアカウント情報の入力が求められるので、登録したユーザー名とパスワード、メールアドレスを入力する。ここで入力した情報は実行したユーザーのホームディレクトリの「.dockercfg」ファイル内に保存される。

アップロードが完了すると、Docker Hubにもその情報が反映される(図4)。

図4 Docker Hubの「hylom/nodejs」リポジトリ
図4 Docker Hubの「hylom/nodejs」リポジトリ

Docker Hubリポジトリからコンテナを作成する

Docker Hubにコンテナをアップロードすると、任意のマシンからそのコンテナをダウンロードしてデプロイできるようになる。たとえば、先ほどコンテナの作成とアップロードを行ったマシンとは別のマシンで「hylom/nodejs」コンテナを実行してみると、自動的にコンテナのイメージがDocker Hubからダウンロードされてデプロイが行われる。

# docker run -t hylom/nodejs /bin/bash
Unable to find image 'hylom/nodejs' locally
Pulling repository hylom/nodejs
7ca04c054d89: Download complete
  
  
a7518581ccd7: Download complete
bash-4.1#

Docker Hubリポジトリで公開されているコンテナを検索する

Docker Hubの公開リポジトリにアップロードされたコンテナは、誰もがダウンロードして利用できる。ほかのユーザーがアップロードしたコンテナは、「docker search」コマンドで検索できる。たとえば、「nodejs」というキーワードで検索すると、以下のように先ほどアップロードしたコンテナを含む多くの結果が表示される。

# docker search nodejs
NAME                                      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
dockerfile/nodejs                         Trusted Node.js (http://nodejs.org/) Build...   30                   [OK]
google/nodejs-runtime                                                                     16                   [OK]
fedora/nodejs                                                                             14                   [OK]
phusion/passenger-nodejs                  An image meant to serve as a good base for...   5           
google/nodejs                                                                             5                    [OK]
barbuza/django-builder                    ubuntu with ssh, postgresql, nginx, memcac...   2                    [OK]
jprjr/stackbrew-node                      A stackbrew/ubuntu-based image for Docker,...   2                    [OK]
shykes/nodejs                                                                             2           
zhesto/nodejs                             Image with nvm managed node.js installations.   2           
misho1kr/nginx-nodejs                                                                     2                    [OK]
google/nodejs-hello                                                                       1                    [OK]
 :
 :
hylom/nodejs                                                                              0           
 :
 :

ちなみに、「STARS」はDocker Hub上で「お気に入り」された数で、AUTOMATEDが「OK」となっているのはDocker Hubの自動ビルド機能が使われているものだ。

公開リポジトリを利用する際の注意点

このように、公開リポジトリにアップロードしたコンテナは不特定多数がダウンロード可能になるため、アップロードの際には公開したくない/公開してはいけないファイルなどが含まれていないか、注意してほしい。問題となりそうなものとしては、オープンソースでないソフトウェアや、ライセンス的にクリアではないファイルなどがある。クラウドサービスのアカウント情報などが含まれるファイルや認証用のファイルなどにも注意したい。

また、公開されているコンテナを利用する際にも注意が必要だ。たとえばコンテナ内にSSH公開鍵が含まれており、SSHサーバーが稼働するようになっている場合、対応するSSH秘密鍵を持つユーザーからログインされてしまう可能性がある。また、悪意のあるユーザーがマルウェアやバックドアを仕込んでいる可能性もある。自分が作成したコンテナや、Dockerが公式に用意しているコンテナ以外を利用する場合は、その出元を十分に確認してから利用してほしい。

【関連記事】
>>これから始める「DockerでかんたんLAMP環境 for CentOS」 by 田中邦裕

おしらせ

banner_vps