企業ネットワークでDockerイメージを構築する際に問題が発生しています。 Dockerを使い始めたばかりなので、hello-worldタイプのアプリ用に次のDockerfileがあります。
# DOCKER-VERSION 0.3.4
FROM centos:6.4
# Enable EPEL for Node.js
RUN rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
# Install Node.js and npm
RUN yum install -y npm
# Bundle app source
ADD . /src
# Install app dependencies
RUN cd /src; npm install
EXPOSE 8080
CMD ["node", "/src/index.js"]
これは、自宅のラップトップ、自分のワイヤレスネットワークで構築した場合に正常に機能します。必要な依存関係をプルダウンし、イメージを正しくビルドします。
ただし、職場の企業ネットワーク上で、download.fedoraproject.orgからRPMをプルダウンしようとすると、この同じdockerビルドが失敗し、次のエラーメッセージが表示されます。
ステップ2:rpm -Uvhを実行 http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm ---> e0c26afe9ed5で実行curl:(5)プロキシ 'some.proxy.address'エラーを解決できませんでした: http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8をスキップします。 noarch.rpm -転送に失敗しました
企業ネットワークでは、ラップトップからそのURLに問題なくアクセスできます。しかし、Dockerがコンテナーを構築しようとすると、突然解決できなくなります。この動作は、さまざまな外部リソース(apt-getなど)でも同じです。企業ネットワーク上のラップトップではすべて問題なく解決できますが、Dockerでは解決できません。
ここで何が起こっているかを把握するためのネットワークのノウハウがありません。 Dockerコンテナを構築するときにこの奇妙な動作が発生する理由を誰もが知っていますか?
私は問題を理解することができました。 Ubuntuでは、DockerはコンテナのDNSサーバーを8.8.8.xのGoogleのサーバーに設定します。私が理解しているように、これはUbuntuが/etc/resolv.confを127.0.0.1に設定するため、Ubuntuでの回避策です。
これらのGoogleサーバーはファイアウォールの背後からアクセスできなかったため、URLを解決できませんでした。
修正は、使用するDNSサーバーをDockerに指示することです。この修正は、Dockerのインストール方法によって異なります。
Ubuntuパッケージがインストールされている場合は、/ etc/default/dockerを編集して次の行を追加します。
DOCKER_OPTS="--dns <your_dns_server_1> --dns <your_dns_server_2>"
この構成には、必要な数だけDNSサーバーを追加できます。このファイルを編集したら、Dockerサービスを再起動します。
Sudo service docker restart
バイナリー方式(つまりパッケージなし)でDockerをインストールした場合、Dockerデーモンを開始するときにDNSサーバーを設定します。
Sudo docker -d -D --dns <your_dns_server_1> --dns <your_dns_server_2> &
DockerデーモンのDNS設定を変更することをお勧めします。 / etc/docker/daemon.jsonでデーモン構成ファイルを作成することにより、Dockerデーモンのデフォルトオプションを設定できます。ホストマシンに応じてDNSサーバーを設定します。私のDNSサーバーは10.0.0.2です。
{"dns": ["10.0.0.2", "8.8.8.8"] }
次に、Dockerサービスを再起動するだけです。
Sudo service docker restart
ステップバイステップの説明はここにあります DockerのネットワークDNS構成を修正
次の手順は私のために動作します(docker buildコマンドとdocker runコマンドの両方)。私のLinuxバージョンはUbuntu 14.04です。
nm-tool | grep DNS
この結果DNS:192.168.1.1私の場合
DOCKER_OPTS = "-dns 8.8.8.8 --dns 8.8.4.4 --dns 192.168.1.1"
sudoサービスdocker.ioの再起動
SystemD(Ubuntu 16、RHEL 7 ...)で動作するLinuxディストリビューションの場合、次のコマンドでパスが表示されます。
$ systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2016-06-29 08:10:33 PDT; 2min 34s ago
Docs: https://docs.docker.com
Main PID: 1169 (dockerd)
Tasks: 19
Memory: 85.0M
CPU: 1.779s
CGroup: /system.slice/docker.service
├─1169 /usr/bin/dockerd --dns 172.18.20.11 --dns 172.20.100.15 --dns 8.8.8.8 --dns 8.8.4.4 -H fd://
└─1232 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --shim docker-containerd-shim --met
パスは/lib/systemd/system/docker.service
になります。デーモンが開始される行にDOCKER_OPTS
のいずれかを持つことができる--dns
値を追加します。
cat /lib/systemd/system/docker.service | grep dns
ExecStart=/usr/bin/dockerd --dns 172.18.20.11 --dns 172.20.100.15 --dns 8.8.8.8 --dns 8.8.4.4 -H fd://
DNSをDockerデーモンに指定します。
まず、DNSアドレスを取得します
$ nmcli dev show | grep 'IP4.DNS'
IP4.DNS[1]: 10.0.0.2
この新しいDNSを強制するdockerコンテナーを起動して、問題が本当にDNSにあるかどうかをテストします
$ docker run --dns 10.0.0.2 <image_name> <command_name>
これで問題が解決した場合は、次の方法ですべてのdockerデーモンにこの修正を適用できます
ファイルを編集または作成します/ etc/docker/daemon.json
このファイルに次の行を追加します
{
"dns": ["10.0.0.2", "8.8.8.8"]
}
ドッカーを再起動
$ Sudo service docker restart
このすべてのプロセスを実行するための非常に良いガイドがここにあります。
https://development.robinwinslow.uk/2016/06/23/fix-docker-networking-dns/
Dockerサービスを再起動しないソリューション
ビルド時にdocker build
をオーバーライドすることにより、他のresolv.conf
呼び出しに影響を与えずに(そしてDockerサービスを再起動せずに)単一のDockerイメージのDNS設定を変更できます。
FROM ubuntu:18.04
RUN echo "nameserver 123.123.123.123" > /etc/resolv.conf && apt update
IP 123.123.123.123
を企業ネットワーク内で使用されているものに置き換えます(nmcli dev show | grep 'IP4.DNS'
を使用して、現在使用されているDNSサーバーを取得します)。
欠点: