Docker container của tôi không có internet


138

Tôi đã có nó làm việc ổn nhưng bây giờ nó dừng lại. Tôi đã thử các lệnh sau mà không có kết quả:

docker run -dns 8.8.8.8 base ping google.com

docker run base ping google.com

sysctl -w net.ipv4.ip_forward=1 - cả trên máy chủ và trên container

Tất cả tôi nhận được là unknown host google.com. Docker phiên bản 0.7.0

Có ý kiến ​​gì không?

PS cũng ufwbị vô hiệu hóa


9
Câu hỏi của bạn đã khắc phục vấn đề của tôi: phải chạy sysctl -w net.ipv4.ip_forward=1(trên Centos 6)
qwertzguy

Vì bạn có thể gặp sự cố với định tuyến docker dns, hãy kiểm tra giải pháp tương tự stackoverflow.com/questions/35515203/iêu
Aditya Kresna Permana

Tương tự ở đây, sau khi tôi sửa /etc/resolv.conf trên hộp máy chủ, nó sẽ không hoạt động mà không cósysctl -w net.ipv4.ip_forward=1
Reeebuuk

Ngoài ra kiểm tra xem bạn có các giá trị chính xác cho /etc/resolv.confvào máy chủ máy
Hanxue

đối với tôi sau khi sysctl -w net.ipv4.ip_forward=1tôi đã phải chạy sudo service docker restart.
Asif Ali

Câu trả lời:


100

Điều đầu tiên để kiểm tra là chạy cat /etc/resolv.conftrong container docker . Nếu nó có một máy chủ DNS không hợp lệ, chẳng hạn như nameserver 127.0.x.x, thì container sẽ không thể phân giải tên miền thành địa chỉ IP, do đó ping google.comsẽ thất bại.

Điều thứ hai cần kiểm tra là chạy cat /etc/resolv.conftrên máy chủ . Docker về cơ bản sao chép máy chủ /etc/resolv.confvào container mỗi khi container được khởi động. Vì vậy, nếu máy chủ /etc/resolv.confbị sai, thì container docker cũng vậy.

Nếu bạn thấy rằng máy chủ lưu trữ /etc/resolv.confsai, thì bạn có 2 tùy chọn:

  1. Mã hóa máy chủ DNS trong daemon.json. Điều này là dễ dàng, nhưng không lý tưởng nếu bạn mong muốn máy chủ DNS thay đổi.

  2. Sửa máy chủ /etc/resolv.conf. Đây là một mẹo nhỏ hơn, nhưng nó được tạo ra một cách linh hoạt và bạn không mã hóa máy chủ DNS.


1. Máy chủ DNS mã hóa cứng trong docker daemon.json

  • Biên tập /etc/docker/daemon.json

    {
        "dns": ["10.1.2.3", "8.8.8.8"]
    }
    
  • Khởi động lại trình nền docker để những thay đổi đó có hiệu lực:
    sudo systemctl restart docker

  • Bây giờ khi bạn chạy / khởi động một container, docker sẽ điền /etc/resolv.confvào các giá trị từ đó daemon.json.


2. Sửa lỗi máy chủ /etc/resolv.conf

A. Ubuntu 16.04 trở về trước

  • Đối với Ubuntu 16.04 trở về trước, /etc/resolv.confđã được NetworkManager tạo động.

  • Nhận xét dòng dns=dnsmasq(có a #) trong /etc/NetworkManager/NetworkManager.conf

  • Khởi động lại Trình quản lý mạng để tạo lại /etc/resolv.conf:
    sudo systemctl restart network-manager

  • Xác minh trên máy chủ: cat /etc/resolv.conf

B. Ubuntu 18.04 trở lên

  • Ubuntu 18.04 đã thay đổi để sử dụng systemd-resolvedđể tạo/etc/resolv.conf . Bây giờ theo mặc định, nó sử dụng bộ đệm DNS cục bộ 127.0.0.53. Điều đó sẽ không hoạt động bên trong một container, vì vậy Docker sẽ mặc định là máy chủ DNS 8.8.8.8 của Google, có thể bị hỏng đối với những người đứng sau tường lửa.

  • /etc/resolv.confthực sự là một symlink ( ls -l /etc/resolv.conf) trỏ đến /run/systemd/resolve/stub-resolv.conf(127.0.0.53) theo mặc định trong Ubuntu 18.04.

  • Chỉ cần thay đổi liên kết tượng trưng để trỏ đến /run/systemd/resolve/resolv.conf, trong đó liệt kê các máy chủ DNS thực:
    sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

  • Xác minh trên máy chủ: cat /etc/resolv.conf

Bây giờ bạn nên có một hợp lệ /etc/resolv.conftrên máy chủ lưu trữ để sao chép vào các thùng chứa.


1
Điều này đã giải quyết vấn đề trên Ubuntu 16.04 với Docker 17.09.
Luís de Sousa

2
Điều này đã giải quyết vấn đề của tôi (giống như OP, Ubuntu 14.04 / Docker 18.01.0-ce). Liên kết này có thể hữu ích khi kiểm tra kết nối internet mà không cần ping nếu bạn không có lệnh ping trên hình ảnh docker của mình. Nếu máy chủ của bạn không có systemctl(Ubuntu 14.04) hãy thử Cách khởi động lại dịch vụ mạng? và / hoặc khởi động lại máy tính của bạn.
Benjamin

Làm việc như người ở!
Homewrecker

1
Điều này hoạt động trên Ubuntu 18.04 (tùy chọn B). Tuy nhiên docker đã không chuyển đúng bây giờ /etc/resolv.confsang container khi xây dựng, tôi phải sao chép thủ công tệp vào container.
glaux

1
Trên máy của tôi (RedHat 7.4), tệp cấu hình của máy chủ là chính xác, nhưng tệp chứa vẫn đang hướng về phía 172.0.0.11. Vậy phải làm gì bây giờ?
Martin Majewski

89

Đã sửa bằng cách làm theo lời khuyên này:

[...] Bạn có thể thử thiết lập lại mọi thứ không?

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

Nó sẽ buộc docker tạo lại cây cầu và thực hiện lại tất cả các quy tắc mạng

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

Có vẻ như giao diện đã bị 'treo' bằng cách nào đó.

Cập nhật cho các phiên bản mới hơn của docker:

Câu trả lời trên có thể vẫn hoàn thành công việc cho bạn nhưng đã khá lâu kể từ khi câu trả lời này được đăng và docker được đánh bóng hơn bây giờ, vì vậy hãy chắc chắn rằng bạn thử những điều này trước khi tiếp tục đọc iptablesvà đọc.

sudo service docker restart hoặc (nếu bạn đang ở trong một bản phân phối linux không sử dụng mới bắt đầu) sudo systemctl restart docker


31
docker -dthất bại Không có -dcờ.
Luís de Sousa

1
Đối với những người vẫn gặp sự cố, có một vấn đề mở trên github của Moby đã được mở hơn một năm nay: github.com/moby/moby/issues/26567
Nepoxx

1
@Pawan:ip link del docker0
drewrockshard

1
hoặc cài đặt cầu-utils
cjdcordeiro 6/11/18

5
docker -dkhông tồn tại trong các phiên bản mới hơn. Thay vào đó : service docker stop, sau đó dockerd, sau đóservice docker start
Telmo Marques

64

Cách dự định để khởi động lại docker không phải là làm thủ công mà sử dụng lệnh servicehoặc init:

service docker restart

5
nếu bạn đang ở trong một bản phân phối linux không sử dụng upstart, sudo systemctl khởi động lại docker làm việc cho tôi
jeffrey

khởi động lại hoạt động tốt. Tôi không biết có liên quan gì đến thực tế là tôi đã kích hoạt nó để "tự động bắt đầu" ( systemctl enable docker)
Lucas Pottersky

Dường như không liên quan đến câu hỏi của OP.
Kevin Buchs

Điều đó cũng đúng, bởi vì trong tình huống OP đang mô tả, việc đặt lại docker xác định lại các giao diện mạng, do đó cho phép truy cập internet. Đúng là điều này không giải quyết TẠI SAO đôi khi nó bị hỏng, nhưng nó cung cấp một giải pháp cho vấn đề.
bitmask

Nhưng trong môi trường sản xuất, khởi động lại docker là không thể. Làm thế nào để giải quyết vấn đề trong trường hợp này?
Suyanhanx

22

Cập nhật câu hỏi này với câu trả lời cho OSX (sử dụng Docker Machine)

Nếu bạn đang chạy Docker trên OSX bằng Docker Machine, thì những điều sau đây có hiệu quả với tôi:

docker-machine restart

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

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

Sau đó (ít nhất là theo kinh nghiệm của tôi), nếu bạn ping google.com từ một container thì tất cả sẽ ổn.


Cũng làm việc trong các cửa sổ để có được quyền truy cập mạng hoạt động trở lại.
Mikael Lepistö

1
Điều đó làm việc cho tôi. Tôi có một biểu tượng docker trong thanh menu trên cùng, trong menu tôi có tùy chọn "khởi động lại". Sau đó, mạng đã hoạt động tốt trở lại
olidem

8

Tôi không biết những gì tôi đang làm nhưng điều đó làm việc cho tôi:

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
băng keo đẹp!
dctremblay

1
Bạn trả lời đã giúp giải quyết vấn đề tương tự. Tôi đã dành hàng giờ vào đó! Sau khi cài đặt Kubespray chưa hoàn tất, Docker container bị mất internet với thông báo "Giải quyết lỗi tạm thời" khi cố gắng ping bất kỳ máy chủ công cộng hoặc IP nào. Vì vậy, tôi đã không có quy tắc này là bắt buộc - iptables -t nat -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE. Bạn có thể kiểm tra xem bạn có quy tắc này vớiiptables -t nat -L POSTROUTING
laimison 16/12/19

6

Tôi đã sử dụng DOCKER_OPTS="--dns 8.8.8.8"và sau đó phát hiện ra rằng container của tôi không có quyền truy cập trực tiếp vào internet nhưng có thể truy cập mạng nội bộ của công ty tôi. Tôi đã thay đổi DOCKER_OPTSnhư sau:

DOCKER_OPTS="--dns <internal_corporate_dns_address"

thay thế internal_corporate_dns_addressbằng địa chỉ IP hoặc FQDN của DNS của chúng tôi và khởi động lại docker bằng cách sử dụng

sudo service docker restart

và sau đó sinh ra container của tôi và kiểm tra xem nó có truy cập internet không.


5

Tôi đã bối rối khi điều này xảy ra ngẫu nhiên đối với tôi đối với một trong những container của tôi, trong khi các container khác vẫn ổn. Container được gắn vào ít nhất một mạng không phải nội bộ , vì vậy không có gì sai với Composeđịnh nghĩa. Khởi động lại daemon VM / docker không giúp được gì. Đây cũng không phải là sự cố DNS vì vùng chứa thậm chí không thể pinglà IP bên ngoài. Điều giải quyết nó cho tôi là tạo lại (các) mạng docker. Trong trường hợp của tôi, docker-compose down && docker-compose upđã làm việc.

Soạn, biên soạn

Điều này buộc phải giải trí tất cả các mạng của tất cả các container:

docker-compose down && docker-compose up

Chế độ bầy đàn

Tôi cho rằng bạn chỉ cần xóa và tạo lại dịch vụ, dịch vụ này sẽ tạo lại (các) mạng của dịch vụ:

docker service rm some-service

docker service create ...

Nếu (các) mạng chứa là bên ngoài

Chỉ cần xóa và tạo lại các mạng bên ngoài của dịch vụ đó:

docker network rm some-external-network

docker network create some-external-network


4

Đối với tôi đó là tường lửa của máy chủ. Tôi đã phải cho phép DNS trên tường lửa của máy chủ. Và cũng phải khởi động lại docker sau khi thay đổi cài đặt tường lửa máy chủ.


Hoặc bạn có thể vô hiệu hóa iptables bằng sudo service iptables stopsudo chkconfig iptables off(trên CentOS / RHEL).
MichaelZ

4

Không có truy cập internet cũng có thể được gây ra bởi thiếu cài đặt proxy . Trong trường hợp đó, --network hostcó thể không hoạt động. Proxy có thể được cấu hình bằng cách đặt các biến môi trường http_proxyhttps_proxy:

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

Đừng quên đặt no_proxy, hoặc tất cả các yêu cầu (bao gồm cả các yêu cầu đến localhost) sẽ đi qua proxy.

Thông tin thêm: Cài đặt proxy trong Archlinux Wiki.


1
Đây là giải pháp cho tôi. Mặc dù vậy, hãy cẩn thận: Tôi đang sử dụng alpine, có triển khai wget của hộp bận dường như bỏ qua các cài đặt proxy, vì vậy tôi không thấy lợi ích của việc đặt các biến môi trường.
pelson

Cảm ơn những gợi ý về busybox; Tôi chưa biết về nó!
Simon A. Eugster

1
lưu ý rằng một số os cần chữ hoa như trong liên kết tài liệu .
Flo

3

Đối với tôi đó là một quy tắc chuyển tiếp iptables. Vì một số lý do, quy tắc sau đây, khi được kết hợp với quy tắc iptables của docker, khiến tất cả lưu lượng truy cập đi từ container bị tấn công 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
Vậy ... giải pháp là gì? :) Tôi có quy tắc đầu tiên và cần nó để chuyển hướng lưu lượng truy cập vào 80 đến 8080. Làm cách nào để thay đổi điều này để không ảnh hưởng đến lưu lượng truy cập đi?
mrooney

3

Tôi gặp sự cố trên Ubuntu 18.04. Tuy nhiên, vấn đề là với DNS. Tôi đã ở trong một mạng công ty có máy chủ DNS riêng và chặn các máy chủ DNS khác. Điều này là để chặn một số trang web (khiêu dâm, torrent, ... vân vân)

Để giải quyết vấn đề của bạn

  1. tìm DNS của bạn trên máy chủ
  2. sử dụng --dns your_dns theo đề xuất của @jobin

    docker chạy --dns your_dns -it --name Coway --hostname coway debian bash


2

Trên windows (8.1) tôi đã giết giao diện hộp ảo (thông qua taskmgr) và nó đã giải quyết được vấn đề.


2

Bạn có thể đã bắt đầu docker của bạn với các tùy chọn dns --dns 172.x.x.x

Tôi đã có cùng một lỗi và loại bỏ các tùy chọn khỏi /etc/default/docker

Những dòng kẻ:

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

2

Đối với Ubuntu 19.04 sử dụng openconnect 8.3 cho VPN, tôi đã phải liên kết /etc/resolve.conf với một trong systemd (ngược lại với câu trả lời wvducky)

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

Các bước để gỡ lỗi

  1. Kết nối với VPN công ty
  2. Tìm các cài đặt VPN chính xác trong /etc/resolv.conf hoặc /run/systemd/resolve/resolv.conf
  3. Bất cứ khi nào có cài đặt DNS chính xác, chúng tôi sẽ liên kết liên kết đó đến tệp khác (Gợi ý: Đặt một cài đặt đúng với bên trái của nhiệm vụ)

Phiên bản Docker: Phiên bản Docker 19.03.0-RC2, xây dựng f97efcc


2
Cảm ơn bạn. Với Ubuntu 18.04, khi kết nối với VPN công ty, chỉ có /etc/resolve.conf được cập nhật bởi DHCP và / run / systemd / giải quyết / giải quyết / conf vẫn không đổi / tĩnh. Giải pháp này đã giúp. Bây giờ, các bộ chứa trong máy cục bộ kết nối với máy chủ trong VPN (điều này không xảy ra với tôi)
dexter2305

1

Nếu bạn đang dùng OSX, bạn có thể cần phải khởi động lại máy sau khi cài đặt Docker. Điều này đã có lúc là một vấn đề.


1

Ban đầu container docker của tôi có thể truy cập internet bên ngoài (Đây là dịch vụ / container docker chạy trên Amazon EC2).

Vì ứng dụng của tôi là API, tôi đã theo dõi việc tạo container của mình (nó đã thành công trong việc kéo tất cả các gói cần thiết) bằng cách cập nhật Bảng IP của tôi để định tuyến tất cả lưu lượng truy cập từ cổng 80 đến cổng mà API của tôi (chạy trên docker) lắng nghe

Sau đó, khi tôi cố gắng xây dựng lại container, nó đã thất bại. Sau nhiều lần vật lộn, tôi phát hiện ra rằng bước trước của tôi (đặt quy tắc chuyển tiếp cổng IPTable) đã làm rối tung khả năng kết nối mạng bên ngoài của docker.

Giải pháp: Dừng dịch vụ IPTable của bạn:

sudo service iptables stop

Khởi động lại Docker Daemon:

sudo service docker restart

Sau đó, hãy thử xây dựng lại container của bạn. Hi vọng điêu nay co ich.


Theo sát

Tôi hoàn toàn bỏ qua rằng tôi không cần phải lộn xộn với các Bảng IP để chuyển lưu lượng truy cập đến 80 đến cổng mà API đang chạy trên docker đang chạy. Thay vào đó, tôi chỉ đặt bí danh cổng 80 cho cổng mà API trong docker đang chạy:

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


1

Chỉ cần thêm điều này vào đây trong trường hợp ai đó gặp phải vấn đề này trong thùng chứa hộp ảo đang chạy docker. Tôi đã cấu hình lại mạng hộp ảo để bắc cầu thay vì nat và vấn đề đã biến mất.


1

đối với tôi, vấn đề của tôi là do iptables - dịch vụ chưa được cài đặt, điều này hiệu quả với tôi (CentOS):

sudo yum install iptables-services
sudo service docker restart

nhớ bắt đầu và kích hoạt các dịch vụ iptable nữa
Jay

1

Trên centos 8, vấn đề của tôi là tôi đã không cài đặt và khởi động iptables trước khi bắt đầu dịch vụ docker. Đảm bảo dịch vụ iptables hoạt động và chạy trước khi bạn bắt đầu dịch vụ docker.


0

Tôi cũng gặp phải một vấn đề như vậy trong khi cố gắng thiết lập một dự án bằng Docker-Compose trên Ubuntu.

Docker hoàn toàn không có quyền truy cập vào internet, khi tôi cố gắng ping bất kỳ địa chỉ IP nào hoặc nslookup một số URL - nó luôn thất bại.

Tôi đã thử tất cả các giải pháp có thể với độ phân giải DNS được mô tả ở trên nhưng không có kết quả.

Tôi đã dành cả ngày để cố gắng tìm hiểu xem cái quái gì đang diễn ra, và cuối cùng phát hiện ra rằng nguyên nhân của tất cả các vấn đề là do phần mềm chống vi-rút, đặc biệt là tường lửa, vì lý do nào đó đã chặn Docker lấy địa chỉ IP và cổng.

Khi tôi vô hiệu hóa nó - mọi thứ hoạt động tốt.

Vì vậy, nếu bạn đã cài đặt phần mềm chống vi-rút và không có gì giúp khắc phục sự cố - vấn đề có thể là tường lửa của phần mềm chống vi-rút.


0

Tôi đã có một vấn đề tương tự trong vài ngày qua. Đối với tôi nguyên nhân là sự kết hợp của systemd, docker và nhà cung cấp dịch vụ lưu trữ của tôi. Tôi đang chạy CentOS cập nhật (7.7.1908).

Nhà cung cấp dịch vụ lưu trữ của tôi tự động tạo một tệp cấu hình cho systemd-networkd. Bắt đầu với systemd 219, phiên bản hiện tại của CentOS 7, systemd-networkd đã kiểm soát các tham số sysctl liên quan đến mạng. Docker dường như không tương thích với phiên bản này và sẽ đặt lại các cờ Chuyển tiếp IP mỗi khi một container được khởi chạy.

Giải pháp của tôi là thêm IPForward=truevào phần [Network]tập tin cấu hình do nhà cung cấp tạo ra. Tập tin này có thể ở một vài nơi, rất có thể ở /etc/systemd/network.

Quá trình này cũng được mô tả trong các tài liệu docker chính thức: https://docs.docker.com/v17.09/engine/installation/linux/linux-postinstall/#ip-forwarding-probols


Bạn có thể vui lòng xác định vị trí chính xác mà bạn đã đặt tham số này? Tôi có cùng vị trí với bạn, chạy VM trên Google Cloud Platform và không thể tìm thấy bất kỳ tệp * .network nào trên máy chủ. Chỉ trên /usr/lib/sysctl.d/50-default.confnhưng cú pháp là khác nhau.
el.severo

Cụm của tôi tự quản lý và nhà cung cấp của tôi chỉ thực hiện bootstrapping cơ bản khi thiết lập. Cấu hình mạng là /etc/systemd/network/10-mainif.networkdành cho tôi. Những nơi khác bạn có thể kiểm tra là /usr/local/lib/systemd//usr/lib/systemd/theo manpage systemd.
BlackCetha

0

đối với tôi, sử dụng centos 7.4, đó không phải là vấn đề của /etc/resolve.conf, iptables, iptables nat cũng như chính docker. Vấn đề là máy chủ thiếu gói cầu nối gói mà docker yêu cầu để xây dựng cầu bằng lệnh brctl. yum cài đặt -y cầu-utils và khởi động lại docker, giải quyết vấn đề.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.