programing

도커 컨테이너에 인터넷이 없습니다.

css3 2023. 8. 18. 22:51

도커 컨테이너에 인터넷이 없습니다.

정상적으로 작동했는데 이제 멈췄어요.다음 명령을 시도했지만 소용이 없었습니다.

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 0 버전 0.7.0

아이디어 있어요?

추신.ufw 사용할 수 없습니다.

가장 먼저 확인해야 할 사항은 실행입니다.cat /etc/resolv.conf도커 컨테이너에 있습니다.다음과 같은 잘못된 DNS 서버가 있는 경우nameserver 127.0.x.x주소로 할 수 , "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""ping google.com실패합니다.

해야 할 은 run 두번확사실행다니입니다.cat /etc/resolv.conf호스트 시스템에 있습니다.도커는 기본적으로 호스트의 데이터를 복사합니다./etc/resolv.conf컨테이너가 시작될 때마다 컨테이너로 이동합니다.▁the가./etc/resolv.conf도커 컨테이너도 마찬가지입니다.

호스트의 상태를 확인한 경우/etc/resolv.conf틀리면 두 가지 옵션이 있습니다.

  1. daemon.json의 DNS 서버를 하드 코드합니다.이것은 쉽지만 DNS 서버가 변경될 것으로 예상되는 경우에는 이상적이지 않습니다.

  2. 호스트의 설정을 수정합니다./etc/resolv.conf이것은 좀 더 까다롭지만 동적으로 생성되므로 DNS 서버를 하드 코딩하지 않습니다.


도커 데몬.json의 하드 코드 DNS 서버

  • /etc/docker/daemon.json

    {
        "dns": ["10.1.2.3", "8.8.8.8"]
    }
    
  • 변경 내용을 적용하려면 도커 데몬을 다시 시작합니다.
    sudo systemctl restart docker

  • 를 실행때가 "" "/" "" "" "" "" "" "" ""를 채웁니다./etc/resolv.confdaemon.json.


호스트의 설정을 수정합니다./etc/resolv.conf

A. Ubuntu 16.04 이전 버전

  • 16의 Ubuntu 16.04 파일/etc/resolv.conf네트워크 관리자에 의해 동적으로 생성되었습니다.

  • 달기 라인.dns=dnsmasq((으)로 #)에서./etc/NetworkManager/NetworkManager.conf

  • 하여 다시 생성합니다./etc/resolv.conf:
    sudo systemctl restart network-manager

  • 합니다.cat /etc/resolv.conf

B. Ubuntu 18.04 이상

  • Ubuntu 18.04는 을 생성하는 데 사용하도록 변경되었습니다.이제 기본적으로 로컬 DNS 캐시 127.0.0.53을 사용합니다.컨테이너 내부에서는 작동하지 않으므로 Docker는 기본적으로 Google의 8.8.8.8 DNS 서버로 설정되며, 이 서버는 방화벽 뒤에 있는 사용자에게 손상될 수 있습니다.

  • /etc/resolv.conf 심볼릭 링크)입니다.ls -l /etc/resolv.conf)을 가리키는 말입니다./run/systemd/resolve/stub-resolv.conf 18127.0.0.53)의입니다.

  • 다음을 가리키는 기호 링크만 변경합니다./run/systemd/resolve/resolv.conf에는 실제 DNS 서버가 나열됩니다.
    sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

  • 합니다.cat /etc/resolv.conf

여러분은 한 이제유있합니다야가 ./etc/resolv.conf도커가 컨테이너에 복사할 수 있도록 호스트에서.

이 조언에 따라 수정:

[...] 모든 것을 재설정할 수 있습니까?

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

도커가 브리지를 다시 만들고 모든 네트워크 규칙을 다시 설치하도록 강제합니다.

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

인터페이스가 어떻게든 '정지'된 것 같습니다.

도커의 최신 버전에 대한 업데이트:

할 수 , 이 지꽤, 는 더 이 나므로 ▁the▁going▁these▁into▁▁youer▁try▁sure▁might▁it▁is▁was▁done▁with합▁above시▁dock▁now▁make▁so먼다야위▁but▁still▁answer해이▁get니▁and▁job▁answer▁the▁more▁polished도을들▁for의저것전▁posted에iptables그 외의 모든 것

sudo service docker restart) 또는 (upstart 사않는지 Linux 하있경우)sudo systemctl restart docker

를 다시 시작하는 것이 도를다시의방도수하것아를 입니다.service또는systemctl명령:

service docker restart

또는

systemctl restart docker

모든 답을 시도해봤지만 아무 것도 효과가 없었습니다.

제가 찾을 수 있는 다른 모든 것을 시도한 후에, 이것은 성공했습니다:

reboot

OSX에 대한 답변으로 이 질문 업데이트(Docker Machine 사용)

만약 당신이 도커 머신을 사용하여 OSX에서 도커를 실행하고 있다면, 나는 다음과 같은 것을 할 수 있었습니다.

docker-machine restart

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

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

그러면 (적어도 제 경험으로는) 컨테이너에서 google.com 을 ping하면 모든 것이 잘 될 것입니다.

저는 제가 무엇을 하고 있는지 모르지만 그것은 저에게 효과가 있었습니다.

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

사용하고 있었습니다.DOCKER_OPTS="--dns 8.8.8.8"그리고 나중에 내 컨테이너가 인터넷에 직접 액세스하지 않고 회사 인트라넷에 액세스할 수 있다는 것을 알게 되었습니다.나는 변했어요DOCKER_OPTS다음 위치로 이동합니다.

DOCKER_OPTS="--dns <internal_corporate_dns_address"

를 대체하기internal_corporate_dns_addressDNS의 IP 주소 또는 FQDN을 사용하고 도커를 다시 시작했습니다.

sudo service docker restart

그리고 나서 제 컨테이너를 생성하고 인터넷에 접속할 수 있는지 확인했습니다.

프록시 설정이 누락되어 인터넷에 액세스할 수 없습니다.그런 경우에는,--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의 프록시 설정.

저는 제 컨테이너 중 하나에 대해 무작위로 이런 일이 발생했을 때 당황스러웠고, 다른 컨테이너는 문제가 없었습니다.컨테이너가 하나 이상의 비내부 네트워크에 연결되어 있으므로, 컨테이너에 문제가 없습니다.Compose 시작해도도움이 되지 .VM/도커 데몬을 다시 시작해도 도움이 되지 않습니다.가 DNS조차 할 수 .ping외부 IP 한 것은 이었습니다.이 문제를 해결한 것은 도커 네트워크를 다시 만드는 것이었습니다.저 같은 경우에는.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

다른 답변들은 다음과 같이 언급했습니다.docker0인터페이스(브리지)가 문제의 원인일 수 있습니다. 20주소가 했습니다(Ubuntu 20.04를 ).ip addr show dev docker0 시작하는 만으로는 도움이 되지 도커를 다시 시작하는 것만으로는 도움이 되지 않았습니다.브리지 인터페이스를 수동으로 삭제해야 했습니다.

sudo ip link delete docker0
sudo systemctl restart docker

저에게 그것은 호스트의 방화벽이었습니다.호스트의 방화벽에서 DNS를 허용해야 했습니다.또한 호스트 방화벽 설정을 변경한 후 도커를 다시 시작해야 했습니다.

iptables-services가 설치되지 않았기 때문에 문제가 발생했습니다(CentOS).

sudo yum install iptables-services
sudo service docker restart

후손들을 위한 간단하고 효과적인 솔루션 공유.으로 할 때--network플래그, 외부 세계에 연결하는 것을 금지하는 기본 브리지 네트워크에 연결합니다.이 문제를 해결하려면 자체 브리지 네트워크(사용자 정의 브리지)를 생성하고 docker run 명령을 사용하여 명시적으로 언급해야 합니다.

docker network create --driver bridge mynetwork
docker run -it --network mynetwork image:version

도움이 됩니다.

sudo ip link delete docker0
sudo systemctl stop docker.socket
sudo systemctl stop docker.service

sudo systemctl start docker.socket
sudo systemctl start docker.service

참고: 이 이후에 인터페이스 도커0은 다음과 같은 ipaddress를 가져야 합니다.

inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0

옵션 했을 수 .--dns 172.x.x.x

동한오발생다여옵제션다거니습했에서 을 했습니다./etc/default/docker

선:

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

centos 8에서 나의 문제는 도커 서비스를 시작하기 전에 iptables를 설치하고 시작하지 않았다는 것입니다.도커 서비스를 시작하기 전에 iptables 서비스가 실행 중인지 확인합니다.

OSX에 있는 경우 Docker를 설치한 후 시스템을 다시 시작해야 할 수 있습니다.이것은 때때로 이슈가 되었습니다.

나에게 그것은 iptables 전달 규칙이었습니다.어떤 이유에서인지 다음 규칙이 도커의 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

Ubuntu 18.04에서 문제가 발생했습니다.하지만 DNS에 문제가 있었습니다.저는 자체 DNS 서버가 있고 다른 DNS 서버를 차단하는 회사 네트워크에 있었습니다.이는 일부 웹 사이트(포른, 토렌트 등)를 차단하기 위한 것입니다.

문제를 해결하기 위해

  1. 호스트 시스템에서 DNS 찾기
  2. @jobin이 제안한 대로 --session your_building을 사용합니다.

    도커 런 --당신의_바닷속에 있는 --그것은 --이름을 cow says --cow says 데비안 bash.

VPN용 openconnect 8.3을 사용하는 Ubuntu 19.04의 경우 systemd의 /etc/resolve.conf를 symplink해야 했습니다(wisbucky의 답변과 반대).

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 설정이 있는 파일은 다른 파일과 연결됩니다(힌트: 올바른 설정이 있는 파일을 할당 왼쪽에 배치).

도커 버전:도커 버전 19.03.0-rc2, 빌드 f97efcc

centos 7.4를 사용한 저의 경우, /etc/iptables.conf, iptables, iptables nat 규칙이나 도커 자체가 아니었습니다.문제는 호스트에 brctl 명령을 사용하여 브리지를 구축하는 데 도커에 필요한 패키지 브리지 유틸리티가 없다는 것입니다.yum install -y bridge-syslogs 및 도커 재시작, 문제 해결.

Windows(8.1)에서 (taskmgr을 통해) 가상 상자 인터페이스를 제거하고 문제를 해결했습니다.

원래 도커 컨테이너는 외부 인터넷에 연결할 수 있었습니다(아마존 EC2에서 실행되는 도커 서비스/컨테이너입니다).

제 앱이 API이기 때문에, 저는 제 컨테이너를 만드는 것(필요한 모든 패키지를 끌어내는 데 성공했습니다)을 따라 포트 80에서 API(도커에서 실행 중인)가 수신 중인 포트로 모든 트래픽을 라우팅하도록 IP 테이블을 업데이트했습니다.

나중에 컨테이너를 다시 만들려다 실패했습니다.고생 끝에 이전 단계(IPTable 포트 포워딩 규칙 설정)가 도커의 외부 네트워킹 기능을 엉망으로 만들었다는 것을 알게 되었습니다.

솔루션:IPTable 서비스를 중지합니다.

sudo service iptables stop

도커 데몬 다시 시작:

sudo service docker restart

그런 다음 용기를 다시 조립해 보십시오.이게 도움이 되길 바랍니다.


따르다

도커에서 실행 중인 API가 실행 중인 포트로 들어오는 트래픽을 80으로 전달하기 위해 IP 테이블을 엉망으로 만들 필요가 없다는 것을 완전히 간과했습니다.대신 포트 80을 도커의 API가 실행 중인 포트에 앨리어싱했습니다.

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

여기서 대부분의 답변을 시도해봤지만, 효과가 있었던 것은 네트워크를 다시 만드는 것뿐이었습니다.

$ docker network rm the-network
$ docker network create --driver=bridge the-network

또한 이를 사용하는 도커 컨테이너를 다시 만들어야 했습니다.

$ sudo docker create --name the-name --network the-network

그리고 나서 인터넷 접속으로 시작했습니다.

제 되었다는 것을 . " Linux"라는 이름입니다.nftables그리고 그것을 비활성화시키는 것이 효과가 있었습니다.했어요.

sudo systemctl disable nftables
sudo systemctl stop nftables
sudo reboot

내 네트워크 카드:

➜  ~ ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp1s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN mode DEFAULT group default qlen 1000
    link/ether 68:f7:28:84:e7:fe brd ff:ff:ff:ff:ff:ff
3: wlp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DORMANT group default qlen 1000
    link/ether d0:7e:35:d2:42:6d brd ff:ff:ff:ff:ff:ff
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default 
    link/ether 02:42:43:3f:ff:94 brd ff:ff:ff:ff:ff:ff
5: br-c51881f83e32: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default 
    link/ether 02:42:ae:34:49:c3 brd ff:ff:ff:ff:ff:ff
6: br-c5b2a1d25a86: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default 
    link/ether 02:42:72:d3:6f:4d brd ff:ff:ff:ff:ff:ff
8: veth56f42a2@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default 
    link/ether 8e:70:36:10:4e:83 brd ff:ff:ff:ff:ff:ff link-netnsid 0

내 인 그고내방구성벽화리,구성▁and,/etc/nftables.conf내가 지금 장애인이고 미래에 내가 가질 수 있도록 개선하려고 노력할 것입니다.docker0네트워크 카드 규칙이 올바르게 설정됨:

#!/usr/bin/nft -f
# vim:set ts=2 sw=2 et:

# IPv4/IPv6 Simple & Safe firewall ruleset.
# More examples in /usr/share/nftables/ and /usr/share/doc/nftables/examples/.

table inet filter
delete table inet filter
table inet filter {
  chain input {
    type filter hook input priority filter
    policy drop

    ct state invalid drop comment "early drop of invalid connections"
    ct state {established, related} accept comment "allow tracked connections"
    iifname lo accept comment "allow from loopback"
    ip protocol icmp accept comment "allow icmp"
    meta l4proto ipv6-icmp accept comment "allow icmp v6"
    #tcp dport ssh accept comment "allow sshd"
    pkttype host limit rate 5/second counter reject with icmpx type admin-prohibited
    counter
  }
  chain forward {
    type filter hook forward priority filter
    policy drop
  }

도커를 실행하는 가상 상자 컨테이너 내에서 누군가가 이 문제에 부딪힐 경우를 대비하여 여기에 이 문제를 추가합니다.가상 박스 네트워크를 nat 대신 bridging으로 재구성했더니 문제가 사라졌습니다.

이미 좋은 답변들이 많이 있습니다.저는 최근에 오렌지색 피씨가 달리는 암비안에서 비슷한 문제에 직면했습니다.도커 컨테이너가 인터넷에 차단되었습니다.이 명령은 제 경우 문제를 해결합니다.그래서 나는 그것을 공유하는 것을 좋아합니다.

docker run --security-opt seccomp=unconfined imageName

내 컴퓨터에서 작동하는 유일한 것(그것은8.8.8.8작동하지 않음)

  1. 로컬 컴퓨터에서 사용되는 DNS를 확인합니다.
$ netstat -ntpl | grep :53
tcp        0      0 10.194.128.1:53         0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      -
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.2.1:53            0.0.0.0:*               LISTEN      -
  1. 합니다.sudo vim /etc/docker/daemon.json 위의 합니다.
{
  "dns": ["192.168.122.1","10.194.128.1"]
}
  1. 도커 다시 시작
sudo ip link delete docker0
sudo systemctl restart docker

Docker를 Docker를 제대로 수 .--skip-iptables도커가 iptables에 대해 불평했을 때 옵션:

[ERROR] Missing system requirements. Run the following commands to
[ERROR] install the requirements and run this tool again.
[ERROR] Alternatively iptables checks can be disabled with --skip-iptables .

########## BEGIN ##########
sudo sh -eux <<EOF
# Load ip_tables module
modprobe ip_tables
EOF
########## END ##########

이것문확보겠다니: isip_tables커널 모듈이 로드되었습니까?

sudo modprobe ip_tables

출력이 없으면 이 대답이 도움이 되지 않을 수 있습니다(어쨌든 시도해 볼 수 있습니다).그렇지 않으면 출력은 다음과 같습니다.

modprobe: FATAL: Module ip_tables not found in directory /lib/modules/5.18.9-200.fc36.x86_64

고칩시다!

Docker를합니다("Docker"를 가 없습니다).systemctl스크립트가 처리합니다.):

dockerd-rootless-setuptool.sh uninstall --skip-iptables

확신해주다iptables패키지가 설치되어 있지만 기본적으로 주요 배포에 의해 발송됩니다.

자, 만들어 보세요.ip_tables은 볼수있모에 됩니다.modprobe설치(덕분에):

sudo depmod
sudo modprobe ip_tables

이제 Docker를 루트리스로 다시 설치합니다.

dockerd-rootless-setuptool.sh install

. iptables는 를 해결해야 합니다.서비스를 사용하도록 설정하는 것을 잊지 마십시오.systemctl enable --user --now docker)!

저는 포드맨을 사용하는 Redhat/centos/Fedora의 사용자와 동일한 문제에 직면했습니다.

firewall-cmd --zone=public --add-masquerade
firewall-cmd --permanent --zone=public --add-masquerade

더 많은 방화벽포드맨(또는 도커) - 컨테이너에 인터넷이 없고 호스트를 확인할 수 없음

언급URL : https://stackoverflow.com/questions/20430371/my-docker-container-has-no-internet