web-dev-qa-db-ja.com

docker-composeサービス内にインターネットはありません

Docker-composeコンテナから外部ネットワークにアクセスできません。

次のdocker-composeファイルを検討してください。

version: '2'
services:
    nginx:
      image: nginx

シンプルなdocker run -it nginx bashを使用して、外部IPまたはインターネットIP(ping www.google.com)にアクセスできます。

一方、docker-composeを使用してコンテナに接続すると、外部IPアドレス/ DNSに到達できません。

ドッカー情報:

Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 1
Server Version: 1.12.1
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 7
 Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge null Host overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Security Options: apparmor seccomp
Kernel Version: 4.4.0-38-generic
Operating System: Ubuntu 16.04.1 LTS
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 3.859 GiB
Name: ***
ID: ****
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
WARNING: No swap limit support
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
Insecure Registries:
 127.0.0.0/8

docker-compose 1.8.1、ビルド878cff1

daemon.jsonファイル:

{
  "iptables" : false,
  "dns" : ["8.8.8.8","8.8.4.4"]
}
27
orshachar

私がそのような問題を最後に抱えたとき、私はこのようにそれを解決しました:

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

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

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

これが起こる理由については、良い答えがありません。しかし、最近問題をjournaldにまでさかのぼりました。 journaldを再起動すると(たとえば、構成を変更したため)、docker-composeコンテナー内のDNS解決が一貫して/再現可能に壊れます。正確な理由はわかりませんが、これがRHELで再現するための信頼できる方法であるとしか言えません。

[〜#〜] edit [〜#〜]docker -dコマンドは、使用しているdockerのバージョンによっては機能しない場合がありますが、心配する必要はありません。そのコマンドは省略できます。

5
peedee

小切手 /etc/default/docker次の行がないことを確認します。

DOCKER_OPTS="--iptables=false"

また、/etc/docker/daemon.json次のキーがないことを確認します。

{
"iptables":false
}

これを1つのサーバーに追加して、UFWをdockerで動作させました。その後、外部ファイアウォールに変更しました。展開ガイドから削除されたため、外部ネットワークが機能しなかった理由を探していました。これが誰かの助けになることを願っています。

3
cornernote

引っ張っている画像nginxには、デフォルトでpingがインストールされていません。したがって、実際にpingを使用して接続をテストしている場合は、最初にインストールする必要があります。

カスタムDockerfileを作成してインストールしました:

FROM nginx:latest
RUN apt update && apt -y install iputils-ping

次に、ローカルに構築し、mynginxとしてタグ付けしました。

次に、docker-compose.ymlを変更して、カスタムイメージmynginxを使用しました。

version: '2'
services:
  nginx:
    image: mynginx

最後に、docker-compose upを起動し、それにdocker execを実行し、pingをテストしました。すべてうまくいきました。私もdocker run -ti ...をしましたが、うまくいきました。

あなたの質問で私にバグがあるのは、docker rundocker-compose upによって作成された場合とは異なる動作を持つコンテナをどのように提供できるかです。

ただし、インターネットアクセスの確認方法をさらに明確にすると役立つでしょう。

0
Bruno Borges

Dockerコンテナには、デフォルトでインターネットにアクセスする機能があります。先週問題を解決した方法は次のとおりです: dockerコンテナはnet Hostでのみインターネットにアクセスできます

または、コンテナをホストモードにするだけです:

version: '2'
service:
  nginx:
    image: nginx
    network_mode: Host

しかし、@ peedeeがコメントで指摘したように、このソリューションはホストとコンテナ間のネットワーク分離を失います。

0
Gao Shenghan