サービス提供環境では、アプリケーションのパフォーマンス向上や環境依存の対応などの理由により、カーネルのチューニングや独自のネットワーク構成が必要な場合がある。このようなシステムレベルのチューニングが必要な状況に対して、Dockerのデーモン起動時にオプションを追加することで対応ができる。今回はDockerのプロセスであるDockerデーモンと、オプション設定方法について実例を交えて説明する。

Docker デーモンについて

Docker デーモンは、コンテナを管理する永続的なプロセスであり、Docker デーモンはユーザーからのDockerコマンドによる命令を実行することでコンテナの起動や再起動、停止などの管理をしている。

このDocker デーモンは、オプションが設定可能だ。例えば対象のDockerホストに対して、Dockerコマンドを別のサーバから実行したい場合は、以下のオプションを指定すればよい。

--host 0.0.0.0

Dockerで使用するネットワークのMaximum Transmission Unit(MTU)を1454に指定したい場合は、以下のオプションを追加すればよい。

--mtu 1454

では、どこにDocker デーモンのオプションを記載すればよいか。

今回はUbuntu16.04にDockerをインストールした環境で説明する。事前準備として、Docker デーモンのオプションを指定するファイルを作成する。

touch /etc/default/docker

作成したファイルにDockerデーモンのオプションを記載する。

DOCKER_OPTS="(追加したいDockerデーモンオプション)"

※Dockerデーモンに複数のオプションを指定したい場合は、オプションとオプションの間に半角スペースを空け、併記すればよい。

次にDockerプロセスを起動しているsystemdのserviceファイル(/etc/systemd/system/multi-user.target.wants/docker.service)を修正する。

(前略)

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
EnvironmentFile=/etc/default/docker
ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_OPTS

(後略)

※太字が追加と修正内容である。

修正が完了した後、以下のコマンドを実行してDockerを再起動する。

systemctl daemon-reload
systemctl restart docker

これでDockerデーモンにオプションの設定は反映された。

ではDockerデーモンのオプションが必要な状況について、活用事例を紹介する。

ElasticsearchのDockerコンテナでは、カーネルパラメーターのカスタマイズが必須であるため、Elasticsearchの環境構築とともに説明する。

DockerでのElasticsearch構築

Elasticsearchは、Elastic Co.が提供しているオープンソースの全文検索エンジンであり、WordPressはプラグインを介して連携することで、検索機能が利用できる。Elasticsearchの公式のDockerコンテナは、現在Elastic Co.が提供と管理をしている。

Install Elasticsearch with Docker | Elastic

このコンテナを、何の設定も加えずにdocker container runコマンドを実行しても起動しない。エラーログを確認すると、vm.maxmapcountの値が低すぎる、すなわち、1つのプロセスで利用可能なメモリマップの数の上限値が少なすぎることが確認できる。加えて、少なくとも値を262144以上に変更が必要という内容が表示されている。

sERROR: [1] bootstrap checks failed
[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

vm.maxmapcountはカーネルパラメーターであり、変更するにはDockerホストのカーネル設定の変更が必要となる。これはコンテナ型の仮想化環境が、ホストのカーネルの一部を共有して実現しているシステムだからだ。上記のドキュメントでは、Elasticsearchコンテナを利用するときには、Dockerホストにvm.maxmapcountおよびulimitのカーネルパラメーターの設定が必要であると記載されている。Elasticsearch コンテナ起動用のdocker-composeファイルでは、ulimitの設定がコンテナ起動パラメータに記載されている。これはコンテナで使用するカーネルパラメーターの情報の一部を、Dockerが管理できるからである。

ulimitのカーネルパラメーターを変更する場合、設定方法および影響範囲は以下に分類される。

・docker container run コマンド 設定方法:--ulimit オプションを追加して設定を記載 影響範囲:対象のコンテナのみ適用

・Dockerデーモンのオプション 設定方法:--default-ulimit オプションを追加して設定を記載 影響範囲:Dockerコンテナ全体に適用

・Dockerホストのlimit.conf 設定方法:/etc/security/limits.confに以下の設定を記載 影響範囲:Dockerホスト全体に適用

/etc/security/limits.conf

soft memlock -1 hard memlock -1

一方vm.maxmapcountは、Dockerでの変更は対応しておらず、Dockerホストでsysctlコマンドを実行し、直接変更する必要がある。

では上記を踏まえた上で、Elasticsearchの環境を構築してみる。

Ubuntu16.04のDockerホストを使用する。ulimitの設定はDockerデーモンのオプションでおこない、Elasticsearchのメモリー利用上限値は1GBとする。 手順は以下の流れだ。

  1. Dockerホストで以下のsysctlコマンドを実行する。
$ sysctl -w vm.max_map_count=262144
  1. Dockerデーモンにulimitのオプションを追加して、Dockerを再起動する。

----/etc/default/docker----- DOCKER_OPTS="--default-ulimit memlock=-1:-1" ----/etc/default/docker-----

3.以下のdocker container run コマンドを実行してElasticsearchコンテナを起動する。

docker container run \
--memory 1GB \
-p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
docker.elastic.co/elasticsearch/elasticsearch:5.6.3

これでElasticsearchの環境は完成だ。

このようにDockerではさまざまアプリケーションに対して、パフォーマンス向上や環境依存などに対応するための機能が備わっている。「このアプリケーションは特殊だからDockerは利用できない」と諦めていた方は、この記事が再度Dockerを利用するキッカケとなれば、これ幸いである。

本シリーズは、今回含め9回にわたりDockerの利用方法を紹介してきたが、紹介しきれなかった内容も複数存在する。これについては最終回の「Dockerに関するTips」で説明する。

CloudGarage開発担当
IaaS型パブリッククラウドサービス「CloudGarage」の開発エンジニア。バックエンドのサーバ構築からフロントのアプリケーション開発まで幅広く行う。「Docker」は実務でも頻繁に利用するため、実際に使っている立場から「Docker」について解説をする。