こんにちは。エクセルソフトの田淵です。
前回は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.1
や127.0.1.1
でDNSをキャッシュするdnsmasq
が動作していて、/etc/resolv.conf
にそのアドレスが書き込まれています。dnsmasq
はDNS Lookupを高速化し、DHCPも提供します。このような設定は、独自のネットワーク名前空間を持つDockerコンテナとは動作しません。
Dockerが/etc/resolv.conf
完全に機能するDNSサーバーの参照を見つけられなかった場合、Dockerは次の警告を表示し、Googleが提供するパブリックなDNSサーバー8.8.8.8
と8.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アドレスを指定したくない場合は、次を行います。
/etc/NetworkManager/NetworkManager.conf
を開き、dns=dnsmasq
の行をコメントアウト(# dns=dnsmasq
)し、- 保存して閉じます。
- 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の設定ファイルにシンタックスのエラーがあればこの時点で分かりますので、問題がなくなるまで修正してください。
システムを再起動してメモリとスワップの監視を有効にします。
まとめ
とりあえず動くようにするだけであれば割と簡単にできます。エラーが出た場合は、
などを見ると良いかと思います。
以上です。