Dockerの導入前の設計、CentOS 7.xとDockerのインストール

2015年8月26日(水)

いよいよ、Dockerの導入前のOSレベルでの設計、さらに具体的な導入に入ります。DockerをLinux OSにインストールする手順自体は非常に簡単ですが、導入前の基本設計を怠ってはいけません。Dockerを導入するにあたって、採用すべきOSのファイルシステムや、パーティションに関する基本的な知識を習得しておく必要があります。ここでは、Dockerをインストールする前段階での、ハードウェアに関する様々な留意点を概要レベルで紹介します。また、Dockerをインストールする前段階で知っておくべき各種パラメータと初期設定、Dockerのインストール手順を紹介します。

物理サーバーのCPUに関する留意点

2015年8月下旬現在、最新のDockerでは、64ビットのx86アーキテクチャのサーバーシステムやPCで稼働させることができます。CPUの動作周波数などに特に制限事項はありませんが、まずは、Dockerが稼働するLinux OSがサポートするCPUの動作周波数やコア数などを確認しておくとよいでしょう。RHEL、Ubuntu Server、SLESなどはハードウェアベンダーとOSベンダーのサポートマトリクス(互換性リスト等)を参照すれば動作するサーバー機種とCPUが判明します。

CentOS 7系については、RHEL 7と互換性がありますので、RHEL 7でサポートされるx86サーバーを選定します。Dockerの導入するCPU数の目安については、残念ながら得に明確なサイジング指針があるわけではありません。ハイパーバイザー型の仮想化ソフトウェアの場合は、CPUコアあたりのゲストOSの数の目安がありますが、Dockerの場合は、ハイパーバイザー型の仮想化ソフトウェアに比べて、圧倒的な数のコンテナを稼働させることができるため、CPUコアあたりのコンテナ数の目安は、明確になっていません。ビッグデータ基盤における機械学習などのように、CPUに高い動作周波数が求められる場合は、価格とのバランスを見ながら、できるだけ最新のCPUを検討する必要があります。また、予算の都合上、CPUコア数が少ないマシンを選択せざるを得ない場合でも、省電力のカートリッジ型サーバーなどを導入すれば、従来のような、筐体の高さが1Uや2Uのラックマウント型のサーバーでハイパーバイザー型の仮想化ソフトウェアで集約した場合よりも、大幅に物理集約率を向上させることができます。特に、イミュータブルインフラなどのような開発系と本番系の2系統のハードウェア基盤を持ち、CPUコア数を多く必要とする場合は、ラックあたりのCPUコア数が多くなる高密度実装型のサーバーと電力消費量を検討してください。

物理サーバーのCPUに関する留意点

図1: 物理サーバーのCPUに関する留意点

メモリ及びディスクに関する留意点

メモリ容量については、全コンテナで動く全てのアプリケーションで必要とされるメモリ容量を算出し、ホストOSに必要なメモリ容量を加味しつつ、必要なメモリを検討します。Dockerでは、コンテナ実行時に、メモリ容量を指定できますが、アプリケーション毎に最低限必要なメモリ容量の一覧表を作っておくとよいでしょう。ディスク容量は、ホストOSで利用する容量、Dockerで起動するコンテナのOSイメージの容量(標準では1つコンテナあたり10GBですが、初期導入時に容量の値を指定することが可能)、アプリケーションが必要とするデータ容量を考慮します。ディスク容量についても、CPUやメモリと同様に、明確な指針があるわけではありません。実際の運用では、一人のユーザーがどれくらいの容量を使用し、何人ユーザーがいるのかに大きく依存しますので、ある程度、一人のユーザーの利用するデータ容量×ユーザー数に予備の容量を追加することで見積もる必要があるでしょう。

Dockerの場合は、OS環境とアプリケーションがセットになったイメージファイルを複数個入手し、開発を行うといった運用になります。多くはスナップショットによってディスク消費を節約できますが、大抵は、一人のユーザーが複数の種類のOSイメージと複数バージョンのOSイメージを利用する場合が多く、そのコンテナイメージの数だけディスクを消費しますので、ディスク不足に陥らないようにユーザーが利用できるサイズと用途をあらかじめ決定しておく必要があります。例えば、Hadoopのような外部ストレージを利用しない場合は、一般的に2Uサーバーにおいてディスク12~14本というのが目安になっています。非Docker環境で利用されるアプリケーションが必要とするディスクを参考にし、Dockerが利用する内蔵ディスクの容量に注意します。

OS領域は、RAID1の論理ボリュームを構成すればよいでしょう。一方、Docker用の領域は、OSとは別の論理ボリュームに作成し、RAID 6などの耐障害性を持つ論理ボリュームを構成するとよいでしょう。いずれの場合も、ハードウェアRAIDを実現するコントローラの導入をお勧めします。ただし、あまり複雑な論理ボリューム構成は、台数が増えると逆に運用が煩雑になります。特にイミュータブルインフラなどの台数がスケールするようなシステムの場合は、耐障害性を高めつつもシンプルなRAIDの論理ボリューム設計にし、なおかつ、RAIDを複数のサーバーで自動的に設定できる仕組み(*1)を導入してください。

[*1] 米国HPが提供する「HP Smart Scripting Toolkit for Linux」を使うと、HP ProLiantサーバーの物理サーバーのRAID設定を自動化することができます。

メモリとディスクに関する留意点

図2: メモリとディスクに関する留意点

Dockerの利用を見据えたCentOS 7.xのインストール

ここでは、Docker環境のためのホストOSのインストールについて注意点を交えながら解説します。以下は、Dockerのインストールまでの大まかな流れです。

  1. 物理サーバーへのCentOSのインストール
  2. ディスクのパーティショニング
  3. パッケージのインストール
  4. OSのアップデート
  5. Dockerのパラメータ設定
  6. Dockerのインストール
  7. Dockerの状態確認

まず、CentOS 7.xのインストールメディアは、CentOSコミュニティのダウンロードサイトからISOイメージで提供されています。CentOSコミュニティが提供する本家のサイト以外にミラーサイトが用意されていますので、適宜利用するとよいでしょう。

CentOSのメディアを入手できるミラーサイト一覧
http://www.centos.org/download/mirrors/

入手できるISOイメージには、いくつかの種類が存在しますが、Dockerをインストールする場合、基本的にはCentOS-7.0-XXXX-x86_64-DVD.isoで構いません。CentOS 7.xをインストール先は、サーバーの内蔵ディスクにします。CentOS 7.xの場合、Dockerのストレージバックエンドとして、標準では、devicemapperを使用しますので、Dockerで使用する領域(/var/lib/dockerディレクトリを含むパーティション)をXFSでフォーマットしても構いません。

CentOS 7.1におけるDocker環境のためのパーティショニング

サーバーに内蔵ディスク用のRAIDコントローラが搭載されている場合は、RAIDコントローラの管理ツール等で、OS領域用のRAID論理ドライブを/bootとスワップとルートパーティションに設定し、/var/lib/docker用に、別のRAID論理ドライブを作成します。以下は、CentOS 7.1におけるパーティション設定例です。あくまで一例ですので、RAID構成等は、システム要件によって変わります。

HP ProLiant Gen9サーバーに搭載されているオンボードのHP SmartArray RAIDコントローラでの設定例

RAID論理ドライブRAIDレベル用途
論理ドライブその1内蔵ディスクでRAID1OS領域用
論理ドライブその2内蔵ディスクでRAID6Dockerデータ領域用

CentOS 7.1におけるパーティション設計例

マウントポイントパーティションファイルシステム容量
/boot/dev/sda1XFS 500MB
スワップ/dev/sda2-4096MB
//dev/sda3XFS残り全部
/var/lib/docker/dev/sdb1XFS 3.0TB
[補足]

Dockerでは、XFS以外のファイルシステムとしてbtrfsやOverlayFSなど使うことが可能ですが、CentOS 7.1においても、btrfsは、インストーラで指定が可能です。btrfsの導入を検討している場合、/var/lib/dockerディレクトリは、別のデータ用のディスクを用意し、btrfsでフォーマット及びマウントするとよいでしょう。ただし、注意点として、CentOS 7.1においては、btrfsがテクノロジープレビューに位置づけられていますので、注意が必要です。また、OverlayFSについても、RHEL 7.1の段階において、btrfsと同様にテクノジープレビューに位置づけられています。これは、CentOS 7.1についても同様です。OSのどのような機能がテクノロジープレビューなのかについては、以下のCentOS 7.1及びアップストリームのRHEL 7.1のリリースノートを参照してください。

CentOS 7.1のリリースノート
http://wiki.centos.org/Manuals/ReleaseNotes/CentOS7/Japanese

RHEL 7.1のリリースノート
https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/7.1_Release_Notes/part-Red_Hat_Enterprise_Linux-7.1_Release_Notes-New_Features.html

RHEL 7のbtrfsに関する情報
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Storage_Administration_Guide/ch-btrfs.html

OSインストール後に、/dev/sdbをXFSで用意する方法

CentOSのインストーラで、Docker用の/dev/sdb1をXFSでフォーマットすることができますが、ディスクの交換などによって、OSインストール後にも、/dev/sdb1を個別でフォーマットして利用したい場合があります。最近では、2テラバイト以上のパーティションを利用することも当たり前になり、GPTパーティションの利用が一般的になりました。2テラバイトを超える場合には、fdiskではなく、partedを使用して、パーティションを作成します。以下に、3テラバイトの物理ディスクが/dev/sdbとして認識されている状態で、/dev/sdb1というGPTパーティションを1つ作成し、ディスク全体をXFSでフォーマットし、/var/lib/dockerにマウントする手順を示します。

# parted -s /dev/sdb 'mklabel gpt' ←GPTラベルの付与
# parted -s /dev/sdb 'mkpart primary 0 -1' ←プライマリパーティションで最大容量を指定
# parted -s /dev/sdb 'print' ←現在の状態を表示
モデル: ATA MB3000GCWDB (scsi)
ディスク /dev/sdb: 3001GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: gpt
ディスクフラグ:

番号  開始    終了    サイズ  ファイルシステム  名前     フラグ
 1    17.4kB  3001GB  3001GB                    primary

# partprobe /dev/sdb ←OSにパーティション変更の情報を知らせる
# mkfs.xfs /dev/sdb1 ←XFSでフォーマット
# vi /etc/fstab ←/etc/fstabファイルを編集
...
/dev/sdb1       /var/lib/docker         xfs     defaults        0 0
...
# mkdir /var/lib/docker
# mount /var/lib/docker ←/etc/fstabファイルに基づいてマウントできるかを確認
# reboot ←OSを再起動
# df -HT |grep docker
/dev/sdb1      xfs        3.0T   34M  3.0T    1% /var/lib/docker

パッケージ選択

DockerをCentOS 7.xにインストールする際の、パッケージの指定は、特に決められていませんが、セキュリティを重視する場合は、最小限のパッケージを選択し、インストールすればよいでしょう。ただし、IT部門の管理上の都合やユーザーの希望するシステム要件から、GUIなどのツールをインストールしたい場合などは、「サーバー(GUI使用)」を選択する場合もあるでしょう。パッケージ選択についても、システムの要件によって様々ですので、一概に「Docker環境では、これを選択すべきである」という指針はありません。ただし、不要なサービスをできるだけ起動させたくないという要件もありますので、Dockerでコンテナを稼働させる環境においてどのような役割を持たせるのかをはっきりと決め、パッケージ選択を行うようにします。今回は、CentOS 7.xのインストーラにおけるソフトウェアの選択画面において「サーバー(GUI使用)」を選択することにします。

OSでの設定

CentOS 7.xで採用されているDocker のインストールと基本的な利用方法について説明します。まず、OSに最新のアップデートをyumコマンドで適用します。もしyumコマンドを企業内のプロキシーサーバー経由で利用する場合は、/etc/yum.confファイルにプロキシーサーバーを事前に設定しておいてください。

# vi /etc/yum.conf
...
proxy=http://proxy.your.site.com:8080
...

事前にインターネット経由でパッケージをダウンロードできる状態にし、yumコマンドで、CentOS 7.xを最新の状態にアップデートします。

# yum update -y

今回は、Dockerをインストールする前に、FirewallとSELinuxを無効にしておきます。

# systemctl disable firewalld
# vi /etc/sysconfig/selinux
...
SELINUX=disabled
...

OSを再起動します。

# reboot

OS再起動後、アップデートが正しく適用されているかを見るため、OSバージョンとカーネルバージョンを確認します。

# cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)

# uname -r
3.10.0-229.4.2.el7.x86_64

Dockerのインストール

Dockerをyumコマンドでインストールします。インターネット経由でDocker関連のパッケージがダウンロードされます。

# yum install -y docker
[参考]

CentOS 7.xで提供されているDockerは、以下のURLで提供されています。
http://mirror.centos.org/centos/7/extras/x86_64/Packages/

インストールされているDockerのバージョンを確認します。

# docker -v
Docker version 1.6.0, build 8aae715/1.6.0

なお、企業内においてプロキシーサーバー経由でインターネットに接続する環境では、/etc/sysconfig/docker-network ファイルにプロキシーサーバーを適切に指定します。またローカルホストについては、プロキシーサーバーを経由しないようにします。

# vi /etc/sysconfig/docker-network
…
http_proxy=http://proxy.your.site.com:8080 ←自社のプロキシーサーバーのFQDN を指定
https_proxy=http://proxy.your.site.com:8080 ←自社のプロキシーサーバーのFQDN を指定
no_proxy=localhost,/var/run/docker.sock ←プロキシを経由しない設定
…

devicemapperで使用するデバイスに関するパラメータの設定

CentOS 7.xにおけるDockerは、コンテナのストレージバックエンドとしてdevicemapperが利用されます。このdevicemapperでは、利用するデバイスのパラメータを指定することができます。devicemapperで取り扱うデバイスのパラメータは、Docker環境を構築する際、/etc/sysconfig/docker-storageファイル内の「DOCKER_STORAGE_OPTIONS=」行に「--storage-opt 」をつけて、明示的に指定します。多くのパラメータがありますが、以下では、その中でも知っておくべきパラメータをいくつか紹介します。

dm.basesize

Dockerコンテナに割り当てられるディスク容量は、標準で10GBに設定されていますが、サイズの大きいコンテナを取り扱う場合は、調整が必要です。パラメータの決定の方針の一つとしてあげられるのは、KVMなどのゲストOSのイメージファイルから、Dockerイメージへの移行を検討している場合です。この場合は、KVMのイメージファイルが非常に大きいことが考えられますので、コンテナの初期サイズも大きく設定するのがよいでしょう。例えば、コンテナが使用するデバイスの初期サイズを50ギガバイトに設定する場合は、「dm.basesize=50G」を付与します。

dm.loopdatasize

Dockerで利用されているdevicemapperは、二種類のブロックデバイスのthinプール(データとメタデータ)を作成します。このデータとメタデータのブロックデバイスは、ループバックデバイスの仕組みを利用して、スパースファイルとして作成されます。スパースファイルとは、例えば、1テラバイトのスパースファイルを作成した場合、ユーザーから見ると、ファイルサイズが1テラバイトに見えますが、実際のデータは、数キロバイト程度の情報しか含まれないようなファイルであり、アクセスした部分のみが空ブロックから実際のデータに置き換わります。一方、メタデータには、空ブロックと実際にデータが書き込まれたブロックの位置情報が格納されており、devicemapperは、このメタデータの情報をもとにスパースファイルを管理します。このthinプール(データとメタデータ)は、どちらもファイルですが、このファイルをループバックデバイスに割り当てることで、ユーザーからは、デバイスとしてアクセスすることができます。このthinプールのサイズは、標準で100ギガバイトに設定されていますが、例えば、dm.loopdatasizeを200ギガバイトに設定する場合は、「dm.loopdatasize=200G」を付与します。

dm.loopmetadatasize

このパラメータは、thinプールのメタデータのサイズを指定します。このメタデータもスパースファイルで生成されます。標準では、2ギガバイトが指定されています。メタデータのサイズを4ギガバイトに指定する場合は、「dm.loopmetadatasize=4G」を付与します。

dm.fs

デバイスに使用するファイルシステムタイプを指定します。サポートされているファイルシステムは、ext4とXFSです。標準では、ext4が指定されていますが、XFSを指定する場合は、「dm.fs=xfs」を付与します。

dm.blocksize

thinプールのブロックサイズを指定します。標準では、64Kが指定されています。512Kを指定する場合は、「dm.blocksize=512K」を付与します。

指定できるその他のオプションについては、下記URLの「Storage driver options」の箇所を参照してください。
https://docs.docker.com/reference/commandline/cli/

[注意]

もし、Dockerを既に運用中で、後からこれらのパラメータを変更したい場合は、Dockerサービスを停止し、さらに、/var/lib/dockerディレクトリ以下を全て削除した上で、Dockerサービスを再起動する必要があります。このため、/var/lib/docker以下にある既存のDockerイメージ、コンテナを全て破棄することになりますので、Dockerのサービス導入前に、具体的なパラメータを慎重に検討してください。

以下に、Dockerのストレージオプションの設定例を示します。

# vi /etc/sysconfig/docker-storage
...
DOCKER_STORAGE_OPTIONS= --storage-opt dm.basesize=50G --storage-opt dm.loopdatasize=200G --storage-opt dm.loopmetadatasize=4G --storage-opt dm.fs=xfs --storage-opt dm.blocksize=512
...

オプションを記述したら、/var/lib/dockerが/dev/sdb1にマウントされていることを確認し、docker サービスを起動します。

# df -HT |grep docker
/dev/sdb1      xfs        3.0T  1.1G  3.0T    1% /var/lib/docker

# systemctl start docker
# systemctl status docker
# systemctl enable docker

これで、Dockerのサービスが起動され、/var/lib/dockerディレクトリ配下に、devicemapperが利用するファイル等が配置されます。Dockerの初期設定と起動は、これで完了です。

起動したDockerの状態を確認する

Dockerの状態を確認しておきます。ストレージドライバーにdevicemapperが指定されていることを確認してください。また、/etc/sysconfig/docker-storageファイルで指定したパラメータが反映されているかどうかも合わせて確認してください。

# docker info
Containers: 0
Images: 0
Storage Driver: devicemapper ←ストレージドライバー
 Pool Name: docker-8:17-8595657952-pool
 Pool Blocksize: 524.3 kB ←コンテナのプールのブロックサイズ
 Backing Filesystem: xfs ←ストレージバックエンドのファイルシステム
 Data file: /dev/loop0 ←Dockerで利用するループバックデバイス
 Metadata file: /dev/loop1 ←メタデータ用のループバックデバイス
 Data Space Used: 35.65 MB ←データ領域の使用済み容量
 Data Space Total: 214.7 GB ←データ領域の全容量
 Data Space Available: 214.7 GB ←データ領域の使用可能容量
 Metadata Space Used: 405.5 kB ←メタデータの使用量
 Metadata Space Total: 4.295 GB ←メタデータの全容量
 Metadata Space Available: 4.295 GB ←メタデータの使用可能容量
 Udev Sync Supported: true
 Data loop file: /var/lib/docker/devicemapper/devicemapper/data ←データのループファイル
 Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata ←メタデータのループファイル
 Library Version: 1.02.93-RHEL7 (2015-01-28)
Execution Driver: native-0.2
Kernel Version: 3.10.0-229.4.2.el7.x86_64 ←現在稼働中のカーネルバージョン
Operating System: CentOS Linux 7 (Core)  ←OSの種類
CPUs: 6 ←物理サーバーの搭載CPUコア数
Total Memory: 23.42 GiB ←物理サーバーの搭載メモリ容量
Name: dl160gen9.jpn.linux.hp.com ←物理サーバーのホストOSに付与されているホスト名
ID: UES4:IEUN:BI5J:DCYO:JWLR:ZHMV:TI6D:Z3P6:LGDA:MQAI:SKG3:PWYB

さらに、インストールしたDockerのクライアント、Dockerが稼働するOSのアーキテクチャ、DockerのサーバーとAPI等のバージョン等を確認しておきます。

# docker version
Client:
Version:      1.8.1 ←Dockerのバージョン(クライアント側)
API version:  1.20 ←APIのバージョン(クライアント側)
Go version:   go1.4.2 ←Goのバージョン(クライアント側)
Git commit:   d12ea79 ←Gitコミットのバージョン(クライアント側)
Built:        Thu Aug 13 02:19:43 UTC 2015 ←ビルドされた日付と時間
OS/Arch:      linux/amd64 ←OSの種類とそのアーキテクチャ(クライアント側)
 
Server:
Version:      1.8.1 ←Dockerのバージョン(サーバー側)
API version:  1.20 ←APIのバージョン(サーバー側)
Go version:   go1.4.2 ←Goのバージョン(サーバー側)
Git commit:   d12ea79 ←Gitコミットのバージョン(サーバー側)
Built:        Thu Aug 13 02:19:43 UTC 2015 ←ビルドされた日付と時間
OS/Arch:      linux/amd64  ←OSの種類とそのアーキテクチャ(サーバー側)
[補足]

上記のdocker versionにおいて、「OS/Arch (client)」と「OS/Arch (server)」には、「linux/amd64」と出力されていますが、この「amd64」は、AMD社製の64ビットCPUという意味ではなく、x86-64アーキテクチャを意味しています。物理サーバーに搭載されているx86-64アーキテクチャのプロセッサがIntel製、AMD製のどちらの場合も、「amd64」と出力されますので、この出力からCPUのメーカーを特定することはできません。CPUのメーカー名を特定し、固定資産管理を行う場合がありますが、CPUの種類やメーカー名は、「cat /proc/cpuinfo」の出力から情報を取得するようにしてください。

以上でCentOS 7.xへのDockerのインストールが完了しました。Dockerのインストールは、yumコマンドで簡単にインストールはできますが、Dockerが利用するファイルシステム、ブロックデバイス、パラメータに関する前提知識がないと、大規模システム向けのDocker環境の構築が困難になります。Dockerの場合は、ストレージに関するパラメータを設定後、一旦運用がスタートしてしまうと、devicemapper関連のパラメータの変更が効かないため注意を要します。他の仮想化環境のゲストOSのイメージファイルの移植や、ビッグデータ基盤などの大規模ストレージを駆使するDocker環境を検討する場合、ストレージ、ファイルシステム、ブロックデバイスに関するパラメータの設定は、特に注意してください。次回からは、具体的にDocker環境におけるコンテナの起動、管理などを紹介します。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています