背景
ここは前回 Docker 再入門2 2016 の続きになります。
最初のインストール方法は前々回 Docker 再入門1 2016 の記事で紹介してます。また基本的なコマンド例は以下のSlideShareの資料を参考にしてください。
2014年のSlideShare資料のupdateとしての再入門は今回で最後です。
Docker入門(再掲)
基本的なDockerの仕組みは変わらないので、入門知識は地元で実施したDocker勉強会の過去資料を考慮した前提で紹介します。情報が古いですがdockerコマンドの使い方とか基本的なことは過去資料を参照してください。
Docker 入門 (SlideShare)
動作環境(再掲)
- ThinkPad X200s OS:Linux MINT 18
- ThinkPad X1 Carbon OS:Windows 10 Pro (Hyper-V)
個人的に開発環境のOSはLinuxなので、MacOSやWindowsについては優先度が低いのでご了承ください。
レジストリ
Dockerのイメージ管理方法としてレジストリがあります。レジストリに登録されたイメージがリポジトリになります。
前回のローカル環境へのイメージ登録もローカルレジストリへのリポジトリ登録になります。
公式のイメージが管理されているDocker Hub以外にもレジストリにはいくつか種類があります。
ここでは標準で利用出来るDocker Hubについて紹介します。
Docker Hub
コンテナのベースとなるLinuxディストリビューションのイメージなどが管理されているDocker hubには、自分の作成したイメージもリポジトリとして登録する事が出来ます。
一般公開されるパブリックなリポジトリの場合には制限はありませんが、限定されたプライベートなリポジトリの場合には1つだけ無料で利用出来ます。複数のプライベートリポジトリを管理する場合には課金が必要です。
公式サイトでアカウントを作成しましょう。
Docker Hub(docker.com)
コマンドでDocker Hubへログインします。
$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: user_name
Password:
Login Succeeded
ログインするとdocker infoコマンドにUsernameが表示されます。ただしDocker for Windowsの場合は表示されませんでした。
リポジトリの検索
パブリックで一般公開されているリポジトリを検索する事が出来ます。
$ docker search ubuntu --limit 5
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian-based Linux operating s... 4915 [OK]
ubuntu-upstart Upstart is an event-based replacement for ... 67 [OK]
rastasheep/ubuntu-sshd Dockerized SSH service, built on top of of... 47 [OK]
ubuntu-debootstrap debootstrap --variant=minbase --components... 28 [OK]
nuagebec/ubuntu Simple always updated Ubuntu docker images... 9 [OK]
ここでは、ubuntuで5件まで検索した結果です。
OFFICIALが[OK]のリポジトリが公式イメージです。
リポジトリの登録
自分で作成したイメージをDocker Hubに登録してみましょう。
Docker Hubのレジストリ管理側で必要なリポジトリを作成する必要がありますので、Docker Hubのサイト管理画面から新規リポジトリを作成します。
ダッシュボード画面のCreate Repositotyから作成します。
- namespaceは通常は自分のアカウントを選択
- repository nameはリポジトリ名でdocker pushコマンドで指定します。
- short descriptionは簡単な説明
- full descriptionは詳細な説明
- Visibiliyuが公開範囲で、パブリックかプライベートを選択します。
次にDocker Hubに登録するイメージを作成します。
前回、ubuntuにnginxを入れたコンテナが残っていますので、これを利用してみます。
現在のコンテナ状態を表示します。
$ docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ABC123456789 nginx/ubuntu:1.0 "/bin/sh -c '/usr/sbi" 22 hours ago Exited (0) 22 hours ago clever_noyce
アカウント名とリポジトリ名を指定するため、前回Dockerfileで作成されたリポジトリではDocker Hubには登録できないので、残っている現在のコンテナから再度Docker Hub登録用イメージを作成します。
ちなみにDockerfileから再ビルドしても出来ますが、ここでは冗長な再ビルドはせず、既にあるコンテナを再利用します。
$ docker commit ABC123456789 user_name/repository_name
少々待つとイメージが作成されますので、確認してみます。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
user_name/repository_name latest 123456789ABC 17 seconds ago 223.1 MB
nginx/ubuntu 1.0 123456789ABC 19 minutes ago 223.1 MB
ubuntu latest 123456789ABC 10 days ago 127.2 MB
hello-world latest 123456789ABC 3 months ago 1.848 kB
それでは早速ローカルレジストリにあるイメージをDocker Hubに登録してみましょう。
docker pushコマンドでDocker Hubのアカウント名とリポジトリ名をスラッシュで区切って指定します。
この時、docker loginにてDocker Hubにログイン済みである必要があります。
$ docker push user_name/repository_name
The push refers to a repository [docker.io/user_name/repository_name]
2f54979f341b: Pushed
ca560b3e1ef9: Pushed
0c5e1b765314: Pushed
0e20f4f8a593: Mounted from library/ubuntu
1633f88f8c9f: Mounted from library/ubuntu
46c98490f575: Mounted from library/ubuntu
8ba4b4ea187c: Mounted from library/ubuntu
c854e44a1a5a: Mounted from library/ubuntu
latest: digest:
また少々待つとDocker Hubに登録出来ると思います。
Docker Hubの管理画面で確認してみてください。PULLSの数字が増えていると思います。
リポジトリの動作確認
さて、実際にDocker Hubに登録したイメージが同じように動作するか確認してみましょう。
その前に現在ローカルレジストリに登録されているリポジトリを先に削除します。
$ docker rmi user_name/repository_name
これでローカルリポジトリにはイメージが無い状態になります。
次にDocker Hubに登録したリポジトリを指定して直接コンテナを起動します。
$ docker run -d -p 80:80 user_name/repository_name
コマンド実行すると、Docker Hubから該当するリポジトリをローカルレジストリにダウンロードして、コンテナの実行まで自動的に行われます。確認してみましょう。
$ curl localhost:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
abc123456789 user_name/repository_name "/bin/sh -c '/usr/sbi" 14 seconds ago Up 13 seconds 0.0.0.0:80->80/tcp thirsty_goldstine
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
user_name/repository_name latest 123456789ABC About an hour ago 223.1 MB
nginx/ubuntu 1.0 123456789ABC 19 minutes ago 223.1 MB
ubuntu latest 123456789ABC 10 days ago 127.2 MB
hello-world latest 123456789ABC 3 months ago 1.848 kB
この様にDocker Hubを利用することで、自分が作成したコンテナのイメージを他の環境で共有する事が出来ます。
パブリックで一般公開したり、プライベートでチーム開発に共有したりと利用します。
個人開発で他と共同作業しない場合だとDockerfileとローカルレジストリで十分かも知れませんが。