Dockerコンテナを簡単に共有できる公開リポジトリ「Docker Hub」を使ってみよう

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

 近年注目されているコンテナ管理ツール「Docker」では、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のリリースとともにリニューアルされ、名称も変更された(図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に自分で作成したコンテナをアップロードする例を紹介しよう。今回は、Node.js環境を構築したコンテナ「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
INDEX       NAME                                               DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/google/nodejs-runtime                                                                    62                   [OK]
docker.io   docker.io/google/nodejs                                                                            47                   [OK]
docker.io   docker.io/google/nodejs-hello                                                                      8                    [OK]
docker.io   docker.io/richarvey/nginx-nodejs                   Container running Nginx + NodeJS capable o...   8                    [OK]
docker.io   docker.io/digitallyseamless/nodejs-bower-grunt      Node.js w/ Bower & Grunt Dockerfile for t...   5                    [OK]
docker.io   docker.io/mahnunchik/nodejs-runtime                                                                3                    [OK]
docker.io   docker.io/cmfatih/nodejs                           Node.js [ nodejs 0.10.38 ]                      2                    [OK]
docker.io   docker.io/gbleux/nodejs                            Lightweight image (Alpine Linux) with NodeJS    2                    [OK]
docker.io   docker.io/mc2labs/nodejs                           CoffeScript and Supervisor powered Nodejs ...   2                    [OK]
docker.io   docker.io/readytalk/nodejs                         Node.js based off the official Debian Whee...   2                    [OK]
docker.io   docker.io/schickling/nodejs                        Minimal NodeJS + NPM image                      2                    [OK]
docker.io   docker.io/totem/nodejs-base                        Nodejs Base Image for totem                     1                    [OK]
docker.io   docker.io/anapsix/nodejs                           27MB NodeJS over AlpineLinux                    0                    [OK]
docker.io   docker.io/damon/nodejs                                                                             0                    [OK]
docker.io   docker.io/digitallyseamless/gitlab-runner-nodejs   A GitLab-CI runner with nodejs (+nvm)           0                    [OK]
docker.io   docker.io/jav13r/nodejs                            nodejs                                          0                    [OK]
docker.io   docker.io/marvambass/nodejs                        NodeJS Container, Ubuntu based, use any No...   0                    [OK]
docker.io   docker.io/mc2labs/nodejs-dev                       nodejs image for development                    0                    [OK]
docker.io   docker.io/minimum2scp/nodejs                       ndenv+node.js on Debian sid amd64               0                    [OK]
docker.io   docker.io/pataquets/nodejs                                                                         0                    [OK]
docker.io   docker.io/ricardoamaro/uptime-nodejs               uptime-nodejs                                   0                    [OK]
docker.io   docker.io/smartprocure/nodejs                                                                      0                    [OK]
docker.io   docker.io/thhgcn/nodejs                            This is a docker image that bundles the la...   0                    [OK]
docker.io   docker.io/vrtsystems/nodejs                        NodeJS container derived from Google Docke...   0                    [OK]
docker.io   docker.io/webhippie/nodejs                         Docker images for nodejs                        0                    [OK]

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

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

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

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