Không có kết nối internet bên trong các container Docker


24

Tôi không thể thực thi bất kỳ lệnh nào yêu cầu kết nối internet bên trong bất kỳ container Docker nào.

Làm:

docker run ubuntu /bin/echo 'Hello world'

Không hoạt động:

docker run ubuntu apt-get update

Err:1 http://archive.ubuntu.com/ubuntu xenial InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Err:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Err:3 http://archive.ubuntu.com/ubuntu xenial-security InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Reading package lists...
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial/InRelease  Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial-updates/InRelease  Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial-security/InRelease  Temporary failure resolving 'archive.ubuntu.com'

Tương tự với pipping.

Tôi đang dùng Ubuntu 16.04 và không sử dụng tường lửa hoặc máy chủ proxy công ty và đã thử khởi động lại Docker.

Cập nhật:

Cập nhật trong chế độ tương tác thất bại trong cùng một thời gian.

docker exec -ti angry_goodall /bin/bash
apt-get update
#fails
ping google.com
#fails with "unknown host" message
ping 8.8.8.8 
# shows PING 8.8.8.8 (8.8.8.8): 56 data bytes
# and than hangs indefinetly

sudo apt-get update chạy thành công trên máy chủ, tức là trên máy tính của tôi bên ngoài docker.

Cập nhật Docker phiên bản 1.12.1, bản dựng 23cf638


Bạn có thể ping một tên miền từ máy chủ không? Bạn có thể chạy apt-get updatetrong khi ở chế độ tương tác với docker?
adampski

đầu ra hiển thị lỗi: Lỗi tạm thời giải quyết 'archive.ubfox.com' ... thử .. ping www.google.com .. xem bạn có nhận được phản hồi tương tự không .. sau đó thử ... ping 8.8.8.8 .. . nếu IP hoạt động và tên máy chủ không hoạt động thì DNS của bạn sẽ bị hỏng (thêm /etc/resolv.conf để xem máy chủ DNS nào đang được sử dụng)
TG2

@adampski, tôi cập nhật câu hỏi dựa trên đề xuất của bạn.
Sashko Lykhenko

@ TG2, tôi cũng cập nhật câu hỏi dựa trên đề xuất của bạn.
Sashko Lykhenko

Phiên bản nào của động cơ docker bạn đang chạy?
adampski

Câu trả lời:


13

Theo đề xuất của creack về vấn đề GitHub # 866 cho Docker :

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à khởi động lại tất cả các quy tắc mạng"


1
Tôi đã thử nó, và điều này giết chết mạng trên toàn bộ máy tính của tôi.
petersohn

Điều này là hữu ích và giải quyết vấn đề cho tôi. Cảm ơn bạn.
Rao

10
Các -dcờ không thoát.
Luís de Sousa

2
Xin chào @ LuísdeSousa, thật đáng tiếc khi bạn bỏ phiếu này nhưng hãy xem xét khả năng có thể một số công tắc đã bị xóa hoặc thay đổi trong các bản phát hành mới hơn. Đặc biệt là vì điều này đã hơn một năm trước.
adampski

3
thay vì chỉ sao chép / qua lệnh bạn có thể giải thích ý nghĩa của chúng :)
Adelin

12

Có một vấn đề tương tự tại StackOverflow trong đó một giải pháp khác giải quyết vấn đề này với Docker 17,09 trên Ubuntu 16.04:

Kiểm tra nội dung của resolv.conf:

$ cat /etc/resolv.conf

Nếu nó bao gồm một dòng như nameserver 127.0.1.1nó có nghĩa là các container đang có được một máy chủ tên không chính xác. Để sửa lỗi này, chỉnh sửa NetworkManager.conftệp:

$ sudo pico /etc/NetworkManager/NetworkManager.conf

Và bình luận ra dòng với dns=dnsmasq; các tập tin sẽ trông như thế này:

[main]
plugins=ifupdown,keyfile,ofono
#dns=dnsmasq

[ifupdown]
managed=false

Cuối cùng, khởi động lại trình quản lý mạng:

$ sudo systemctl restart network-manager

Kiểm tra lại container:

$ docker run ubuntu:16.04 apt-get update
Get:1 http://archive.ubuntu.com/ubuntu xenial InRelease [247 kB]
Get:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [102 kB]

Cài đặt của tôi phù hợp với mô tả và cách tiếp cận ở trên đã giải quyết vấn đề cho tôi.
krcools

câu trả lời được cập nhật cho Ubuntu 18.04: superuser.com/a/1335054
wvducky

7

Đ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 chút phức tạp 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, 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.

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.