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"]
}
私がそのような問題を最後に抱えたとき、私はこのようにそれを解決しました:
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のバージョンによっては機能しない場合がありますが、心配する必要はありません。そのコマンドは省略できます。
小切手 /etc/default/docker
次の行がないことを確認します。
DOCKER_OPTS="--iptables=false"
また、/etc/docker/daemon.json
次のキーがないことを確認します。
{
"iptables":false
}
これを1つのサーバーに追加して、UFWをdockerで動作させました。その後、外部ファイアウォールに変更しました。展開ガイドから削除されたため、外部ネットワークが機能しなかった理由を探していました。これが誰かの助けになることを願っています。
引っ張っている画像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 run
がdocker-compose up
によって作成された場合とは異なる動作を持つコンテナをどのように提供できるかです。
ただし、インターネットアクセスの確認方法をさらに明確にすると役立つでしょう。
Dockerコンテナには、デフォルトでインターネットにアクセスする機能があります。先週問題を解決した方法は次のとおりです: dockerコンテナはnet Hostでのみインターネットにアクセスできます
または、コンテナをホストモードにするだけです:
version: '2'
service:
nginx:
image: nginx
network_mode: Host
しかし、@ peedeeがコメントで指摘したように、このソリューションはホストとコンテナ間のネットワーク分離を失います。