Dockerコンテナを簡単に共有できる公開リポジトリ「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)。
Docker Hubはユーザーが作成したコンテナをアップロードして公開・共有できるサービスで、ここで公開されているコンテナは自由にダウンロードして自分のサーバーに簡単にデプロイできる。公開されているコンテナは「リポジトリ」という単位で管理され、タグを使ったバージョン管理も可能だ。
Docker HubはDockerを開発するDocker社が営利目的で開発・運営しているサービスだが、無料ですべての機能が利用可能だ。無制限に作成できる公開リポジトリ(パブリックリポジトリ)のほか、一般公開されないプライベートリポジトリも作成できる。無料ユーザーの場合作成できるプライベートリポジトリは1つだけだが、有料プランを利用することで作成できるプライベートリポジトリの数を増やすことができる(図2)。
今回は、この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)。
すると登録したメールアドレス宛に確認用のメールが届くので、そこに記載されている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)。
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が公式に用意しているコンテナ以外を利用する場合は、その出元や中身を十分に確認してから利用してほしい。