Ebook連載:『5分x10回で学ぶ 開発者のためのDocker コンテナ入門』第2章
#docker #DX #Mirantis
★ 37

コンテナ化はDXの第一歩に最適な取り組みです。これから10回にわたってMirantis社が発行するEbook「Learn Containers 5 Minutes at a Time An introductory guide for developers」 (Eric Gregory著)を翻訳・編集し、チャプターごとにCL LABで公開していきます。本稿はその第2章です。皆さまのクラウドネイティブジャーニーやアプリケーションのモダナイズの一助になれば幸いです。
第2章: コンテナの作成・調査・削除
前章では、コンテナの仕組みを学び、コンテナエンジンのインストールを行いました。
それではコンテナを作成してみましょう。ターミナルで次のように入力します。
% docker container run alpine echo Hello World
※本書では、端末で実行するコマンドを「%」に続く形で表記します。これはコマンドの一部ではありません。「%」は、出力ではなく端末の入力を示す目印とします。
このコマンドは Docker を呼び出し、container run で新しいコンテナを作成するように指示しています。
Docker にコンテナイメージをコンテナの基盤として使用するように非常に軽量な Linux ディストリビューションのバイナリとライブラリを提供する alpine というコンテナイメージをコンテナの基盤として使用するように指示しています。コンテナイメージに関しては次章で詳しく説明します。
また「echo Hello World」パラメータは、新しいコンテナ内で実行するプロセスを指定するものです。システムコマンドの echo は引数で渡した文字列を出力するもので、ここでは Hello World を出力したい文字列として渡しています。
このコマンドを実行すると、Docker は alpine イメージをダウンロードしてからプロセスを実行し、ターミナルに次のように出力するはずです。
Unable to find image 'alpine:latest' locally latest: Pulling from library/alpine 59bf1c3509f3: Already exists Digest: sha256:21a3deaa0d32a8057914f36584b5288d2e5ecc9843 80bc0118285c70fa8c9300 Status: Downloaded newer image for alpine:latest Hello World
Docker Desktop ユーザは、アプリケーションを開くとグラフィカルユーザーインターフェースに、ランダムに生成された名前の新しいコンテナが表示されます。
もう少しレベルを上げて、継続的にプロセスを実行するコンテナを作成してみましょう。先ほどと同じ基本的なコマンド文を使用しますが、今回はコンテナ内でpingコマンドを実行します。
% docker container run alpine ping localhost
今回のコマンドを実行して、いくつかの違いに気づいたでしょうか。まず、すでに alpine イメージはマシン上にあるので、コンテナはすぐに起動しました。次に、コマンドは echo と同じようには終了しません。ping プロセスは継続的に実行し、ネットワーク接続を継続的にチェックしています。CTRL+C キーを押すことで、このプロセスを停止することができます。
プロセスを停止した後、ターミナルを使ってシステム上のコンテナを見てみましょう。Mac や Windows であれば、Docker Desktop 上で見ることができますが、ターミナルでも次のコマンドですぐにこの情報を呼び出せるので覚えておきましょう。
% docker container ls -a
このコマンドでは、-a フラグを使用しているので、実行中かどうかにかかわらず、すべてのコンテナがリストアップされます。echo コンテナと ping コンテナの両方が表示され、名前とコンテナ ID などの有用な情報も表示されます。ping コンテナのIDをメモしておいてください。例えば今回は 5480aa85d1c5 とします。
それでは ping コンテナを再起動してみましょう。start コマンドを使うことで現在のシェルとは別にコンテナプロセスが実行されるので、その間に他のコマンドを入力できます。次の 5480aa85d1c5 はあなたのコンテナのIDに置き換えてください。
% docker container start 5480aa85d1c5
ターミナルには実行するコンテナのIDが表示されます。また -a フラグを付けずに ls コマンドを使用して確認することも可能です。
% docker container ls
このコマンドで実行中のコンテナのみが表示されます。ping コンテナはここに表示されるはずですが、echo コンテナは表示されません。
最後に、内部で何が起こっているかをよりよく理解するために、コンテナをもう少し詳しく調べてみましょう。実行中のコンテナ ID を指定して top コマンドを使用すると、ホストシステムの観点からコンテナ内で実行中のプロセスに関する情報を得ることができます。
% docker container top 5480aa85d1c5
すると、次のような出力が得られます。
UID PID PPID C STIME TTY TIME CMD root 3509 3481 0 16:17 ? 00:00:00 ping localhost
2列目の PID は、コンテナ化された ping のプロセスID番号を示しています。これはホストマシンの OS カーネルが、そのマシンで実行中のプロセスを追跡するために使用している番号で、今回の場合は数千のうちの1つであることがわかります。つまり、ping プロセスはホスト OS のカーネルを使用しており、カーネルはこのプロセスを長いリストの中の 3509 番として認識していることがわかります。
コンテナが自身を分離する方法の1つとして、カーネルネームスペースがあると前述しました。これはホストのカーネルではなく、コンテナ内のカーネルに対してプロセスが自身を識別する方法です。比喩的に言えば、プロセスが自分自身を見る方法と、より広い世界から自分を見る方法を対比していると考えることができます。コンテナ内からコンテナを見てみましょう。
% docker container exec 5480aa85d1c5 ps
これにより、コンテナから見たコンテナ内で動作しているプロセスの情報を得ることができます。コンテナのカーネルネームスペースでは、pingプロセスは PID 1 です。また、先ほどコンテナ内で実行した ps コマンドも表示されます。
コンテナ内で PID 1 として実行されている ping は、より広いシステム上のカーネルでは PID 3509 で示されるプロセスとまったく同じものです。コンテナには独自の分離したカーネルネームスペースがあるため、コンテナ自身からは外の広い世界は見えません。
最後に後始末をしておきましょう。次のコマンドのIDをあなたのIDに変更して、実行中のコンテナを停止します。
% docker container stop 5480aa85d1c5
コンテナを停止したので、次のコマンドを使用して削除することができます。
% docker container rm 5480aa85d1c5
未使用のコンテナを削除することは、ITハイジーンの観点からも重要なことです。echo コンテナも忘れずに削除してください。ls コマンドで -a フラグを付けると、その ID を取得できます。
次の章では、コンテナイメージについて詳しく見ていきます。
※1 Docker社のエンタープライズ事業は2019年11月14日にMirantis社によって買収されました。当時のDocker Enterprise製品は、現在は下記のように名称変更されています。
「Docker Engine」→「Mirantis Container Runtime (MCR)」
「エンタープライズ版Docker」→「Mirantis Kubernetes Engine (MKE)」
「Docker Trusted Registry」→「Mirantis Secure Registry (MSR)」
Docker(現Mirantis Container Runtime)やDXに関するお問い合わせはこちら。
この記事の動画はこちら。
CL LAB Mail Magazine
メールアドレス: 登録
※登録後メールに記載しているリンクをクリックして認証してください。