web-dev-qa-db-ja.com

企業ネットワークでのイメージビルド中にネットワークコールが失敗する

企業ネットワークで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コンテナを構築するときにこの奇妙な動作が発生する理由を誰もが知っていますか?

69
dsw88

私は問題を理解することができました。 Ubuntuでは、DockerはコンテナのDNSサーバーを8.8.8.xのGoogleのサーバーに設定します。私が理解しているように、これはUbuntuが/etc/resolv.confを127.0.0.1に設定するため、Ubuntuでの回避策です。

これらのGoogleサーバーはファイアウォールの背後からアクセスできなかったため、URLを解決できませんでした。

修正は、使用するDNSサーバーをDockerに指示することです。この修正は、Dockerのインストール方法によって異なります。

Ubuntuパッケージ

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> &
85
dsw88

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構成を修正

54
l.augustyniak

次の手順は私のために動作します(docker buildコマンドとdocker runコマンドの両方)。私のLinuxバージョンはUbuntu 14.04です。

  • 次のコマンドを使用してDNSを識別します。
    nm-tool | grep DNS

この結果DNS:192.168.1.1私の場合

  • /etc/default/docker.ioにエントリを作成します。私の現在のエントリは次のようになります
DOCKER_OPTS = "-dns 8.8.8.8 --dns 8.8.4.4 --dns 192.168.1.1"
  • ドッカーサービスを再起動する
 sudoサービスdocker.ioの再起動 
18
Balkrishna

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://
10

MacおよびWindowsのDocker(少なくとも> = 1.13、おそらくそれ以前)では、[設定]-> [デーモン]-> [詳細設定]でDNSを構成できます。

次の構成では、2つの企業DNSサーバーを設定し(ここで独自の値を使用)、GoogleパブリックDNSサーバーにフォールバックします。

Docker Daemon Adv Config

6
Jason

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/

4
alsora

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サーバーを取得します)。

欠点:

  • これは、Dockerfileの他の行には影響しません。したがって、DNS解決に依存する場合は、修正をすべての行の前に付ける必要があります
2
Murmel