コンテナー化: Docker と IBM Cloud で始めよう

Docker コマンド、Dockerfile、IBM Cloud Container Registry で Docker を使用する方法

Comments

コンテナー化の世界に足を踏み入れて最初に目にするのは、Docker のはずです。このチュートリアルはクイックスタート・ガイドとして、Docker を操作するためのツールについて説明します。具体的には、Dockerfile、IBM Cloud™ (無料のアカウントを登録できます)、IBM コンテナー・レジストリー の 3 つです。

Docker

まずは Docker をインストールする必要があります。それにはいくつかの方法がありますが、最良の出発点は、このリンク先の Docker メイン・ドキュメント・サイトにアクセスすることです。ここから最新バージョンの Docker を入手できます。ご使用のオペレーティング・システム用の最新バージョンをインストールして、常に Docker を最新の状態に維持してください。

このチュートリアルを作成している時点で、Docker にはCommunity Edition (docker-ce) と Enterprise Edition (docker-ee) という 2 つの主要なエディションがあります。いずれにしても利点があり、それぞれに異なる使用ケースを目的としたものです。このチュートリアルを完了した後、上述のサイトにアクセスして docker-cedocker-ee のどちらが自分の目的に適っているか判断することをお勧めします。

以降で説明する手順とコマンドは、どちらのエディションを使うのでも機能します。さっそく始めましょう。

Docker CLI

docker のインストールが完了したら、コマンド・プロンプトを起動してください。ドキュメントでは、インストール時のサニティー・チェックを実行するよう推奨しています。以下のコマンドを使用してもう一度チェックを実行し、すべてが正常に機能していることを確認しましょう。

docker run hello-world

次のような出力が表示されるはずです (エラーや以下の内容とはまったく異なる出力が表示された場合、インストール環境は正しくセットアップされていないので、手順を進める前に問題を解決してください)。

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1.The Docker client contacted the Docker daemon.
 2.The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3.The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4.The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

成功です!docker インスタンスが正常に動作していることを確認できたので、Docker の操作を開始できます。

以下のコマンドを試してください。インターネットのアクセス状態によっては、コマンドが実行されてコンテナーが作成されるまでに時間がかかることがあります。ただし便利なことに、コンテナーを作成するために必要なイメージはマシン上にキャッシュされるので、2 回目以降はキャッシュ内のイメージを使用してコンテナーを作成できます。

docker run -it centos:latest /bin/bash

上記のコマンドを実行すると具体的に何が行われるのか説明しましょう。この docker コマンドでは Docker に対し、パブリック Docker Hub から latest バージョンのイメージをコピーし、/bin/bash シェルでそのコピーを実行するよう指示しています。 コマンドに従い、Docker はインターネットにアクセスして指定されたイメージ・バージョンを見つけ、それをキャッシュ内のイメージの SHA と照らし合わせます。イメージがキャッシュされていない場合は、Docker Hub から該当するイメージをプルします。 明確にするために言っておくと、-it を指定しているのは、コマンドを interactive として実行し、コンテナーの tty を作成するためです。 今回は次の出力が表示されるはずです。

Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
a02a4930cb5d: Pull complete
Digest: sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426
Status: Downloaded newer image for centos:latest
[root@2de726a5fcb8 /]#

成功です!2 つ目の Docker コンテナーが稼働中になりました。exit と入力した後、もう一度 docker コマンドを実行してください。

[root@2de726a5fcb8 /]# exit
exit
$ docker run -it centos:latest /bin/bash
[root@583c6cec5d41 /]#

ルートが @2de726a5fcb8 から @583c6cec5d41 に変わっていることに注目してください。これは、このように起動したコンテナーはエフェメラル・コンテナーになるためです。エフェメラルとは、実行されている間だけ存続し、ユーザーによって終了されると消えてなくなることを意味します。存続期間の長いコンテナーを起動する方法については後で説明します。

このエフェメラル・コンテナー内で簡単な処理を試してみましょう!このコンテナーは CentOS マシン・イメージで作成されていることから、yum を使用できます。 これを使ってインストール処理を試してみましょう。

[root@583c6cec5d41 /]# yum install vim

[-- snip --]

Transaction Summary
=======================================================================================================
Install  1 Package (+32 Dependent packages)

Total download size: 19 M
Installed size: 63 M
Is this ok [y/d/N]: y

[-- snip --]

  perl-podlators.noarch 0:2.5.1-3.el7                  perl-threads.x86_64 0:1.87-4.el7
  perl-threads-shared.x86_64 0:1.43-6.el7              vim-common.x86_64 2:7.4.160-5.el7
  vim-filesystem.x86_64 2:7.4.160-5.el7                which.x86_64 0:2.20-7.el7

Complete!
[root@583c6cec5d41 /]#

コンテナー内で vim を実行できるようになったことを試してください。

[root@583c6cec5d41 /]# vim

vim を終了する方法がわからないとしたら、:q と入力してください。これによりコマンド・プロンプトが再表示されるので、

前と同じく exit と入力します。

[root@583c6cec5d41 /]# exit
exit
$ docker run -it centos:latest /bin/bash
[root@86f1f3872cbe /]# vim
bash: vim: command not found
[root@86f1f3872cbe /]# exit
exit
$

もう一度強調しておきますが、コンテナーを削除すると、そのコンテナー内で行ったすべての変更も削除されます。

Dockerfile

コンテナーを起動して変更を加えられるようになりましたが、その変更を保持するにはどうすればよいでしょうか?それにはいくつかの方法があります。最善の方法は自力で見つけ出すようお勧めしますが、コンテナー内の変更を保持するための最も一般的な方法を紹介しておきます。それは、Dockerfile を使用することです。

コマンド・プロンプトに戻って、新しいディレクトリーを作成し、カレント・ディレクトリーをそのディレクトリーに変更してください。その後、Dockerfile という名前の新しいファイルを作成し、任意の $EDITOR を使用してファイルを開きます。

$ mkdir docker-tutorial
$ cd docker-tutorial
$ $EDITOR Dockerfile

Dockerfile の重要なポイントについては、ここでいくつか取り上げますが、Dockerfile のベスト・プラクティスに関する [ドキュメント][dockerfile]を一読することを強くお勧めします。Dockerfile の力を把握できるはずです。

Dockerfile 内に、次のすべての行を追加します。

FROM centos:latest
RUN yum install vim -y && mkdir /vim
WORKDIR /vim
ENTRYPOINT ["vim"]

ファイルを保存します。必ず Dockerfile というファイル名にしてください。

上記の 4 行の意味は次のとおりです。

  • FROM : centos:latest Docker イメージに基づくレイヤーを作成します。
  • RUN : コンテナーを構築するために、コンテナー内に vim をインストールして /vim という名前のディレクトリーを作成します。
  • WORKDIR : コンテナーの作業ディレクトリーを指定します。
  • ENTRYPOINT : コンテナーの起動時に実行するコマンドです。今回は前のように /bin/bash シェルを実行するのではなく、このコマンドを実行します。

次は、この Dockerfile をローカルでビルドします。Dockerfile が格納されているディレクトリー内で次のコマンドを実行し、 同じような出力が表示されることを確認します。

$ docker build .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos:latest
 ---> 1e1148e4cc2c
Step 2/4 : RUN yum install vim -y && mkdir /vim
 ---> Running in ebd37633ab31
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
 * base: mirror.fileplanet.com
 * extras: mirror.ash.fastserv.com
 * updates: www.gtlib.gatech.edu
Resolving Dependencies

[-- snip --]

Step 4/4 : ENTRYPOINT ["vim"]
 ---> Running in 82618eb1e891
Removing intermediate container 82618eb1e891
 ---> eda2652aa25e
Successfully built eda2652aa25e
$

: 皆さんの場合、出力されるハッシュは eda2652aa25e ではないはずです。この点をお忘れなく。

成功です!初めての Dockerfile を作成して、カスタマイズされた Docker コンテナーを構築できました。

このコンテナーを実行しましょう。それには、次のコマンドを実行します。

$ docker run -it eda2652aa25e

vim が起動したことを確認できるはずです。前と同じく、vim を終了するには :q と入力してコマンド・プロンプトを再表示します。上記のコマンドは何度でも実行できます。そのたびに、新しいインスタンスが作成されます。けれども、実際に何かを保存することも、何かを読み取ることもできません。これはコンテナーに過ぎないからです。この問題に対処しましょう。

問題の対処方法として、バインド・マウントとボリュームを追加し、ローカル・ディレクトリーをコンテナー内にマウントします。マウントとボリュームについて詳しく調べるには、その出発点としてこのリンク先のページを読んでください。ボリュームは難解な概念のうちの 1 つですが、時間をかけて理解する価値があります。

コマンド・ライン上で、hello という名前の新しいファイルを作成し、hello world という語句を追加してからファイルを保存します。

$ EDITOR hello

ローカル・ディレクトリーをコンテナー内にマウントします。

$ docker run -it -v ${PWD}:/vim eda2652aa25e

vim 内で :e hello と入力します。hello world というメッセージが表示されるはずです!このように、vim を組み込んだコンテナーを作成して、そのコンテナー内にローカル・ディレクトリーをマウントすることで、ホスト・マシン上で作成したファイルを 開けるようになります。

試しに、i に続けて何らかのテキストを入力した後、:wq を入力してください。これによってコンテナーが終了したら、コマンド・ラインで次のコマンドを入力します。

$ cat hello
hello world
I added th is line from my container
$

: 上記の I added this line from my container はもちろん私が入力した例であり、この部分には皆さんが入力したテキストが表示されるはずです。

成功です!次は、このコンテナーを世界中で共有する方法を見ていきましょう。

IBM Cloud

ここでは ibmcloud CLI がインストール済みで機能していることを前提とします。この前提に当てはまらない場合は、このリンク先のページで説明しているインストール・プロセスに従って CLI をインストールしてください。

ibmcloud にログインし、任意のバックエンドに対して認証されることを確認します。

$ ibmcloud login --sso

API endpoint: https://api.ng.bluemix.net

Get One Time Code from https://identity-2.us-south.iam.cloud.ibm.com/identity/passcode to proceed.
Open the URL in the default browser?[Y/n]> Y
One Time Code >
Authenticating...
OK

[-- snip --]


Tip: If you are managing Cloud Foundry applications and services
- Use 'ibmcloud target --cf' to target Cloud Foundry org/space interactively, or use 'ibmcloud target --cf-api ENDPOINT -o ORG -s SPACE' to target the org/space.
- Use 'ibmcloud cf' if you want to run the Cloud Foundry CLI with current IBM Cloud CLI context.

$

次は、Container Registry で使用する名前空間を作成します。名前空間がグローバルに一意のものになり、さらに レジストリーの内容がわかるような名前をじっくりと考えてください。コンテナー・イメージ、名前空間の名前、説明フィールド (レジストリー・トークンなど) にも、イメージ構成データ (イメージの名前やラベルなど) にも、決して個人情報を含めないでください。

$ ibmcloud cr namespace-add jjasghar
Adding namespace 'jjasghar'...

Successfully added namespace 'jjasghar'

OK

上記のコマンドは Container Registry プラグインを使用して、私のアカウント内に jjasghar という名前空間を作成します。

便利なことに、IBM が作成したショートカットをいくつか使用できるようになっています。作成した IBM Container Registry にコンテナーをプッシュするには、1 つのコマンドを実行すればよいだけです。コマンドを実行する前に、その処理内容について簡単に説明しておきます。以下のコマンドは、コンテナーを作成し、そのコンテナーに名前 vim とバージョン 1 のタグを付けてからレジストリーにプッシュします。コマンドで使用されている jjasghar の部分は実際の名前で置き換える必要があります。また、コンテナーの名前を変更しなければならないこともあります。

: コマンドの最後に . を付けるか、Dockerfile が置かれているディレクトリーを指定することを忘れないでください。build コマンドはこれによってコンテナーの実行場所を把握します。

$ ibmcloud cr build --tag registry.ng.bluemix.net/jjasghar/vim:1 .
Sending build context to Docker daemon  3.072kB
Step 1/4 : FROM centos:latest
latest: Pulling from library/centos
a02a4930cb5d: Pull complete
Digest: sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426
Status: Downloaded newer image for centos:latest
 ---> 1e1148e4cc2c
Step 2/4 : RUN yum install vim -y && mkdir /vim

[-- snip --]

Successfully tagged registry.ng.bluemix.net/jjasghar/vim:1
The push refers to repository [registry.ng.bluemix.net/jjasghar/vim]
36ce508f1fe2: Pushed
071d8bd76517: Pushed
1: digest: sha256:831fcbac319dda1aab3d022c408ecc5cc1c1b825bcd90fc7694c3d4f0ef4eb9a size: 741

OK

コンテナーが作成済みの IBM Container Registry にプッシュされました!

プッシュされたことを確認するには、次のコマンドを実行してコンテナーをリストアップします。

$ ibmcloud cr image-list
Listing images...

REPOSITORY               TAG   DIGEST         NAMESPACE   CREATED         SIZE     SECURITY STATUS
us.icr.io/jjasghar/vim   1     831fcbac319d   jjasghar    4 minutes ago   120 MB   No Issues

OK

次はコンテナーをプルします。それには、次のコマンドを実行します。

$ docker run -v ${PWD}:/vim -it registry.ng.bluemix.net/jjasghar/vim
Unable to find image 'registry.ng.bluemix.net/jjasghar/vim:latest' locally
docker: Error response from daemon: Get https://registry.ng.bluemix.net/v2/jjasghar/vim/manifests/latest: unauthorized: authentication required.

残念!上記の出力に示されているメッセージはエラー・レスポンスです。何が問題になっているのか調べなければなりません。それには、IBM Container Registry にログインして、次のコマンドを実行してください。

$  ibmcloud cr login
Logging in to 'registry.ng.bluemix.net'...
Logged in to 'registry.ng.bluemix.net'.

[-- snip --]

$ docker run -v ${PWD}:/vim -it registry.ng.bluemix.net/jjasghar/vim
Unable to find image 'registry.ng.bluemix.net/jjasghar/vim:1' locally
1: Pulling from jjasghar/vim
a02a4930cb5d: Already exists
209873925a88: Pull complete
Digest: sha256:831fcbac319dda1aab3d022c408ecc5cc1c1b825bcd90fc7694c3d4f0ef4eb9a
Status: Downloaded newer image for registry.ng.bluemix.net/jjasghar/vim:1
# and you should see vim now

成功です!これで、コンテナーを作成して IBM Container Registry にプッシュする方法を習得できたはずです。

このチュートリアルの最後の作業として、コンテナーを削除します。以下の一連のコマンドを実行することで、ローカル・キャッシュがクリーンアップされて、Cloud Registry 上の名前空間からイメージが削除されます。

$ docker rmi registry.ng.bluemix.net/jjasghar/vim:1

上記のコマンドでは、名前空間、イメージ名、バージョンの部分を該当する値で置き換える必要があります。最後に、Cloud Registry からイメージを削除します。

$ ibmcloud cr image-rm us.icr.io/jjasghar/vim:1
Deleting image 'us.icr.io/jjasghar/vim:1'...

Successfully deleted image 'sha256:831fcbac319dda1aab3d022c408ecc5cc1c1b825bcd90fc7694c3d4f0ef4eb9a'

OK

お疲れさまでした。このチュートリアルはこれで完了です。一般的な docker コマンドの使い方、Dockerfile の仕組み、そして IBM Cloud Container Registry の利用方法を理解していただけたことを願います。不明な点やご意見がある場合は、遠慮なく Twitter の @jjasghar までお知らせください。

参考資料

次のステップ

このチュートリアルを完了して Docker と Container Registry を利用する方法を把握した後は、「Kubernetes ラーニング・パス」に取り組んでください。コンテナーとオーケストレーションについて自分のペースで学習を進めることができます。

また、Docker での操作を他にも試してみたいという場合は、「Gain access to your DockerHub public and private repos」「Create a database in a Docker container for local development」 のチュートリアルに取り組むことをお勧めします。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Cloud computing
ArticleID=1066319
ArticleTitle=コンテナー化: Docker と IBM Cloud で始めよう
publish-date=07252019