コンテナ概要

はじめに

第29章はじめに

コンテナは、1つのアプリケーションまたはアプリケーション一式を他の実行中のプロセスから分離する、より軽量な方法を提供します。それぞれが完全なオペレーティング システムを構成する仮想マシンとは異なり、複数のコンテナを1つのシステムで同時に実行できます。これは、仮想化されたシステムでも物理的なシステムでもかまいません。

コンテナを展開する非常に一般的な方法は、Dockerを使用することです。これについては、後で詳しく説明します。


学習目標
この章の終わりまでに、次のことができるようになります。

コンテナを定義する基本的なパラメータと方法を理解できます。
コンテナと仮想マシンの違いを理解できます。
Dockerに精通し、Dockerを正しく使用するために必要な手順を知ることができます。
コンテナとDockerに関係する主要なコマンドを使用できます。


コンテナ概要

コンテナの基本
ハイパーバイザとLinuxカーネルをさらに統合することで、オペレーティング システム レベルの仮想マシンやコンテナが実現しました。コンテナは、Linuxカーネルの多くの機能を共有し、名前空間やcgroupなど、最近カーネルに追加されたいくつかの機能も利用します。コンテナは非常に軽量であり、仮想マシン全体に関連するオーバーヘッドを削減します。

コンテナの初期の形はOSコンテナでした。この種類のコンテナは、initプロセスを実行して複数のアプリケーションを生成する機能を備えた、オペレーティング システムのイメージを実行します。

LXC（Linux Containers）はその一例です。

図　コンテナ


アプリケーションの仮想化
仮想マシンに関連するオーバーヘッドをさらに削減するために、アプリケーション仮想化の人気が高まっています。アプリケーション仮想化は、コンテナごとに1つのアプリケーションを実行します。複数の単一アプリケーション コンテナは、通常1台のマシンで初期化されます。小さいコンポーネントを使用すると、柔軟性が向上し、仮想化に伴うオーバーヘッドを減少できます。

Dockerはそのようなプロジェクトの1つです。

図　アプリケーションの仮想化


コンテナと仮想マシン
仮想マシンとコンテナは両方とも重要なニーズを満たすものです。登場してからしばらくの間は両方ともは順調で、ほとんど全てのものに適用されると思われました。

両方とも長い歴史があります。

メインフレーム コンピュータには、何十年もの間、かなり特殊な方法でソフトウェア パーティションと仮想マシンを採用していました。
オペレーティング システムには、長年にわたってchrootとBSD Jailが実装されており、その基本的な分離の考え方はコンテナと同じです。

多くの異なるサービスとアプリケーションが緊密に統合する必要がある場合は、そのためのサービスを提供する仮想マシンは、最適なソリューションとなり得ます。

また、実行中のアプリケーションが、さまざまなサービスや他のライブラリとアプリケーションを備えた完全なオペレーティング システム環境を想定して記述されている場合も、仮想マシンが最適です。

仮想マシンはオペレーティング システムを完全な形で実行し、多くのサービスとアプリケーションも実行できます。このため、仮想マシンはコンテナよりも多くのリソースを使用します。これに対して、コンテナは通常、1つのアプリケーションとその実行に必要なミドル一式を実行します。コンテナは移植性が高く、仮想マシン内で実行できます。その半面、コンテナの保護は難しいものがあります。また、コンテナは通常、起動が速いです。複数のコンテナは1つのOSカーネルを共有しますが、各仮想マシンには独自のカーネルがあります。

コンテナと仮想マシンでは、ワークロードのスケーリングが異なります。KubernetesやMesosなどのオーケストレーション システムは、必要に応じて、コンテナの適切な数を決定したり、負荷分散を行ったり、イメージを複製したり、それらを削除したりできます。

ただし、全般的に見れば、仮想マシンは今も最良のソリューションです。


Docker
Dockerはアプリケーション レベルの仮想化です。対象のアプリケーションの実行をサポートするのに必要なサービスを構築するため、個別のイメージを多く使用します。これらのイメージはコンテナにパッケージ化されています - それらはコンテナ内のコンポーネントです。イメージに含まれる可能性のあるものは以下です。

アプリケーション コード
ランタイム ライブラリ
システム ツール
または、アプリケーションとその実行に必要なミドル一式

このイメージはDocker Hubまたはレジストリ サーバーに存在する場合があります。

Dockerのウェブサイトには、ドキュメント、チュートリアル、トレーニング情報があります。

Dockerの最も魅力的な機能の1つは、すべての依存コードとサービスをアプリケーションと共にパッケージ化し、最小限のオーバーヘッドで単一のユニットとしてデプロイできることです。このデプロイは、必要に応じて何度でも簡単に繰り返すことができます。これにより、エンド アプリケーションをサポートするために何層ものサービスをサーバーに構築する必要が少なくなります。


Dockerの手順
Dockerコンテナのアプリケーションの起動には、いくつかの手順があります。

お気に入りのツールでDockerサービス パッケージをインストールします
Dockerサービスを開始します
Docker Hubまたはプライベート リポジトリから適切なイメージを検索します
イメージを取得します
イメージを実行します
最後に、アプリケーションをテストします。

上記の手順は、Dockerアプリケーションのテストの最小限の例です。

もちろん、イメージを作成し、システム変数または構成パラメータを設定し、結果を新しいイメージとして保存する機能を含むなど、使用できるオプションは多数あります。場合によっては、書き込み不可のイメージではなく、書き込み可能なイメージが必要となります。

ほとんどのDockerコマンドには、個々のmanページがあります。例としては、docker(1)、docker-search(1)、docker-pull(1)、docker-create(1)、docker-run(1)などがあります。


dockerコマンド
dockerコマンドには40以上のサブコマンドがあり、その一部には50以上のオプションがあります。dockerコマンドの詳細は、以下のコマンドでいつでも知ることができます。

$ docker <command> --help

多くのdockerサブコマンドは、ある程度自己文書化されています。よく混同されるのは、run、 create、execです。psコマンドは-allオプションを指定すると、実行中のコンテナ、またはすべてのコンテナをリストします。

docker runは、新しいコンテナを開始し、その中でコマンドを実行します。一般的なオプションは、ttyに接続する-tと、コンテナをバックグラウンドで実行する-dです。

docker createコマンドは、コンテナを作成します。コンテナの設定と接続をするための多くのオプションがあります。

コンテナがすでに実行されていて、その中の何かを実行したい場合は、docker execコマンドを使用できます。また、-tと-dオプションも使えます。

docker images コマンドは、さまざまなイメージ情報を表示します。docker rmiコマンドは、デフォルトでは、イメージを削除し、タグ付けされていない親を削除します。

シェル関数を活用して、すべてのコンテナを操作することもできます。たとえば、停止したすべてのコンテナを削除するには、次のようにします。

$ docker rm $(docker ps -a -q)


Podman
RHEL8/CentOS8では、純粋なdockerの提供がなくなり、代わりにpodmanが提供されました。

Podmanは、コンテナの作成と管理に子／親のforkモデルを使用し、Dockerは、バックグラウンドで実行されるデーモンを備えたサーバー／クライアント モデルを使用します。

dockerエミュレーション レイヤーを使用して、RHEL/CentOS 8で演習を行う方法を示します。エミュレーション レイヤーは、Dockerコマンドと後方互換性があります。

他のディストリビューションは将来podmanを追加する可能性があります。まずは、標準的な手法で追加できるようにする必要があります。たとえば、Ubuntuにpodmanをインストールするには、次の手順をお勧めします。

$ sudo apt update
$ sudo apt install software-properties-common
$ sudo add apt-repository ppa:projectatomic/ppa
$ sudo apt update
$ sudo apt install podman

podmanには、より良いセキュリティとより少ないオーバーヘッドという利点があります。


演習

課題 29.1: Docker アプリケーションとして、Apache（httpd）をインストールしテストする

🚩
以下のPDFドキュメントに埋め込まれた外部URLにアクセスする場合は、常に右クリックして新しいタブまたはウィンドウで開いてください。直接クリックしてURLを開こうとすると、コース ウィンドウ／タブが閉じます。

【【これ以降は橋本さんの訳を挿入】】

Overview
In this exercise,  we will install,  run and test the docker package,  and follow with getting and deploying httpd,  the Apache web server container.

On RedHat, Centos, or Fedora
Please note that RHEL/CentOS 8 and recent Fedora distributions utilized podman.   On these systems docker is supported by a backwards compatibility layer:
$ sudo dnf install podman podman-docker

1.  Make sure Docker is installed (or emulated withpodman.) Pick the right command for your distribution:
$ sudo yum install docker                # RHEL/CentOS 7
$ sudo dnf install podman podman-docker  # RHEL/CentOS 8, Fedora
$ sudo apt install docker.io             # Ubuntu, Debian
$ sudo zypper install docker             # OpenSUSE

Reinstall Docker?
•  If you get strange errors at later points in the exercise you might find it useful to reinstall docker. We have observed cases (for example,  with RHEL 7) where docker configurations were broken,  after a system upgrade,

2.  Start the docker service:

Very Important
You can skip to the next step on podman-based systems as there is no docker service to start!

$ sudo systemctl start docker

You may want to verify that it is running properly with systemctl status docker:
Figure 29.3:Checking docker status

If you see anything indicating failure you should inspect /var/log/messages or whatever other logging file you have on your system for clues.  If you are running a standard distribution kernel you should be fine, but if you are running a custom Linux kernel, it is likely you have to select the proper configuration options, especially as regards to networking.This is too complicated to go into here, so please stay with a distribution supplied kernel unless you want a challeng ingexercise!

3.  Search for thehttpdcontainer, with
$ sudo docker search apache
Figure 29.4:Using docker search
(You could have used httpd instead of apache in the above command with very similar results.)
From now on we will not show detailed output since if you have gotten this far, things should be fine.

4.  Retrieve the container:
$ sudo docker pull docker.io/httpd
This may take a couple of minutes while all the components download.

5.  List the installed containers:
$ sudo docker images

6.  List the components associated with the images.
$ sudo  docker images --all

7.  Start the httpd docker container. The terminal will appear to hang as it is now connected to the httpd daemon.
c7:/tmp>sudo docker run httpd
AH00558: httpd: Could not reliably determine the server's fully qualified domain name,
using 172.17.0.2. Set the'ServerName'directive globally to suppress this message
......

8.  You can open a graphical web browser pointing to the IP address in the above output.  (Do not use the address shownin the output above!)
Or you can use a text-based browser (especially if you are not in a graphical environment) by opening up a new terminalwindow (do not kill the one in which the docker httpd container is running!) and doing one of the following commands:
$ lynx   http://172.17.0.2
$ w3m    http://172.17.0.2
$ elinks http://172.17.0.2
using whichever text-based browser is installed on your system.

9.  Stop the container and docker service and clean up.
c7:/tmp>sudo docker ps
CONTAINER ID    IMAGE    COMMAND CREATED STATUS PORTS NAMES
b936b0afeb23    httpd    "httpd-foreground"   41 seconds ago    Up 40 seconds 80/tcp boring_turing
c7:/tmp>sudo docker stop b936b0afeb23
b936b0afeb23

10.  This will leave images and their associated storage under either /var/lib/docker or /var/lib/containers depend-ing on your particular system and distribution. If you do not need to reuse them you can clean up with:
c7:/tmp>sudo docker rmi -f docker.io/httpd
Untagged: docker.io/httpd:latest
Untagged: docker.io/httpd@sha256:cf774f082e92e582d02acdb76dc84e61dcf5394a90f99119d1ae39bcecbff075
Deleted: sha256:cf6b6d2e846326d2e49e12961ee0f63d8b5386980b5d3a11b8283151602fa756
and on some systems you may also need to do: Deleted Containers:
c7:/tmp>sudo docker system prune -a
.....
On non-podmansystems you may also want to do:
c7:/tmp>sudo systemctl stop docker


知識チェック

「第29章 - コンテナ概要」を完遂しました。おめでとうございます。このクイズに答えて、これまでに学んだ概念の理解度をチェックしてください。

クイズ開始

問題 29.1
正しい文章を選択してください。ホスト システムでは、________________：

A. 一度に実行できるコンテナは1つだけです
B. 一度に実行できるのは、特定の種類の1つのコンテナだけです
C. 任意の種類の複数のコンテナを同時に実行できます
D. 種類が異なるものであれば、複数のコンテナを実行できます

問題 29.2
正しい文章をすべて選択してください。仮想マシンと比較して、コンテナは_________：

A. より少ないリソースを使用します
B. より多くのサービスとアプリケーションを実行します
C. 通常、より速く起動します
D. 移植性が低いです。

問題 29.3
Dockerが既にインストールされていると仮定すると、コンテナ化されたパッケージの起動ステップの正しい順序はどれですか？

i. Docker Hubまたは他の場所でコンテナ イメージを検索します

ii. イメージをpull(ダウンロード）します

iii. イメージを実行します

iv. Dockerサービスが起動されていない場合は起動します

A. ii, iii, i, iv
B. i, ii, iv, iii
C. iv, i, ii, iii





