fbpx

Ebook連載:『5分x10回で学ぶ 開発者のためのDocker コンテナ入門』第4章 –イメージレジストリ
#docker #DX #Mirantis #コンテナ

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

コンテナ化はDXの第一歩に最適な取り組みです。これから10回にわたってMirantis社が発行するEbook「Learn Containers 5 Minutes at a Time An introductory guide for developers」 (Eric Gregory著)を翻訳・編集し、チャプターごとにCL LABで公開していきます。本稿はその第4章です。皆さまのクラウドネイティブジャーニーやアプリケーションのモダナイズの一助になれば幸いです。

目次

  • 第1章 コンテナとは?
  • 第2章 コンテナの作成・調査・削除
  • 第3章 Dockerfile でのコンテナイメージのビルド
  • 第4章 イメージレジストリ
  • 第5章 ボリュームと永続的なストレージ
  • 第6章 コンテナネットワークとコンテナのポートの開設
  • 第7章 コンテナ化アプリの実行
  • 第8章 ユーザ定義ネットワーク上のマルチコンテナアプリケーション
  • 第9章 Docker Compose
  • 第10章 Webアプリをコンテナサービスとして構築する

第4章: イメージレジストリ

前章では、Dockerfileからコンテナイメージをビルドする方法を学びました。この章では、パブリックレジストリを使用して、コンテナイメージを保存・共有する方法を学びます。

レジストリの深堀り

お気づきでないかもしれませんが、本書でも私たちはこれまでずっと、イメージレジストリを使用してきました。alpine のようなコンテナイメージの上にイメージやコンテナを構築するときDocker Engine は必ず Docker 社が管理するパブリックイメージレジストリであるDocker Hubからイメージをダウンロードしています。まるで魔法のように、欲しいソフトウェアが名前を唱えると同時に現れるのです。

しかし Docker Hub がパブリックイメージレジストリであるというのは、具体的にはどういう意味なのでしょうか?これは簡単に言うと、誰でもアクセスでき、コンテナイメージをダウンロードしたりアップロードしたりできるリポジトリ、またはその集合体です。

パブリックレジストリはDocker Hubだけでなく他の団体が管理するものもあります。また Mirantis Secure Registry のようなツールを使って、組織がプライベートレジストリを作成することも可能です。安全なソフトウェアサプライチェーンを確立するためには、コンテナイメージの来歴と内容の安全性を担保するためプライベートレジストリを使用する必要があります。

Docker HubのDockerとのアクセス性・親和性・迅速性は、学習者にとっては自然な選択ですが、早い段階からセキュリティ意識を培うことと、別のベストプラクティスを検討することもお勧めします。Docker HubのWebインターフェース https://hub.docker.com/ から、使用予定のイメージを調査するのも、セキュリティ意識の向上に役立つでしょう。ここには、検証済みのイメージを見分けるためのラベルがいくつか用意されています。

例えば alpine を https://hub.docker.com/_/alpine で確認してみましょう。

Docker Hub Alpine Image

alpine には、Docker社によって管理・公開されているイメージである「Official Image」ラベルが貼られています。このラベルが貼られているイメージは、非常によく使われており、初心者向けです。このラベルは検証済みであり、設計やドキュメントにおけるコンテナのベストプラクティスとして例示されている最も公式なイメージという意味です。このラベルを持つ多くは alpine やubuntu などOS のベースイメージですが、Python、Go、Node などの人気言語、MySQL や Redis などのデータストア、NGINX などのウェブサーバなど、さまざまなイメージがあります。

この他に Verified Publisher というラベルもあります。このラベルは、イメージを作成した団体によって公開・維持されていることをDocker 社が確認していることを表しています。このラベルによって、例えばAmazon Web Services(AWS)のユーザは、 Amazon から提供されたことが確認されているコマンドラインインターフェース(CLI)のコンテナイメージをダウンロードできます。

完璧なセキュリティはこの世に存在しません。悪意の有無に関わらず Official Image にも脆弱性が忍びこむことがあります。しかしコンテナを使い始めるとイメージの来歴について調べたり、来歴が検証済みのイメージを探したりする習慣が身につきます。Official Images やVerified Publishers に指定された Docker イメージのカタログを参考にするとよいでしょう。

演習: 初めてのコンテナをアップロードする

Docker IDをお待ちでない場合、登録が必要です。macOS やWindows で Docker Desktop を使用している場合は、ログイン時に作成したものと同じ ID になります。もし ID の作成がまだの場合は、https://hub.docker.com/ で登録をしてください。

コマンドラインで次のコマンドを実行します。

% docker login

ユーザー名とパスワードを入力しログインしておきます。

まず最初に、公式の Python イメージを基盤に新しいコンテナを作成し、bash シェルで対話型セッションに入ります。

% docker run -it python bash

新しいコンテナ内の bash シェルで作業できるようになったはずです。このコンテナ内で、apt パッケージマネージャを使用して、コマンドラインテキストエディタ nano をインストールしましょう。

% apt update
% apt install nano

コンテナ内で簡単な Python プログラムを書いてみましょう。nano を使って新しい Python ファイルを作成し、開きます。

% nano d6.py

このファイルでは、1から6の間のランダムな整数を生成する簡単なPython のプログラムを書きます。これはつまり、仮想のサイコロを振るプログラムです。Python に慣れていない場合は、次のコードをコピーしてファイルにペーストしてください。

import module
from random import randint
#assign a random integer between 1 and 6,
inclusive, to a variable
roll = randint(1, 6)
#print the variable
print(roll)

CTRL+O でファイルに書き込み、Enter で確定し、CTRL+X で nano を終了します。作成した Python のプログラムを実行してテストしてみましょう。

% python d6.py

コンテナ内の bash シェルで、1から6までのランダムな数字が表示されます。

% python d6.py
2

コンテナを終了させずに、ホストマシン上で別のコマンドラインセッションを開きます。例えば、macOS のターミナルでは、Command+T で別のタブを開くという簡単な操作で別のコマンドラインセッションを開くことができます。コンテナはまだ起動しているはずですので、次のコマンドを実行しコンテナIDを取得します。

% docker container ls

CONTAINER ID IMAGE  COMMAND CREATED    STATUS
python "bash"  1 hour ago Up 4 minutes

コンテナの現在の状態をイメージに commit して、先ほど書いた Python のプログラムを含んだ新しいイメージを作成します。

% docker commit -m “First commit” d6:1.0

この commit を順を追って見ていきましょう。-m フラグを使うと、短い説明文を追加することができます。これは、チームで作業している場合や、将来的にあなた自身や他の人のために「パンくず」を残したい場合に commit 内で行われた主要な変更を記録するためのよい練習になります。

次に、commit のベースとなるコンテナIDを指定します。

最後に、新しいイメージに名前「d6」を付け、バージョン番号「1.0」とタグ付けしています。

このcommit により、ローカルマシンに新しいイメージが作成されました。次のコマンドで確認してみましょう。

% docker image ls

イメージリストの最上段は、次のようになるはずです。

REPOSITORY TAG IMAGE ID CREATED
d6 1.0 1 hour ago

それでは、新しいイメージを Docker Hub にアップロードしてみましょう。アップロード用のタグを付けて、それをオンラインにプッシュします。

% docker tag d6:1.0 /d6:1.0
% docker push /d6:1.0

コマンドライン出力には、プッシュされている各レイヤーが表示されます。

The push refers to repository [docker.io//d6]
e06d6e649287: Pushed
51a0aba3d0a4: Mounted from library/python
e14403cd4d18: Mounted from library/python
8a8d6e9f7282: Mounted from library/python
...

コンテナ化されたサイコロの目が出るアプリは、Docker Hub から誰でもイメージとしてダウンロードできるようになりました。次のURLで表示されるはずです。

https://hub.docker.com/u/

この章では、非常にシンプルな静的アプリを作成しました。このアプリは出力を生成しますが、データの保存はしていません。

今回はここまでです。

本Blogの動画はこちら

次章では、コンテナによる永続的なデータストアの扱い方について説明します。

※Docker Enterprise事業は2019年11月14日にMirantis社によって買収されました。
当時のDocker Enterprise製品は、現在は下記のように名称変更されています。

Mirantis製品に関するお問い合わせはこちら

Mirantisについて
Mirantisは、Fortune 1000 企業の 2/3 以上にコンテナやマルチクラウドの導入を加速させ、データセンター運用のストレスを取り除く支援をしています。日本では、クリエーションラインと提携し、Kubernetes、OpenStack、その他のオープンクラウドテクノロジーを、現地語でのサポートやサービスとともに提供しています。Mirantis Kubernetes Engine(旧Docker Enterprise)および関連製品を含む、深い技術的専門知識とベンダーにとらわれない柔軟なプラットフォームが、お客様から選ばれています。
詳細は www.mirantis.com でご確認ください。

新規CTA