インストールしたDocker EEを適切に設定する

こんにちは。エクセルソフトの田淵です。

前回Docker EE評価版をインストールするところまでを記載しました。今回はdeamonの起動設定やトラブルシューティングについて記載していきます。

rootユーザー以外でも操作できるように設定する

DockerはUnixソケットをTCPポートにバインドするため、rootユーザーでしか動作しません。sudoコマンドを使いたくないという場合は、dockerグループを作成してそこにユーザーを追加してください。(なお、Docker EEをインストールした場合は、インストール時にdockerグループが作成されているようです。)

dockerグループにはroot権限を付与しますので、注意してください。

次のコマンドを実行します。まずはdockerグループを作成します。

[code language=”bash”]
$ sudo groupadd docker
[/code]

dockerグループにユーザーを追加します。

[code lang=bash]
$ sudo usermod -aG docker $USER
[/code]

ログアウトして再度ログインします。仮想マシンで実行している場合は、仮想マシンの再起動が必要な場合があります。
sudoしなくてもdockerコマンドが実行できることを確認してください。

[code lang=bash]
$ docker run hello-world
[/code]

Dockerをブート時に実行させるよう設定する

現在の主要なLinuxディストリビューション(RHEL、CentOS、Fedora、Ubuntu 16.04 以上など)はSystemdを使用してどのサービスが起動時に実行されるかを管理しています。
(Ubuntu 14.10以下はupstartを使用します)

Systemdの場合は次のコマンドを使用します。

開始

[code lang=bash]
$ sudo systemctl enable docker
[/code]

停止

[code lang=bash]
$ sudo systemctl disable docker
[/code]

upstartの場合は自動的に起動するように設定されます。停止する場合は次のコマンドを使用してください。

[code lang=bash]
$ echo manual | sudo tee /etc/init/docker.override
[/code]

chkconfigを使用しているシステムは

[code lang=bash]
$ sudo chkconfig docker on
[/code]

を使用してください。

トラブルシューティング

Kernel互換性

Kernelバージョンが3.10以下の場合はDockerは正しく動作しません。Kernelの互換性を確認するには、以下のコマンドでcheck-compatibility.shをダウンロードして実行してください。(スクリプトはLinux専用でmacOSでは動作しません。)

[code lang=bash]
$ curl https://raw.githubusercontent.com/docker/docker/master/contrib/check-config.sh > check-config.sh

$ bash ./check-config.sh
[/code]

Docker deamonに接続できない

次のようなメッセージが出てDockerに接続できないことがあります。

[code lang=bash]
Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?
[/code]

環境変数DOCKER_HOSTに別のクライアントIDが登録されているとそちらに接続を試みます。

[code lang=bash]
$ env | grep DOCKER_HOST
[/code]

に設定されている場合は、

[code lang=bash]
$ unset DOCKER_HOST
[/code]

で解除してください。~/.bashrc~/.profileで自動的にDOCKER_HOSTを設定していないかも念の為確認しておきましょう。

IPフォーワードの問題

systemdの一部のsystemd-networkのバージョン219以上を使用して、手動でネットワークの設定を変更している場合、Dockerコンテナはネットワークにアクセスできません。バージョン220以上のsystemdではネットワークのフォーワードの設定(net.ipv4.conf..forwarding)が標準でオフになっていて、IPフォーワードができません。また、Dockerの
behaviorでコンテナに指定するnet.ipv4.conf.all.forwardingの設定とも競合します。

RHEL、CentOS、Fedoraでの回避策はDokcerホストマシンの/usr/lib/systemd/network/にある.network(例えば/usr/lib/systemd/network/80-container-host0.network)を開き、[Network]セクションを次のように修正してください。

[code lang=bash]
[Network]

IPForward=kernel
# OR
IPForward=true

[/code]

注:私が検証したRHEL 7.3(3.10.0-514.2.2.el7.x86_64)では、/usr/lib/systemd/networkのディレクトリはありませんでした。問題なく動いている環境なので無いということかもしれないですが。。

resolv.confのDNSリゾルバをコンテナが使ってくれない問題

(訳がおかしい可能性あり。すみません。)
GUIを動かしているLinuxでは時々127.0.0.1127.0.1.1でDNSをキャッシュするdnsmasqが動作していて、/etc/resolv.confにそのアドレスが書き込まれています。dnsmasqはDNS Lookupを高速化し、DHCPも提供します。このような設定は、独自のネットワーク名前空間を持つDockerコンテナとは動作しません。
Dockerが/etc/resolv.conf完全に機能するDNSサーバーの参照を見つけられなかった場合、Dockerは次の警告を表示し、Googleが提供するパブリックなDNSサーバー8.8.8.88.8.4.4を使用します。

[code lang=bash]
WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers
can't use it. Using default external servers : [8.8.8.8 8.8.4.4]
[/code]

このエラーが表示された場合は、まずは次のコマンドを実行しdnsmasqを確認します。

[code lang=bash]
$ ps aux |grep dnsmasq
[/code]

コンテナが内部IPを名前解決する必要がある場合、パブリックDNSサーバーは意味がないので次の2つの方法のうち、どちらかを選んでください。

  • Dockerが使用するDNSサーバーを指定する。
  • Network Managerからdnsmasqを使用停止にする。それを受け、Network Managerは/etc/resolv.confにDNSサーバーを書き込みますが、dnsmasqに利便性は失われます。

Docker用にDNS Serverを指定する

Dockerの標準ファイルは/etc/docker/daemon.jsonにあり、その場所はdeamon起動時に--config-fileオプションで指定できます。このドキュメント内では、/etc/docker/daemon.jsonにあるものとして話を進めます。

/etc/docker/daemon.jsonにあるDocker deamon設定ファイルを作成、または編集します。

[code lang=bash]
$ sudo nano /etc/docker/daemon.json
[/code]

dnsのkeyで1つまたは複数のIPアドレスをvalueとして追加します。ファイルに設定項目があれば、dnsの行を追加するだけで大丈夫です。

[code lang=bash]
{
"dns": ["8.8.8.8", "8.8.4.4"]
}
[/code]

内部のDNSサーバーが外部IPを解決できない場合は、パブリックのDNSサーバーを最低1つvaluesに追加しましょう。コンテナがインターネットのドメインを解決できるようになります。

保存してファイルを閉じます。

Docker deamonを再起動します。

[code lang=bash]
$ sudo service docker restart
[/code]

Dockerが問題なく外部IPに接続出来ているか、以下のコマンドで試してみましょう。

[code lang=bash]
$ docker pull hello-world
[/code]

必要に応じてDockerコンテナからInternalのホスト名にpingできるかも試してみましょう。

[code lang=bash]
$ docker run –rm -it alpine ping -c4 <my_internal_host>

PING google.com (192.168.1.2): 56 data bytes
64 bytes from 192.168.1.2: seq=0 ttl=41 time=7.597 ms
64 bytes from 192.168.1.2: seq=1 ttl=41 time=7.635 ms
64 bytes from 192.168.1.2: seq=2 ttl=41 time=7.660 ms
64 bytes from 192.168.1.2: seq=3 ttl=41 time=7.677 ms
[/code]

dnsmasqをdisableにする方法

Ubuntu

Docker daemonの設定ファイルで特定のIPアドレスを指定したくない場合は、次を行います。

  1. /etc/NetworkManager/NetworkManager.confを開き、
  2. dns=dnsmasqの行をコメントアウト(# dns=dnsmasq)し、
  3. 保存して閉じます。
  4. NetworkManagerとDockerを再起動します。

[code lang=bash]
$ sudo restart network-manager
$ sudo restart docker
[/code]

RHEL、CentOS、Fedora

以下のコマンドでdnsmasqをdisableにします。

[code lang=bash]
$ sudo service dnsmasq stop

$ sudo systemctl disable dnsmasq
[/code]

DNS Serverを手動で設定する方法はRed Hatのドキュメントを参照してください。

リモートAPIのアクセスをファイアウォールに許可する

ファイアウォールが実行中で、別のホストからのリモートAPIを許可する場合、Dockerポートへの外部からのアクセスを許可してください。標準だと2376番ポートで、TLS encrypted transportを使用している場合は2375番ポートです。

(すみません。元のドキュメントには UFW の設定方法があるのですが、省略します…)

Your kernel does not support swap limit capabilitiesの対応

Docker Imageを操作している時に次のようなメッセージが表示されることがあります。

[code lang=bash]
WARNING: Your kernel does not support swap limit capabilities. Limitation discarded.
[/code]

メモリ監視などをする時やコンテナに与えるメモリを制限する時に使用するようですが、調べられていません。制限を使用しない場合はそのままにしても良いですしが、メモリとスワップの監視は、メモリの約1%のオーバーヘッドと全体的なパフォーマンスが10%ほど低下するそうです。

sudo権限のユーザーでログインし、
/etc/default/grubを編集のために開き、
GRUB_CMDLINE_LINUX行に次のkey-valueペアを追加します。

[code lang=bash]
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
[/code]

保存してファイルを閉じたらGRUBをアップデートします。

[code lang=bash]
$ sudo update-grub
[/code]

GRUBの設定ファイルにシンタックスのエラーがあればこの時点で分かりますので、問題がなくなるまで修正してください。

システムを再起動してメモリとスワップの監視を有効にします。

まとめ

とりあえず動くようにするだけであれば割と簡単にできます。エラーが出た場合は、

などを見ると良いかと思います。

以上です。

タイトルとURLをコピーしました