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)。
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に自分で作成したコンテナをアップロードする例を紹介しよう。今回は、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)。
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 田中邦裕