私のドッカーコンテナにはインターネットがありません


138

私はそれを大丈夫に働いていたが、今やそれは止まった。無駄に次のコマンドを試しました:

docker run -dns 8.8.8.8 base ping google.com

docker run base ping google.com

sysctl -w net.ipv4.ip_forward=1 -ホストとコンテナの両方

私が得るすべてはunknown host google.comです。Dockerバージョン0.7.0

何か案は?

PSもufw無効


9
あなたの質問は私の問題を修正しました:sysctl -w net.ipv4.ip_forward=1
Centos

あなたがドッキングウィンドウのDNSは、ルーティングに問題がある可能性がありますので、この類似したソリューションのチェックstackoverflow.com/questions/35515203/...
アーディティヤクレスナPermana

ここでも同じです。ホストボックスの/etc/resolv.confを修正した後、それがないと機能しませんsysctl -w net.ipv4.ip_forward=1
Reeebuuk

また/etc/resolv.confホストマシンに正しい値があることを確認します
Hanxue

sysctl -w net.ipv4.ip_forward=1私が走らなければならなかった後、私にとってはsudo service docker restart
Asif Ali

回答:


100

最初に確認することcat /etc/resolv.confは、Dockerコンテナーで実行されることです。などの無効なDNSサーバーがある場合nameserver 127.0.x.x、コンテナはドメイン名をIPアドレスに解決できないため、ping google.com失敗します。

次に確認することはcat /etc/resolv.confホストマシン上で実行されます。Dockerは基本的に/etc/resolv.conf、コンテナーが開始されるたびに、ホストのコンテナーにコンテナーをコピーします。そのため、ホスト/etc/resolv.confが間違っている場合は、Dockerコンテナーも間違っています。

ホスト/etc/resolv.confが間違っていることがわかった場合、2つのオプションがあります。

  1. daemon.jsonにDNSサーバーをハードコーディングします。これは簡単ですが、DNSサーバーの変更が予想される場合は理想的ではありません。

  2. ホストのを修正します/etc/resolv.conf。これは少しトリッキーですが、動的に生成され、DNSサーバーをハードコーディングしていません。


1. docker daemon.jsonにDNSサーバーをハードコードする

  • 編集する /etc/docker/daemon.json

    {
        "dns": ["10.1.2.3", "8.8.8.8"]
    }
    
  • これらの変更を有効にするには、Dockerデーモンを再起動します。
    sudo systemctl restart docker

  • コンテナを実行/開始すると、Dockerに/etc/resolv.confからの値が入力されますdaemon.json


2.ホストの /etc/resolv.conf

A. Ubuntu 16.04以前

  • Ubuntu 16.04以前の場合、/etc/resolv.confNetworkManagerによって動的に生成されました。

  • の行をdns=dnsmasq(で#) コメントアウトします。/etc/NetworkManager/NetworkManager.conf

  • NetworkManagerを再起動して再生成し/etc/resolv.confます。
    sudo systemctl restart network-manager

  • ホストで確認します。 cat /etc/resolv.conf

B. Ubuntu 18.04以降

  • Ubuntu 18.04はsystemd-resolved、の生成/etc/resolv.confに使用するように変更されました。現在、デフォルトでローカルDNSキャッシュ127.0.0.53を使用しています。これはコンテナ内では機能しないため、DockerはデフォルトでGoogleの8.8.8.8 DNSサーバーを使用します。これは、ファイアウォールの背後にいる人々のために壊れる可能性があります。

  • /etc/resolv.confUbuntu 18.04では、デフォルトで(127.0.0.53)ls -l /etc/resolv.confを指すシンボリックリンク()/run/systemd/resolve/stub-resolv.confです。

  • シンボリックリンクをを指すように変更するだけで/run/systemd/resolve/resolv.conf、実際のDNSサーバーが一覧表示されます。
    sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

  • ホストで確認します。 cat /etc/resolv.conf

これで/etc/resolv.conf、Dockerがコンテナーにコピーするための有効なホストが必要です。


1
これにより、Docker 17.09を搭載したUbuntu 16.04の問題が解決しました。
ルイス・デ・スーザ

2
これで問題が解決しました(OPと同じ、Ubuntu 14.04 / Docker 18.01.0-ce)。Dockerイメージにpingコマンドがない場合、このリンクはpingなしでインターネット接続をテストするのに役立ちます。ホストにsystemctl(Ubuntu 14.04)がない場合は、ネットワークサービスを再起動する方法を試してくださいまたはコンピュータを再起動します。
ベンジャミン

魅力のように働いた!
Homewrecker

1
これはUbuntu 18.04(オプションB)で動作します。ただし、Dockerは現在の正しい/etc/resolv.confコンテナをコンテナーに転送しなかったため、手動でファイルをコンテナーにコピーする必要がありました。
glaux

1
私のマシン(RedHat 7.4)では、ホストの構成ファイルは正しいですが、コンテナーファイルはまだ172.0.0.11を指しています。それで、今何をすべきか?
Martin Majewski、2018

89

このアドバイスに従うことで修正:

[...]すべてをリセットしてみてください。

pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
docker -d

Dockerにブリッジを再作成させ、すべてのネットワークルールを再初期化します

https://github.com/dotcloud/docker/issues/866#issuecomment-19218300

インターフェイスがどういうわけか「ハング」したようです。

dockerの最新バージョンの更新:

上記の答えはまだあなたのために仕事を終わらせるかもしれませんが、この答えが投稿されてからかなり長い時間がかかり、Dockerはより洗練されているので、iptablesそしてすべてに取り組む前にまずこれらを試してください。

sudo service docker restart または(upstartを使用しないLinuxディストリビューションの場合) sudo systemctl restart docker


31
docker -d失敗します。-dフラグはありません。
ルイス・デ・スーザ

1
問題が解決しない場合は、Mobyのgithubに未解決の問題があり、1年以上オープンしています:github.com/moby/moby/issues/26567
Nepoxx

1
@Pawan:ip link del docker0
drewrockshard 2018

1
または、bridge-utilsをインストールする
cjdcordeiro 2018年

5
docker -d新しいバージョンには存在しません。代わりに:service docker stop、次にdockerd、その後service docker start
Telmo Marques

64

dockerを再起動する目的の方法は、手動で行うのではなく、serviceorまたはinitコマンドを使用することです。

service docker restart

5
upstartを使用しないLinuxディストリビューションを使用している場合、sudo systemctl restart dockerが機能しました
jeffrey

再起動はうまくいきました。それは私が「自動起動」することを可能にしているという事実に関係している場合、私は(知らないsystemctl enable docker
ルーカスPottersky

OPの質問には関係がないようです。
Kevin Buchs、2018年

OPが説明している状況では、Dockerをリセットするとネットワークインターフェイスが再初期化され、インターネットアクセスが再び有効になるので、それはちょっとしたことです。これはなぜ壊れるのかについては触れていませんが、問題の解決策を提供します。
ビットマスク

ただし、実稼働環境では、Dockerを再起動することはできません。この場合の問題を解決するにはどうすればよいですか?
Suyanhanx 2018

22

この質問をOSXの回答で更新する(Docker Machineを使用)

Docker Machineを使用してOSXでDockerを実行している場合、以下がうまくいきました:

docker-machine restart

<...wait for it to restart, which takes up to a minute...>

docker-machine env
eval $(docker-machine env)

次に(少なくとも私の経験では)、コンテナからgoogle.comにpingを送信すると、すべてうまくいきます。


Windowsでも機能し、ネットワークアクセスが再び機能するようになりました。
MikaelLepistö18年

1
それでうまくいきました。上部のメニューバーにdocker-iconがあり、メニューに「再起動」オプションがありました。その後、ネットワーキングは再び
大丈夫でし

8

私は何をしているのかわかりませんが、それは私にとってうまくいきました:

OTHER_BRIDGE=br-xxxxx # this is the other random docker bridge (`ip addr` to find)    
service docker stop

ip link set dev $OTHER_BRIDGE down
ip link set dev docker0 down
ip link delete $OTHER_BRIDGE type bridge
ip link delete docker0 type bridge
service docker start && service docker stop

iptables -t nat -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE
iptables -t nat -A POSTROUTING ! -o docker0 -s 172.18.0.0/16 -j MASQUERADE

service docker start

2
素敵なダクトテープ!
dctremblay

1
あなたは同様の問題を解決するのに役立ちました答え。私はそれに何時間も費やしました!Kubesprayのインストールが不完全な場合、Dockerコンテナは、パブリックホストまたはIPにpingを送信しようとすると、「一時的な障害の解決」というメッセージが表示されてインターネットを失いました。だから私は必須であるこのルールを持っていなかった- iptables -t nat -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE。このルールがあるかどうかを確認するには、iptables -t nat -L POSTROUTING
laimison

6

私は使用していてDOCKER_OPTS="--dns 8.8.8.8"、後で発見しました。私のコンテナーはインターネットに直接アクセスできませんが、会社のイントラネットにはアクセスできました。私DOCKER_OPTSは次のように変更しました:

DOCKER_OPTS="--dns <internal_corporate_dns_address"

internal_corporate_dns_addressDNSのIPアドレスまたはFQDNに置き換えて、Dockerを再起動します

sudo service docker restart

次に、コンテナを生成し、インターネットにアクセスできることを確認しました。


5

これが私のコンテナの1つでランダムに発生したときに困惑しましたが、他のコンテナは問題ありませんでした。コンテナーは少なくとも1つの非内部ネットワークに接続されているため、Compose定義に問題はありません。VM / dockerデーモンの再起動は役に立ちませんでした。コンテナがping外部IP さえもできなかったため、これはDNSの問題でもありませんでした。私にとってそれを解決したのは、Dockerネットワークを再作成することでした。私の場合、docker-compose down && docker-compose up働いた。

作曲

これにより、すべてのコンテナのすべてのネットワークが強制的に再作成されます。

docker-compose down && docker-compose up

群れモード

サービスを削除して再作成すると、サービスのネットワークが再作成されます。

docker service rm some-service

docker service create ...

コンテナのネットワークが外部の場合

そのサービスの外部ネットワークを削除して再作成するだけです。

docker network rm some-external-network

docker network create some-external-network


4

私にとってそれはホストのファイアウォールでした。ホストのファイアウォールでDNSを許可する必要がありました。また、ホストのファイアウォール設定を変更した後、Dockerを再起動する必要がありました。


またはsudo service iptables stopsudo chkconfig iptables off(CentOS / RHELで)およびによってiptablesを無効にすることもできます。
MichaelZ

4

プロキシ設定がないためにインターネットにアクセスできないこともあります。その場合、--network host動作しない場合もあります。プロキシは、環境変数http_proxyを設定して構成できますhttps_proxy

docker run -e "http_proxy=YOUR-PROXY" \
           -e "https_proxy=YOUR-PROXY"\
           -e "no_proxy=localhost,127.0.0.1" ... 

no_proxyも設定することを忘れないでください。そうしないと、すべての要求(localhostへの要求を含む)がプロキシを通過します。

詳細:Archlinux Wikiのプロキシ設定


1
これが私の解決策でした。ただし、注意してください。私は、プロキシ設定を無視するように見えるwgetのbusybox実装を持つalpineを使用していたため、環境変数を設定することの利点がわかりませんでした。
pelson 2017

busyboxについてのヒントをありがとう; まだ知らなかった!
Simon A. Eugster 2017

1
ドキュメントのリンクのように、一部のOSでは大文字が必要なことに注意してください
Flo

3

私にとっては、iptables転送ルールでした。何らかの理由で、Dockerのiptablesルールと組み合わせると、次のルールにより、コンテナーからのすべての送信トラフィックがヒットしましたlocalhost:8080

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-ports 8080

3
それで...解決策は何ですか?:)最初のルールがあり、80から8080のインバウンドトラフィックをリダイレクトする必要があります。アウトバウンドトラフィックに影響を与えないようにするにはどうすればよいですか?
mrooney

3

Ubuntu 18.04で問題が発生しました。ただし、問題はDNSにありました。独自のDNSサーバーがあり、他のDNSサーバーをブロックする企業ネットワークにいた。これは、一部のWebサイト(ポルノ、急流など)をブロックするためのものです。

問題を解決するには

  1. ホストマシンでDNS見つける
  2. @jobinの提案に従って--dns your_dnsを使用します

    docker run --dns your_dns -it --name cowsay --hostname cowsay debian bash


2

Windows(8.1)で、virtualboxインターフェイスを(taskmgrを介して)強制終了し、問題を解決しました。


2

DockerをDNSオプションで起動した可能性があります --dns 172.x.x.x

同じエラーが発生し、オプションを削除しました /etc/default/docker

台詞:

# Use DOCKER_OPTS to modify the daemon startup options.
DOCKER_OPTS="--dns 172.x.x.x"

2

VPNにopenconnect 8.3を使用するUbuntu 19.04の場合、/ etc / resolve.confをsystemdのシンボリックリンクにリンクする必要がありました(wisbuckyによるanswerの反対)。

sudo ln -sf /etc/resolv.conf /run/systemd/resolve/resolv.conf

デバッグする手順

  1. 会社のVPNに接続
  2. /etc/resolv.confまたは/run/systemd/resolve/resolv.confで正しいVPN設定を探します
  3. どちらが正しいDNS設定でも、他のファイルにシンボリックリンクします(ヒント:正しい設定のファイルを割り当ての左側に配置します)。

Dockerバージョン:Dockerバージョン19.03.0-rc2、ビルドf97efcc


2
ありがとうございました。Ubuntu 18.04では、会社のVPNに接続すると、/ etc / resolve.confのみがDHCPによって更新され、/ run / systemd / resolve / resolve / confは一定/静的のままでした。このソリューションが役立ちました。これで、ローカルマシンのコンテナはVPNのサーバーに接続します(これは私にとっては以前は起こりませんでした)
dexter2305

1

OSXを使用している場合は、Dockerのインストール後にマシンを再起動する必要がある場合があります。これは時々問題になりました。


1

もともと私のドッカーコンテナーは外部インターネットにアクセスできました(これはAmazon EC2で実行されているドッカーサービス/コンテナーです)。

私のアプリはAPIなので、コンテナーの作成を追跡し(必要なすべてのパッケージをプルすることに成功しました)、IPテーブルを更新してすべてのトラフィックをポート80からAPI(Dockerで実行中)のポートにルーティングしました聞いています。

その後、後でコンテナを再構築しようとすると失敗しました。多くの苦労の末、前のステップ(IPTableポート転送ルールの設定)がDockerの外部ネットワーク機能を台無しにしてしまったことを発見しました。

解決策:IPTableサービスを停止します。

sudo service iptables stop

Docker Daemonを再起動します。

sudo service docker restart

次に、コンテナを再構築してみてください。お役に立てれば。


ファローアップ

dockerで実行されているAPIが実行されているポートに着信トラフィックを80に転送するために、IPテーブルをいじる必要がないことを完全に見過ごしていました。代わりに、DockerのAPIが実行されているポートにポート80をエイリアスしました。

docker run -d -p 80:<api_port> <image>:<tag> <command to start api>


1

dockerを実行しているvirtualboxコンテナー内で誰かがこの問題に遭遇した場合に備えて、ここにこれを追加するだけです。virtualboxネットワークをnatではなくbridgedに再構成し、問題は解消しました。


1

私にとって、私の問題はiptables-servicesがインストールされていないためでした、これは私のために働きました(CentOS):

sudo yum install iptables-services
sudo service docker restart

iptableサービスも開始して有効にしてください
Jay

1

centos 8で私の問題は、Dockerサービスを開始する前にiptablesをインストールおよび開始しなかったことです。dockerサービスを開始する前に、iptablesサービスが稼働中であることを確認してください。


0

UbuntuでDocker-Composeを使用してプロジェクトを設定しようとしたときにも、このような問題が発生しました。

Dockerはインターネットにまったくアクセスできませんでした。IPアドレスをpingしたり、URLをnslookupしたりすると、常に失敗しました。

上記のDNS解決を使用して可能な解決策をすべて試しましたが、役に立ちませんでした。

私は一日中、一体何が起こっているのかを調べるために費やし、最終的にすべての問題の原因がウイルス対策であることがわかりました。

私がそれを無効にしたとき-すべてがうまくいきました。

したがって、アンチウイルスがインストールされていて、問題の修正に役立つものがない場合、問題はアンチウイルスのファイアウォールである可能性があります。


0

過去数日間、私は同様の問題を抱えていました。私にとっての原因は、systemd、docker、および私のホスティングプロバイダーの組み合わせでした。最新のCentOS(7.7.1908)を実行しています。

私のホスティングプロバイダーは、systemd-networkdの構成ファイルを自動的に生成します。CentOS 7の現在のバージョンであるsystemd 219以降、systemd-networkdはネットワーク関連のsysctlパラメータを制御しました。Dockerはこのバージョンと互換性がないようで、コンテナが起動されるたびにIP転送フラグをリセットします。

私の解決策は、プロバイダーが生成した構成ファイルの-セクションに追加IPForward=trueすること[Network]でした。このファイルは複数の場所にある可能性があり/etc/systemd/networkます。おそらくにあります。

プロセスは公式のDockerドキュメントにも記載されていますhttps : //docs.docker.com/v17.09/engine/installation/linux/linux-postinstall/#ip-forwarding-problems


このパラメータを設定した正確な場所を指定していただけませんか?私はあなたとまったく同じ場所にいて、Google Cloud PlatformでVMを実行していて、サーバー上で* .networkファイルを見つけることができませんでした。オンのみです/usr/lib/sysctl.d/50-default.confが、構文が異なります。
el.severo

私のクラスターは自己管理型で、プロバイダーはセットアップ時に基本的なブートストラップのみを行います。ネットワーク構成は/etc/systemd/network/10-mainif.network私のためでした。あなたがチェックするかもしれない他の場所は/usr/local/lib/systemd//usr/lib/systemd/systemdマンページによるものです。
BlackCetha

0

私にとって、centos 7.4を使用した場合、それは/etc/resolve.conf、iptables、iptables natルールの問題でも、docker自体でもありませんでした。問題は、Dockerがコマンドbrctlを使用してブリッジを構築するために必要なパッケージbridge-utilsがホストにないことです。yum install -y bridge-utilsとdockerを再起動して、問題を解決します。

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