企業ネットワークでのイメージ構築中にネットワーク呼び出しが失敗する


81

企業ネットワークで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:RUN rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm ---> e0c26afe9ed5 curlで実行:(5)できませんでしたtプロキシ 'some.proxy.address'エラーを解決します:http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpmをスキップします-転送に失敗しました

私の企業ネットワークでは、ラップトップからそのURLに問題なくアクセスできます。しかし、Dockerがコンテナーを構築しようとすると、突然、まったく解決できなくなります。この動作は、さまざまな外部リソース(apt-getなど)でも同じです。企業ネットワーク上のラップトップではすべて問題なく解決できますが、Dockerでは解決できません。

ここで何が起こっているのかを理解するためのネットワークのノウハウがありません。Dockerコンテナを構築するときにこの奇妙な動作が発生する理由を誰かが知っていますか?


見とるstackoverflow.com/questions/19210563/...それはまたあなたの問題を解決する可能性がありますが
Thomasleveil

同じ問題が私に起こりました。走るのを忘れていたapt-get update
matthiasbe 2017年

これらは、「DockerがCisco AnyConnectからDNS情報を取得しない」の症状である可能性があります。forums.docker.com/ t /…
Jason

回答:


93

私はその問題を理解することができました。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> &

4
Dockfilesで「dockerbuild」コマンドを使用するのはどうですか...そのような状況では機能しないようです:docker --dns = 209.18.47.61build。2>&1 | tee ./output.txt
Quasaur

2
ええ、これはdockerビルドで動作するはずです。docker buildにはコマンド自体に--dnsフラグがありませんが、このようにデーモンに設定すると、
docker

この解決策をありがとう。私の側では、問題は、DockerがIPv4を使用可能にして有効にする必要があることでした。WTF?学ぶ:IPv4は死んでいる。IPv4のみであるソフトウェアは深刻に壊れています。
ティノ

1
私はすでにこのステップを実行していて、エラーが再び発生し始めました。サービスを再起動すると、再度修正されました。
Andrew Grothe 2015

docker 1.7でこの問題が発生していますが、--dnsオプションを使用するか、構成を配置して実行しようとしました/etc/default/docker
Patryk 2015

65

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


20

次の手順は私にとってはうまくいきます(dockerbuildコマンドとdockerrunコマンドの両方)。私のLinuxバージョンはUbuntu14.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"
  • Dockerサービスを再起動します
 sudo service docker.io restart 

2
CentOSに相当するのは/etc/sysconfig/dockerファイルで、これにDOCKER_OPTS="--dns 8.8.8.8"行を追加して問題を解決することができました。
MarkHu 2016年

OpenSuSEにも/etc/sysconfig/dockerファイルがあります。
DavidLakatos20年

11

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

1
ありがとうございました!編集した後docker.service、私はとドッキングウィンドウのサービスを停止していたsudo service docker stop当時とsystemctl daemon-reload、最後にsudo service docker start
Kaveh Ghahremaniに

1
/etc/systemd/system/docker.service.dシステムバージョンを変更するよりも、変更された構成(systemdがシステム構成をマージ/オーバーライドするのに役立つ)を使用してユニットファイルを追加することをお勧めします。後者はアップグレード時に失われます。
ラマン

6

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

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

Docker Daemon Adv Config


5

DockerデーモンにDNSを指定します。

まず、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"]
}

Dockerを再起動します

$ sudo service docker restart

このすべてのプロセスを実行するための非常に優れたガイドは、ここにあります。

https://development.robinwinslow.uk/2016/06/23/fix-docker-networking-dns/


これは境界リンクのみの回答です。ここにできるだけ多くの情報を含めるように回答を拡張し、参照用にのみリンクを使用する必要があります。
さようならStackExchange 2018

スナップでインストールした場合daemon.json/var/snap/docker/<id>/config/daemon.json
sjt0 0320

3

Dockerサービスを再起動しないソリューション

ビルド時にをdocker buildオーバーライドすることresolv.confで、他の呼び出しに影響を与えることなく(また、Dockerサービスを再起動することなく)、単一のDockerイメージのDNS設定を変更できます。

FROM ubuntu:18.04

RUN echo "nameserver 123.123.123.123" > /etc/resolv.conf && apt update

IP123.123.123.123を企業ネットワーク内で使用されているものに置き換えます(nmcli dev show | grep 'IP4.DNS'現在使用されているDNSサーバーを取得するために使用します)。

欠点:

  • これは、Dockerfileの他の行には影響しません。したがって、DNS解決に依存する場合は、すべての行に修正をプレフィックスとして付ける必要があります

1

私のUbuntu16.04マシンでは、Dockerイメージの構築にGoogleのDNSが機能しないことがあります。

cat /etc/docker/daemon.json
{"dns": [""8.8.8.8"] }

次のコマンドを使用して、サービスプロバイダーのDNSを手動で見つける必要があります

nmcli device show <interfacename> | grep IP4.DNS

125.22.47.102

daemon.json以下に示すようにそれを私のに追加します

cat /etc/docker/daemon.json 

{"dns": ["125.22.47.102","8.8.8.8"] }

 restart docker

sudo service docker restart

(PSnm-toolはUbuntu15.04から非推奨になりました)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.