straightweeds.hatenablog.com

30代のシステムエンジニアが興味のあることだけ書くブログ

dockerを使ってみる(概要とインストール)(CentOS7 + docker)

VMwareHyper-Vなどの仮想化技術を知らないという方はもういないと思います。

それと並ぶ仮想化としてdockerがあります。

今回はCentOSにdockerをインストールしてちょこちょこっと使える土台を作ってみましょう。

f:id:straightweeds:20180801094519p:plain

dockerとは

そもそもdockerとは何なのでしょうか。仮想化ということまではわかるけど、VMwareHyper-Vと何が違うの?と思う方もいるかもしれませんので簡単にdockerについて説明します。

dockerは分類でいうとコンテナ仮想化と言われるものです。それに対してVMwareHyper-Vはサーバ仮想化と言われます。

※本記事ではVMwareHyper-Vをサーバ仮想化として紹介していますが、vSphere Integrated ContainerやHyper-V Containerなどはコンテナ仮想化です

サーバ仮想化はサーバの上にサーバを作ってしまえ!という考え方でした。 仮想化されたサーバは仮想サーバ、土台となるサーバは仮想化ホストなどと呼ばれています。

この場合軽量とはいえ仮想化ホストもサーバとしてリソースを消費します。 つまり仮想化ホスト上に仮想サーバを2台構築した場合、サーバリソースは3台分必要となってきます。

それに対してコンテナ仮想化は少し異なる考え方です。

サーバ仮想化 と コンテナ仮想化の比較

実際に図で確認してみましょう。

サーバ仮想化

f:id:straightweeds:20180801105431p:plain

コンテナ仮想化

f:id:straightweeds:20180801105436p:plain

コンテナ仮想化の強み

上の図にもある通り、サーバ仮想化がすべてのマシンでOSが必要となるのに対し、コンテナ仮想化は各コンテナにOSを持ちません。

OS部分はホスト側のものを利用します。

つまりリソースの使用量がサーバ仮想化に比べて少ないのです。

また、サーバ仮想化も同じですがコンテナ仮想化もコンテナの作成、使用、破棄が簡単に行え、他のコンテナへ影響を及ぼしません。

つまり仮想化の利便性を損なわず、サーバ仮想化よりホストの持つリソースを有効利用できることがコンテナ仮想化の強みです。

実際にCentOS7にインストール

それではCentOS7上にdockerをインストールしてみましょう。

1.前提

前提としてSELinuxは無効化しておいてください。

2.yumからインストール

yumを使用してインストールします。

# yum install docker

3.起動と有効化

# systemctl enable docker

4.コンテナイメージ等の格納パスの変更 これは任意です。

# mkdir <フォルダ作成>
# vi /etc/sysconfig/docker
- OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false'
+ OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false -g [作成したフォルダパス]'

5.開始

# systemctl start docker

以上でdockerが使用可能になりました。

コンテナ上のディスク領域の指定(-vオプション)

dockerの場合、コンテナを作成するためには以下のコマンド1行でできます。

# docker run コンテナイメージ名

ただ、ここで疑問が出てきます。コンテナの使うディスク領域はどこに格納されるのでしょうか。

このコマンドをそのまま実行すると作成されるコンテナのディスク領域はコンテナイメージとしてインクルードされ、dockerの指定フォルダに作成されます。

ただ、このディスク領域に書き込まれている初期コンテナからの差分はdockerが再起動することによって消えてしまいます。

検証環境などの場合はこの方が便利かもしれませんが、例えばコンテナでmysqlなどのDBを立ち上げ、通常に利用する場合、再起動のたびにデータが初期化されたら使えなくなってしまいます。

そんなことを回避するためにdockerコマンドにはオプションとして[ホストの任意のパスをコンテナの任意のパスにマウントする]というオプションが用意されています。

# docker run -v [ホストの任意のパス]:[コンテナの任意のパス] コンテナイメージ名

このオプションを使用することでコンテナ上の任意パスのデータはホスト上の任意のパスに格納され、コンテナを再起動したとしてもコンテナ上の任意のパスに格納されたデータが初期化されることはありません。

コンテナのデタッチ(-dオプション)

コンテナが実行するルート・プロセスが終了したら、デタッチド・モードで起動したコンテナも終了します。

デタッチド・モードのコンテナは停止しても自動的に削除できません。

ちょっと難しい話ですが、これをつけることによってルート・プロセスが終了するまでコンテナを起動し続けることができます。

# docker run -d コンテナイメージ名

コンテナ名の指定(--nameオプション)

コンテナを複数作成した際に管理のためにコンテナ名を指定しておいた方が便利です。

コンテナ名はオプションで指定できます。

# docker run --name [コンテナ名] [コンテナイメージ名]

ポートの指定

dockerは一つのホスト上に複数コンテナを立て、その上にアプリケーションを配置できます。

その際に問題になってくるのはポートです。

例えばどちらもapache-tomcatで構築されたアプリケーションを動かすためにコンテナを2個立てたとします、その場合どちらのアプリケーションも8080ポートを使用します。

dockerでは各コンテナは表向き、つまり外部(ホストの外)からアクセスできるIPアドレス保有しないため外部からアクセスする場合は[ホスト:ポート]でアクセスすることとなります。

となるとどちらのアプリケーションにアクセスするにも[ホスト:8080]でアクセスすることになり、ポートが競合してしまいます。

そのようなことを避けるためdockerではポートマッピングができます。

これは[コンテナ上の特定のポート]を[ホスト上の特定のポート]とリンクさせ、外部からのアクセスに使用させるということです。

これもオプションで指定します。

# docker run -p [ホスト上の特定のポート]:[コンテナ上の特定のポート] コンテナイメージ名

dockerやホスト再起動時に自動的にコンテナを起動する(--restartオプション)

オプションを指定しない場合、コンテナはdockerやホストの再起動時に自動的に起動されません。

コンテナの自動起動もdockerコマンドのオプションで指定できます。

# docker run --restart=always コンテナイメージ名

まとめ

ざっとdockerの仕組みと主要どころのコマンドとオプションを記載してみました。

この記事は必要に応じて追記していく予定ですので都度確認してもらうと役立つかもしれません。

次回からは実際にコンテナの作成の記事を書きたいと思います。

↓気が向いた時でいいので[スポンサーリンク]をポチって頂けると幸いです↓