คอนเทนเนอร์นักเทียบท่าของฉันไม่มีอินเทอร์เน็ต


153

ฉันทำงานได้ดี แต่ตอนนี้มันหยุดทำงาน ฉันลองใช้คำสั่งต่อไปนี้โดยไม่มีประโยชน์:

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

ความคิดใด ๆ ?

ปล. ufwพิการเหมือนกัน


9
คำถามของคุณแก้ไขปัญหาของฉัน: ต้องทำงานsysctl -w net.ipv4.ip_forward=1(บน Centos 6)
qwertzguy

เนื่องจากคุณอาจมีปัญหากับการกำหนดเส้นทาง dns ของนักเทียบท่าโปรดตรวจสอบโซลูชันที่คล้ายกันนี้stackoverflow.com/questions/35515203/…
Aditya Kresna 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

คำตอบ:


117

สิ่งแรกที่ต้องตรวจสอบจะดำเนินการcat /etc/resolv.confในภาชนะนักเทียบท่า หากมีเซิร์ฟเวอร์ DNS ที่ไม่ถูกต้องเช่นnameserver 127.0.x.xคอนเทนเนอร์จะไม่สามารถแก้ไขชื่อโดเมนเป็นที่อยู่ IP ได้ดังนั้นping google.comจะล้มเหลว

สิ่งที่สองที่การันcat /etc/resolv.confบนเครื่องโฮสต์ โดยทั่วไปนักเทียบท่าจะคัดลอกโฮสต์/etc/resolv.confไปยังคอนเทนเนอร์ทุกครั้งที่เริ่มการทำงานของคอนเทนเนอร์ ดังนั้นหากโฮสต์/etc/resolv.confไม่ถูกต้องคอนเทนเนอร์นักเทียบท่าก็จะเป็นเช่นนั้น

หากคุณพบว่าโฮสต์/etc/resolv.confไม่ถูกต้องคุณมี 2 ตัวเลือก:

  1. ฮาร์ดโค้ดเซิร์ฟเวอร์ DNS ใน daemon.json นี่เป็นเรื่องง่าย แต่ไม่เหมาะอย่างยิ่งหากคุณคาดว่าเซิร์ฟเวอร์ DNS จะเปลี่ยนแปลง

  2. /etc/resolv.confแก้ไขโฮสต์ของ นี่เป็นเรื่องที่ยุ่งยากกว่าเล็กน้อย แต่ถูกสร้างขึ้นแบบไดนามิกและคุณไม่ได้เข้ารหัสเซิร์ฟเวอร์ DNS


1. เซิร์ฟเวอร์ Hardcode DNS ใน docker daemon.json

  • แก้ไข /etc/docker/daemon.json

    {
        "dns": ["10.1.2.3", "8.8.8.8"]
    }
    
  • รีสตาร์ท Docker daemon เพื่อให้การเปลี่ยนแปลงเหล่านั้นมีผล:
    sudo systemctl restart docker

  • ตอนนี้เมื่อคุณเรียก / เริ่มต้นภาชนะนักเทียบท่าจะเติมด้วยค่าจาก/etc/resolv.confdaemon.json


2. แก้ไขโฮสต์ของ /etc/resolv.conf

A. Ubuntu 16.04 และรุ่นก่อนหน้า

  • สำหรับ Ubuntu 16.04 และรุ่นก่อนหน้านั้น/etc/resolv.confถูกสร้างขึ้นแบบไดนามิกโดย NetworkManager

  • แสดงความคิดเห็นในบรรทัดdns=dnsmasq(มี a #) ใน /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 จะเริ่มต้นเป็นเซิร์ฟเวอร์ DNS 8.8.8.8 ของ Google ซึ่งอาจทำให้ผู้ที่อยู่เบื้องหลังไฟร์วอลล์เสียหาย

  • /etc/resolv.confเป็น symlink ( ls -l /etc/resolv.conf) ซึ่งชี้ไปที่/run/systemd/resolve/stub-resolv.conf(127.0.0.53) ตามค่าเริ่มต้นใน Ubuntu 18.04

  • เพียงแค่เปลี่ยน symlink ให้ชี้ไป/run/systemd/resolve/resolv.confที่ซึ่งแสดงรายการเซิร์ฟเวอร์ DNS จริง:
    sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

  • ตรวจสอบโฮสต์: cat /etc/resolv.conf

ตอนนี้คุณควรมี/etc/resolv.confโฮสต์ที่ถูกต้องสำหรับนักเทียบท่าเพื่อคัดลอกลงในคอนเทนเนอร์


1
สิ่งนี้แก้ไขปัญหาบน Ubuntu 16.04 พร้อม Docker 17.09
Luís de Sousa

2
สิ่งนี้ช่วยแก้ปัญหาของฉันได้ (เช่นเดียวกับ OP, Ubuntu 14.04 / Docker 18.01.0-ce) ลิงค์นี้สามารถใช้ทดสอบการเชื่อมต่ออินเทอร์เน็ตที่มีประโยชน์โดยไม่ต้อง pingหากคุณไม่มีคำสั่ง ping บนอิมเมจนักเทียบท่า หากโฮสต์ของคุณไม่มีsystemctl(Ubuntu 14.04) ลองรีสตาร์ทบริการเครือข่ายอย่างไร และ / หรือรีสตาร์ทคอมพิวเตอร์ของคุณ
Benjamin

ทำงานอย่างมีเสน่ห์!
Homewrecker

1
สิ่งนี้ใช้ได้กับ Ubuntu 18.04 (ตัวเลือก B) อย่างไรก็ตามนักเทียบท่าไม่ได้ถ่ายโอนสิ่งที่ถูกต้อง/etc/resolv.confไปยังคอนเทนเนอร์ที่กำลังก่อสร้างฉันต้องคัดลอกไฟล์ลงในคอนเทนเนอร์ด้วยตนเอง
glaux

1
บนเครื่องของฉัน (RedHat 7.4) ไฟล์กำหนดค่าของโฮสต์ถูกต้อง แต่ไฟล์คอนเทนเนอร์ยังคงชี้ไปที่ 172.0.0.11 แล้วจะทำยังไงดีล่ะ?
Martin Majewski

96

แก้ไขโดยทำตามคำแนะนำนี้:

[... ] คุณลองรีเซ็ตทุกอย่างได้ไหม

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

มันจะบังคับให้นักเทียบท่าสร้างสะพานขึ้นมาใหม่และสร้างกฎเครือข่ายใหม่ทั้งหมด

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

ดูเหมือนว่าอินเทอร์เฟซถูก 'หยุด' อย่างใด

อัปเดตสำหรับนักเทียบท่ารุ่นล่าสุดเพิ่มเติม:

คำตอบข้างต้นอาจยังคงทำให้งานเสร็จสำหรับคุณ แต่ก็ค่อนข้างนานแล้วที่คำตอบนี้ถูกโพสต์และตอนนี้นักเทียบท่าได้รับการขัดเกลามากขึ้นดังนั้นโปรดลองทำสิ่งเหล่านี้ก่อนก่อนที่จะเข้าสู่การโกงiptablesและทั้งหมด

sudo service docker restart หรือ (หากคุณอยู่ใน linux distro ที่ไม่ได้ใช้งานแบบพุ่งพรวด) sudo systemctl restart docker


34
docker -dล้มเหลว ไม่มีการ-dฟันธง
Luís de Sousa

1
สำหรับผู้ที่ยังคงมีปัญหามีปัญหาที่เปิดอยู่บน github ของ Moby ที่เปิดมานานกว่าหนึ่งปีแล้ว: github.com/moby/moby/issues/26567
Nepoxx

1
@Pawan:ip link del docker0
drewrockshard

1
หรือติดตั้ง bridge-utils
cjdcordeiro

9
docker -dไม่มีในเวอร์ชันที่ใหม่กว่า แทน: service docker stopแล้วdockerdแล้วservice docker start
Telmo Marques

66

วิธีที่ตั้งใจไว้ในการรีสตาร์ท Docker ไม่ใช่การทำด้วยตนเอง แต่ใช้serviceคำสั่ง or init:

service docker restart

5
ถ้าคุณอยู่ใน linux distro ที่ไม่ได้ใช้พุ่งพรวด sudo systemctl restart docker ก็ใช้ได้สำหรับฉัน
jeffrey

การรีสตาร์ททำงานได้ดี ฉันไม่รู้ว่ามันเกี่ยวข้องกับการที่ฉันเปิดใช้งานมันเป็น "auto start" ( systemctl enable docker)
Lucas Pottersky

ดูเหมือนจะไม่เกี่ยวข้องกับคำถามของ OP
Kevin Buchs

มันเป็นเพราะในสถานการณ์ที่ OP กำลังอธิบายการรีเซ็ตนักเทียบท่าจะทำให้อินเทอร์เฟซเครือข่ายเปิดใช้งานใหม่อีกครั้ง เป็นความจริงที่ว่าสิ่งนี้ไม่ได้ระบุสาเหตุที่ทำให้บางครั้งเกิดการแตกหัก แต่เป็นการแก้ปัญหา
bitmask

แต่ในสภาพแวดล้อมการผลิตการรีสตาร์ท Docker เป็นไปไม่ได้ วิธีแก้ปัญหาในกรณีนี้?
Suyanhanx

22

การอัปเดตคำถามนี้พร้อมคำตอบสำหรับ OSX (โดยใช้ Docker Machine)

หากคุณใช้งาน Docker บน OSX โดยใช้ Docker Machine สิ่งต่อไปนี้ใช้ได้กับฉัน:

docker-machine restart

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

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

จากนั้น (อย่างน้อยก็ในประสบการณ์ของฉัน) ถ้าคุณ ping google.com จากคอนเทนเนอร์ทั้งหมดก็จะดี


ทำงานใน windows เพื่อให้การเข้าถึงเครือข่ายทำงานอีกครั้ง
Mikael Lepistö

1
ที่ได้ผลสำหรับฉัน ฉันมีไอคอนนักเทียบท่าในแถบเมนูด้านบนในเมนูฉันมีตัวเลือก "รีสตาร์ท" หลังจากนั้นระบบเครือข่ายก็ใช้ได้อีกครั้ง
olidem

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 สูญเสียอินเทอร์เน็ตพร้อมกับข้อความ "การแก้ไขความล้มเหลวชั่วคราว" เมื่อพยายาม ping โฮสต์สาธารณะหรือ IP ใด ๆ ดังนั้นผมจึงไม่ได้มีกฎข้อนี้ซึ่งมีผลบังคับใช้ 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_addressด้วยที่อยู่ IP หรือ FQDN ของ DNS ของเราและเริ่มนักเทียบท่าใหม่โดยใช้

sudo service docker restart

จากนั้นก็สร้างคอนเทนเนอร์ของฉันและตรวจสอบว่ามีการเข้าถึงอินเทอร์เน็ต


5

ฉันนิ่งงันเมื่อสิ่งนี้เกิดขึ้นแบบสุ่มสำหรับฉันสำหรับภาชนะหนึ่งของฉันในขณะที่ภาชนะอื่น ๆ ก็ใช้ได้ คอนเทนเนอร์ถูกเชื่อมต่อกับเครือข่ายที่ไม่ใช่ภายในอย่างน้อยหนึ่งเครือข่ายดังนั้นจึงไม่มีอะไรผิดปกติกับComposeคำจำกัดความ การรีสตาร์ท VM / docker daemon ไม่ได้ช่วย นอกจากนี้ยังไม่ใช่ปัญหา DNS เนื่องจากคอนเทนเนอร์ไม่สามารถแม้แต่pingIP ภายนอก สิ่งที่แก้ไขได้สำหรับฉันคือการสร้างเครือข่ายนักเทียบท่าขึ้นใหม่ ในกรณีของฉันใช้docker-compose down && docker-compose upงานได้

เขียน

สิ่งนี้บังคับให้เกิดการพักผ่อนหย่อนใจของเครือข่ายทั้งหมดของคอนเทนเนอร์ทั้งหมด:

docker-compose down && docker-compose up

โหมด Swarm

ฉันคิดว่าคุณแค่ลบและสร้างบริการใหม่ซึ่งจะสร้างเครือข่ายของบริการขึ้นมาใหม่:

docker service rm some-service

docker service create ...

หากเครือข่ายของคอนเทนเนอร์อยู่ภายนอก

เพียงลบและสร้างเครือข่ายภายนอกของบริการนั้นใหม่:

docker network rm some-external-network

docker network create some-external-network


4

สำหรับฉันมันเป็นไฟร์วอลล์ของโฮสต์ ฉันต้องอนุญาต DNS บนไฟร์วอลล์ของโฮสต์ และต้องรีสตาร์ทนักเทียบท่าหลังจากเปลี่ยนการตั้งค่าไฟร์วอลล์ของโฮสต์


หรือคุณสามารถปิดการใช้งาน iptables โดยsudo service iptables stopและsudo chkconfig iptables off(บน CentOS / RHEL)
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
นี่เป็นทางออกสำหรับฉัน ระวัง: ฉันใช้อัลไพน์ซึ่งมีการใช้งาน busybox ของ wget ที่ดูเหมือนจะเพิกเฉยต่อการตั้งค่าพร็อกซีดังนั้นฉันจึงไม่เห็นประโยชน์ของการตั้งค่าตัวแปรสภาพแวดล้อม
pelson

ขอบคุณสำหรับคำแนะนำเกี่ยวกับ busybox; ยังไม่รู้เรื่องเลย!
Simon A. Eugster

1
ทราบว่าระบบปฏิบัติการบางอย่างจำเป็นต้องกรณีบนเหมือนในเอกสารการเชื่อมโยง
โฟล

4

สำหรับฉันปัญหาของฉันเกิดจากไม่ได้ติดตั้ง iptables-services สิ่งนี้ใช้ได้กับฉัน (CentOS):

sudo yum install iptables-services
sudo service docker restart

จำเริ่มต้นและเปิดใช้งานบริการ iptable ด้วย
Jay

4

ใน centos 8 ปัญหาของฉันคือฉันไม่ได้ติดตั้งและเริ่ม iptables ก่อนที่จะเริ่มบริการนักเทียบท่า ตรวจสอบให้แน่ใจว่าบริการ iptables เปิดใช้งานแล้วก่อนที่คุณจะเริ่มบริการนักเทียบท่า


ฉันมีปัญหาเดียวกันใน centos8
Martin Barth

3

สำหรับฉันมันเป็นกฎการส่งต่อ iptables ด้วยเหตุผลบางประการกฎต่อไปนี้เมื่อใช้ร่วมกับกฎ iptables ของนักเทียบท่าทำให้ทราฟฟิกขาออกทั้งหมดจากคอนเทนเนอร์เข้าสู่ Hit 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

ขออภัยหน่วยความจำ iptables ของฉันจางหายไป แต่ในสคริปต์การตั้งค่าของฉันฉันเห็นiptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080ว่าเป็นบรรทัดสุดท้ายหลังจากค่าเริ่มต้น ( iptables -P INPUT DROPฯลฯ ) ไม่มีเอาท์พุท ... เส้นเปลี่ยนเส้นทาง
brandones

3

ฉันมีปัญหาบน Ubuntu 18.04 อย่างไรก็ตามปัญหาเกิดขึ้นกับ DNS ฉันอยู่ในเครือข่ายขององค์กรที่มีเซิร์ฟเวอร์ DNS ของตัวเองและบล็อกเซิร์ฟเวอร์ DNS อื่น ๆ นี่คือการบล็อกบางเว็บไซต์ (สื่อลามก, เพลง, ... เป็นต้น)

เพื่อแก้ไขปัญหาของคุณ

  1. ค้นหา DNS ของคุณบนเครื่องโฮสต์
  2. ใช้ --dns your_dnsตามที่@jobinแนะนำ

    นักเทียบท่ารัน --dns your_dns -it --name cowsay --hostname cowsay debian bash


2

บน windows (8.1) ฉันฆ่าอินเทอร์เฟซ virtualbox (ผ่าน taskmgr) และแก้ไขปัญหาได้


2

คุณอาจเริ่มนักเทียบท่าด้วยตัวเลือก 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

เดิมทีคอนเทนเนอร์นักเทียบท่าของฉันสามารถเข้าถึงอินเทอร์เน็ตภายนอกได้ (นี่คือบริการนักเทียบท่า / คอนเทนเนอร์ที่ทำงานบน Amazon EC2)

เนื่องจากแอปของฉันเป็น API ฉันจึงติดตามการสร้างคอนเทนเนอร์ของฉัน (มันประสบความสำเร็จในการดึงแพ็คเกจทั้งหมดที่จำเป็น) ด้วยการอัปเดตตาราง IP ของฉันเพื่อกำหนดเส้นทางการรับส่งข้อมูลทั้งหมดจากพอร์ต 80 ไปยังพอร์ตที่ API ของฉัน (ทำงานบนนักเทียบท่า) ฟัง

หลังจากนั้นเมื่อฉันพยายามสร้างคอนเทนเนอร์ใหม่มันล้มเหลว หลังจากต่อสู้กันมามากฉันพบว่าขั้นตอนก่อนหน้าของฉัน (การตั้งค่ากฎการส่งต่อพอร์ต IPTable) ทำให้ความสามารถในการเชื่อมต่อเครือข่ายภายนอกของนักเทียบท่ายุ่ง

วิธีแก้ไข: หยุดบริการ IPTable ของคุณ:

sudo service iptables stop

รีสตาร์ท Docker Daemon:

sudo service docker restart

จากนั้นลองสร้างคอนเทนเนอร์ของคุณใหม่ หวังว่านี่จะช่วยได้


ติดตาม

ฉันมองข้ามไปโดยสิ้นเชิงว่าฉันไม่จำเป็นต้องยุ่งกับตาราง IP เพื่อส่งต่อการรับส่งข้อมูลขาเข้าไปยัง 80 ไปยังพอร์ตที่ API ทำงานบนนักเทียบท่าทำงานอยู่ แต่ฉันเปลี่ยนชื่อพอร์ต 80 เป็นพอร์ตที่ API ในนักเทียบท่าทำงานบน:

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


ในกรณีของฉันฉันต้องรีสตาร์ท
Docker

2

สำหรับ Ubuntu 19.04 โดยใช้ openconnect 8.3 สำหรับ VPN ฉันต้องเชื่อมโยง /etc/resolve.conf กับอันใน systemd (ตรงข้ามกับ answerby wisbucky)

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

ขั้นตอนในการดีบัก

  1. เชื่อมต่อกับ VPN ของ บริษัท
  2. ค้นหาการตั้งค่า VPN ที่ถูกต้องใน /etc/resolv.conf หรือ /run/systemd/resolve/resolv.conf
  3. ใดก็ตามที่มีการตั้งค่า DNS ที่ถูกต้องเราจะเชื่อมโยงสิ่งนั้นกับไฟล์อื่น (คำแนะนำ: วางไว้ที่การตั้งค่าที่ถูกต้องทางด้านซ้ายของการกำหนด)

เวอร์ชัน Docker: Docker เวอร์ชัน 19.03.0-rc2 สร้าง f97efcc


2
ขอบคุณ. ด้วย Ubuntu 18.04 เมื่อเชื่อมต่อกับ VPN ของ บริษัท เฉพาะ /etc/resolve.conf เท่านั้นที่ได้รับการอัปเดตโดย DHCP และ / run / systemd / fix / fix / conf คงที่ / คงที่ วิธีนี้ช่วยได้ ตอนนี้คอนเทนเนอร์ในเครื่องท้องถิ่นเชื่อมต่อกับเซิร์ฟเวอร์ใน VPN (ซึ่งไม่ได้เกิดขึ้นสำหรับฉัน)
dexter2305

1

หากคุณใช้ OSX คุณอาจต้องรีสตาร์ทเครื่องหลังจากติดตั้ง Docker นี่เป็นปัญหาอยู่หลายครั้ง


1

เพียงเพิ่มสิ่งนี้ที่นี่ในกรณีที่มีคนพบปัญหานี้ภายในคอนเทนเนอร์ virtualbox ที่ใช้งานนักเทียบท่า ฉันกำหนดค่าเครือข่าย virtualbox ใหม่เพื่อเชื่อมโยงแทน nat และปัญหาก็หายไป


0

ฉันยังพบปัญหาดังกล่าวขณะพยายามตั้งค่าโครงการโดยใช้ Docker-Compose บน Ubuntu

Docker ไม่สามารถเข้าถึงอินเทอร์เน็ตได้เลยเมื่อฉันพยายาม ping ที่อยู่ IP ใด ๆ หรือ nslookup บาง URL - มันล้มเหลวตลอดเวลา

ฉันลองใช้วิธีแก้ปัญหาที่เป็นไปได้ทั้งหมดด้วยการแก้ปัญหา DNS ที่อธิบายไว้ข้างต้นแล้ว แต่ก็ไม่มีประโยชน์

ฉันใช้เวลาทั้งวันในการพยายามค้นหาว่าเกิดอะไรขึ้นและในที่สุดก็พบว่าสาเหตุของปัญหาทั้งหมดคือโปรแกรมป้องกันไวรัสโดยเฉพาะอย่างยิ่งมันเป็นไฟร์วอลล์ซึ่งด้วยเหตุผลบางประการที่บล็อก Docker ไม่ให้รับที่อยู่ IP และพอร์ต

เมื่อฉันปิดการใช้งาน - ทุกอย่างทำงานได้ดี

ดังนั้นหากคุณติดตั้งโปรแกรมป้องกันไวรัสและไม่มีสิ่งใดช่วยแก้ไขปัญหาได้ปัญหาอาจเป็นไฟร์วอลล์ของโปรแกรมป้องกันไวรัส


0

ฉันมีปัญหาคล้ายกันในช่วงสองสามวันที่ผ่านมา สำหรับฉันสาเหตุคือการรวมกันของ systemd นักเทียบท่าและผู้ให้บริการโฮสติ้งของฉัน ฉันใช้งาน CentOS รุ่นล่าสุด (7.7.1908)

ผู้ให้บริการโฮสติ้งของฉันสร้างไฟล์กำหนดค่าสำหรับ systemd-networkd โดยอัตโนมัติ เริ่มต้นด้วย systemd 219 ซึ่งเป็นเวอร์ชันปัจจุบันสำหรับ CentOS 7 systemd-networkd ได้ควบคุมพารามิเตอร์ sysctl ที่เกี่ยวข้องกับเครือข่าย ดูเหมือนว่านักเทียบท่าจะเข้ากันไม่ได้กับเวอร์ชันนี้และจะรีเซ็ตแฟล็กการส่งต่อ IP ทุกครั้งที่เปิดตัวคอนเทนเนอร์

วิธีแก้ปัญหาของฉันคือเพิ่มIPForward=trueใน - ส่วน[Network]ของไฟล์กำหนดค่าที่ผู้ให้บริการสร้างขึ้น ไฟล์นี้อาจอยู่ในหลายที่ซึ่งส่วนใหญ่จะอยู่ในไฟล์/etc/systemd/networkไฟล์.

กระบวนการนี้ยังอธิบายไว้ในเอกสารนักเทียบท่าอย่างเป็นทางการ: https://docs.docker.com/v17.09/engine/installation/linux/linux-postinstall/#ip-forwarding-pro issues


คุณช่วยระบุตำแหน่งที่คุณตั้งค่าพารามิเตอร์นี้ได้ไหม ฉันมีตำแหน่งเดียวกันกับคุณโดยใช้ VM บน Google Cloud Platform และไม่พบไฟล์ * .network บนเซิร์ฟเวอร์ เปิดเท่านั้น/usr/lib/sysctl.d/50-default.confแต่ไวยากรณ์แตกต่างกัน
el.severo

คลัสเตอร์ของฉันได้รับการจัดการด้วยตนเองและผู้ให้บริการของฉันทำการบูตเฉพาะขั้นพื้นฐานเมื่อตั้งค่า การกำหนดค่าเครือข่ายเป็นที่/etc/systemd/network/10-mainif.networkสำหรับฉัน สถานที่อื่น ๆ ที่คุณอาจตรวจสอบคือ/usr/local/lib/systemd/และ/usr/lib/systemd/ตาม manpage systemd
BlackCetha

0

สำหรับฉันการใช้ centos 7.4 มันไม่ใช่ปัญหาของ /etc/resolve.conf, iptables, iptables nat rules หรือ docker เอง ปัญหาคือโฮสต์ไม่มีแพ็คเกจบริดจ์ยูทิลิตี้ที่นักเทียบท่าต้องการเพื่อสร้างบริดจ์โดยใช้คำสั่ง brctl ยำติดตั้ง -y bridge-utils และรีสตาร์ทนักเทียบท่าแก้ปัญหา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.