‫この講義の要件は､ Dockerにおけるコンテナとイメージとは何かという基本的なことと､ レイヤーについて理解していること､
‫あるいは少なくともレイヤーの基本を理解していることです｡
‫Docker Hubについて少し知っておく｡
‫この講義では､ 画像タグとそれをDocker Hubにアップロードする方法について説明します｡
‫タグは､ 使い始めると直感的にわからないことが多いので､
‫実はいろいろあります｡ レジストリ､ 特にDocker Hubで動作させるためには､
‫実際に特定のフォーマットである必要があります｡ 続いて､ 画像に付与されるタグとその画像のIDの関係についてお話します｡
‫では､ さっそく始めましょう｡
‫まず､ タグ付けについて説明します｡ docker image tag --help｡ 私たちが普段何気なく使っている画像には名前がついていないんです｡
‫docker image
‫lsを実行すると､ nameカラムがないことに気がつきます｡
‫画像IDの他に､ 誰もそれを覚えようとしないのでは？
‫3つの異なる情報で参照する必要があるのです｡
‫この画像のlsコマンドの画面では､ 実際には2つしか見えていません｡ 左側には､ リポジトリ､
‫そしてタグが表示されています｡
‫リポジトリは､
‫実際にはユーザー名か組織のスラッシュで構成されています｡
‫ここでは､ 公式のリポジトリ画像のみを扱うので､ 実際のリポジトリ名のみを表示することにします｡
‫先ほど､ 公式とされる特別な画像は､ 組織スラッシュリポジトリの実際の名前ではなく､
‫そのリポジトリの名前と呼ばれるだけの権利を得るものであると述べました｡
‫Docker Hubでmysqlを検索してみると､ 公式のmysqlだけでなく､
‫SQLの組織もあって､ mysql-serverというのがあって､
‫これが結構人気で､ 100万ダウンロードを超えている｡
‫これは､
‫同じMySQLサーバーでも､ OracleのMySQLチームが作成したものです｡
‫実際にダウンロードする場合は､ この右側にあるように､ docker pull
‫mysql/mysql-serverを実行する必要があることに注意してください｡ 実際にコピーボタンをクリックすれば､
‫これをコピーすることができるんです｡ このユニークな組織ベースのイメージを実際にダウンロードし､ もう一度docker
‫image lsを実行すると､ リポジトリ名に組織名が含まれていることに気づくはずです｡
‫Docker Hubのアカウントでは､ 私は「bretfisher」と名乗っています｡ 右上から見ることができます｡
‫例えば､ ダッシュボードで公開されている画像を見るとして､ nodemongoappを見てみましょう｡
‫もしこれをダウンロードするとしたら､ docker
‫pull bretfisher/nodemongoappをする必要がありますね｡
‫さて､ リポジトリの名前の付け方がわかったところで､ 何のためのタグなのでしょうか？
‫タグはバージョンともブランチとも言えませんが､ Gitのタグとよく似ています｡
‫だから､ その両方をちょっとずつやっている感じです｡
‫これは､ 特定の画像のコミットへのポインタにすぎず､ 実際にはそのリポジトリにどんなものでもよいのです｡
‫Docker Hubに戻って､ mysqlの公式イメージにアクセスしてみると､ フロントページにこれらの異なるタグが表示されているのがわかると思います｡
‫ここで彼らが言いたいのは､ 「8. 0. 0と､
‫8． 0と8はすべて同じ画像IDのタグです｡
‫ここでスクロールしてタグボタンを見ると､ mysqlに付与された様々なタグの詳細なリストが表示されます｡
‫では､ これまでたくさん取り組んできたNginxに行ってみましょう｡
‫数字だけでなく､ 実は名前もあることが､ ここでわかるでしょう｡
‫重要なのは､ これらは実際にはすべて全く同じイメージであり､ Dockerはそれを十分に理解しているということです｡
‫コマンドラインを開くと､ すでにnginxの最新版がダウンロードされているのがわかります｡
‫ウェブページを見ると､ ここに最新のタグがありますが､ メインラインというのもあるんですね｡
‫では､ docker pull nginx:mainlineをしたらどうでしょうか？ これは､ 画像IDから､ この画像はすでに私のキャッシュにあることを実は知っていた､
‫ということなのです｡ これでもう一度docker image lsを行うと､
‫2種類のnginxが表示されます｡ キャッシュに2回保存しているわけではないので､ まったく同じ画像IDを持っていることがわかると思います｡
‫このタグは実際の画像IDを指し示すラベルに過ぎず､
‫多数のタグを同じものを指し示すことができる｡
‫では､ 新しいラベルを作るにはどうしたらいいのでしょうか？
‫自分でDockerfileを作ってカスタムイメージを作ることもできますが､ 既存のDockerイメージを再タグ化することもできるので､
‫docker image tag nginx bretfisher/nginxとやればいいんです｡
‫このコマンドのフォーマットは､
‫新しいタグを付けたい画像が先に行き､ その後に新しいタグを付けるというものです｡
‫記憶を呼び起こすためにもう一度docker image tag --helpを実行すると､ SOURCE_IMAGEとオプションのタグ､
‫そしてNEW_IMAGEとオプションのタグが表示されます｡
‫そのため､ タグを指定しない場合は､ 常にデフォルトでlatestになります｡ 技術的には､ 古いソフトに最新のタグを付けることもできるので､
‫最新が常に最新というわけではありません｡
‫特別なことは何もないのですが､ なんとなくデフォルトのような感じです｡ 本当に､ 最新ではなく､
‫デフォルトと呼んでほしいです｡
‫そのため､ 少しわかりにくいのですが､
‫一般的にDocker Hubでは､ 特に公式イメージを使う場合は､ 使いたいソフトウェアの最新の安定版が概ね最新であることを信用してよいでしょう｡
‫では､ もう一度docker image
‫lsをやってみましょう｡ 何が起こったのかに注目
‫作っていない既存の画像に新しいタグを追加してしまった｡
‫同じイメージIDが表示され､
‫私のユーザー名とDocker Hubにまだ存在しない新しいレポのラベルが貼られています｡
‫ダッシュボードを見てみても､ ブレットフィッシャー／ニンニクスというのはないんです｡
‫では､ Dockerイメージのプッシュを､ Gitプッシュのように､ bretfisher/nginxでやったらどうでしょう？
‫denied: 要求されたリソースへのアクセスは拒否されました｡
‫そこで､ 先ほど作成したタグをアップロードしようとしたところ､ 明らかにアクセス拒否されました｡
‫それは､ 実際にログインしていないからです｡
‫そこで､ docker --helpを見ると､ loginとlogoutのコマンドが表示されています｡ それはまだ使っていないんです｡
‫そこで､ 自分専用の無料Docker Hubアカウントを取得すれば､ 実際にコマンドラインからdocker loginでログインできるようになります｡
‫これは実際に何をしたかというと､ ファイルに書き込んだのですが､ それはデフォルトでは私のプロファイルのcatの下にあるものです｡ docker/config. jsonに､ ローカルのdocker
‫CLIが私としてDocker Hubにアクセスするための認証キーが実際に格納されていました｡
‫Docker CLIでログインすると､ デフォルトではそのユーザーのプロファイルにそのアカウントの認証キーが保存されます｡
‫だから､ それを意識すればいいんです｡
‫もし信頼できないマシンを使っている場合は､ 作業が終わったらdocker logoutと入力してください｡
‫では､ ログインした状態で､ 上矢印を押して､ もう一度その画像を押してみます｡
‫OKです｡
‫ということで､ 終了したようです｡
‫Docker Hubに移動して､ 更新を押してみましょう｡ 出ました､ ブレティフィッシャー/ニンニクス｡
‫繰り返しになりますが､
‫実はこれを一から作ってアップロードしたわけではないんです｡
‫既存の画像に新しいタグをつけるだけで､ アップロードすると､ そのタグをもとに自動的に新しいレポが作成されるのです｡
‫もちろん､ ここにすべての情報を記入してもいいのですが､ 指定しなかったので､ 最新のタグ名がデフォルトで表示されているのがわかると思います｡
‫だから､
‫実際にタグのところまで戻って上矢印の操作をすれば､ 別のタグを付けることができます｡
‫その同じ画像にさらにタグを追加して､ テストと呼ぶことにします｡ docker image lsを実行すると､
‫同じイメージIDを持つものが3つあることがわかります｡
‫docker image push bretfisher/nginx:testingで､ testingを指定すると､ layers already existと表示されることに注目してください｡
‫それもあって､ すごい貯蓄率なんです｡
‫画像のダウンロードやアップロードの際に､ すでに存在するレイヤーをわざわざ再アップロードする必要はないのです｡
‫戻って更新ボタンを押すと､ 別のタグが表示されるのがわかると思います｡
‫しかしもちろん､ docker image ls を実行すれば､ 同じイメージ ID であることがわかりますし､ この接続の両側がそれを知っていることも確認できます｡
‫Docker
‫Hubでサポートされている機能で､ これをプライベートリポジトリにしたい場合､ まずリポジトリを作成し､ 作成時にプライベートリポジトリになるように指定します｡
‫そうすれば､ 私が押し込んでも､ そのコードがインターネット上で公になることはないでしょう｡
‫へえ､ 画像とそのタグにはいろいろあるんですね｡
‫では､ 簡単におさらいしておきましょう｡
‫このように､ イメージにはあらゆるタグを付けることができますが､ Docker Hubで動作させるためには､
‫特定のフォーマットである必要があります｡ 何かnginxを呼んでアップロードしても､ その前にアカウントIDや組織IDが入っていないと動かないからです｡
‫そして､ 同じ画像IDにたくさんのタグを付けることができ､ 既存の画像に再タグ付けや異なるタグ付けをしたからといって､
‫実際にはその画像IDが変わるわけではないことをお話しました｡
‫最新のタグは､ 実際にはデフォルトのタグに過ぎないことを忘れないでください｡
‫しかし､ Docker Hubでは､ 最新の安定したバージョンのイメージを示すためにlatestタグを使うのが標準となっているようです｡
‫CLIからDocker Hubに素早くログイン・ログアウトする方法を紹介しました｡ Linuxマシンであればローカル設定にセッションIDが保存され､
‫共有のLinuxマシンやサーバーなどのホストであればログアウトしてそれを削除することを忘れないでください｡
‫それから､
‫注意点として､ プライベートなDocker Hubイメージを作成する場合､ アップロードする前にまずリポジトリを作成した方が良いと思います｡