DockerHubでDockerコンテナのイメージを共有する

DockerHubを試してみようということで、まずはこんなDockerfileを作成してみました。GitBucketを組み込みJettyで起動するだけの簡単なものです。

FROM java:8-jre

MAINTAINER Naoki Takezoe <takezoe [at] gmail.com>

ADD https://github.com/gitbucket/gitbucket/releases/download/3.12/gitbucket.war /opt/gitbucket.war

RUN ln -s /gitbucket /root/.gitbucket

VOLUME /gitbucket

# Port for web page
EXPOSE 8080
# Port for SSH access to git repository (Optional)
EXPOSE 29418

CMD ["java", "-jar", "/opt/gitbucket.war"]

DockerHubでイメージを共有するには以下の2通りの方法があります。

  • ビルドしたイメージをDockerHubにdocker pushする
  • GitHub/BitBucketリポジトリDockerfileをDockerHubで自動ビルドする

どちらの場合もDockerHubにアカウントを作成しておく必要があります。

dockerコマンドでpushする

まずはコンテナをビルドします。このとき-tオプションでDockerHubに作成するリポジトリ名と同じ名前のタグをつけておきます。

$ docker build -t takezoe/gitbucket .

続いてdocker loginを実行します。

$ docker login

DockerHubのアカウント作成時に指定したアカウント名、パスワード、メールアドレスを入力します。一度docker loginを実行するとdocker logoutを実行するまで認証情報は保持されるので毎回docker loginを行う必要はありません。

最後にdocker pushを実行するとコンテナのイメージがDockerHubにアップロードされます。

$ docker push

GitHub / BitBucketから自動ビルドする

もう1つの方法はGitHub / BitBucketにDockerfileをpushしておき、そこからコンテナを自動ビルドする方法です。以下の例ではREADME.mdも入れていますが、最低限Dockerfileだけあれば大丈夫です。

github.com

DockerHub上でGitHub / BitBucketのアカウントとリンクの設定を行い、リポジトリを選択するだけでOKです。Gitリポジトリにpushするたびに自動的にコンテナがビルドされます(DockerHub上で明示的にビルドをリクエストすることも可能)。

f:id:takezoe:20160228173624p:plain

毎回自分でpushしなくてもいいので楽ですし、DockerHubの詳細ページにもDockerfileを参照できるタブが追加されたり、GitHub / BitBucketリポジトリへのリンクが表示されたりするので基本的には手動でpushするより自動ビルドを使ったほうがよさそうな感じです。

プライベートリポジトリ

DockerHubではリポジトリの作成時に「Private」を選択することでプライベートリポジトリを作成することもできます。「Public」と「Private」はあとから切り替えることもでき、無料でも1つだけプライベートリポジトリが使用できます。

f:id:takezoe:20160228173503p:plain

プライベートリポジトリからはdocker loginしていないとイメージをpullすることができません。

プライベートリポジトリを自前運用したい場合Docker Registryを使うという手も考えられますが、AWSGoogle Cloud PlatformではマネージドサービスとしてDockerコンテナのレジストリが提供されているのでAWSGCPを使っているのであればこれらを利用するのもありかもしれません。