Как правильно исправить разрешение имен из контейнера Docker?

У меня установлена ​​чистая Ubuntu MATE 16.04.6 LTS.
Я установил Docker из репозитория здесь с:

sudo apt-get install docker.io

и добавил моего пользователя в группу docker с

sudo usermod -a -G docker $USER

, затем я загрузил контейнер Ubuntu 19.04 с

docker pull ubuntu:19.04

и попытался запустить apt update внутри него

docker run -it ubuntu:19.04 apt update

, но получил сетевые ошибки:

$ docker run -it ubuntu:19.04 apt update
Err:1 http://archive.ubuntu.com/ubuntu disco InRelease                   
  Temporary failure resolving 'archive.ubuntu.com'
Err:2 http://security.ubuntu.com/ubuntu disco-security InRelease         
  Temporary failure resolving 'security.ubuntu.com'
Err:3 http://archive.ubuntu.com/ubuntu disco-updates InRelease           
  Temporary failure resolving 'archive.ubuntu.com'
Err:4 http://archive.ubuntu.com/ubuntu disco-backports InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Reading package lists... Done        
Building dependency tree       
Reading state information... Done
All packages are up to date.
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/disco/InRelease  Temporary
failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/disco-updates/InRelease 
Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/disco-backports/InRelease 
Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://security.ubuntu.com/ubuntu/dists/disco-security/InRelease 
Temporary failure resolving 'security.ubuntu.com'
W: Some index files failed to download. They have been ignored, or old ones used instead.

Внутренний контейнер /etc/resolv.conf выглядит следующим образом:

$ docker run -it  ubuntu:19.04 cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN

nameserver 8.8.8.8
nameserver 8.8.4.4

В хост-системе есть Интернет, NetworkManager используется с настройками по умолчанию:

$ cat /etc/NetworkManager/NetworkManager.conf 
[main]
plugins=ifupdown,keyfile,ofono
dns=dnsmasq

[ifupdown]
managed=false

все файлы в системе без изменений - команда debsums --changed --all --silent ничего не возвращает.

Запрошенные выходные данные iptables -S приведены ниже:

$ sudo iptables -S
-P INPUT ACCEPT
-P FORWARD DROP
-P OUTPUT ACCEPT
-N DOCKER
-N DOCKER-ISOLATION-STAGE-1
-N DOCKER-ISOLATION-STAGE-2
-N DOCKER-USER
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN

Какие настройки следует изменить, чтобы исправить DNS (разрешение имен) из контейнера Docker?

Примечания:

  1. Я знаю об отключении маскировки DNS (#dns=dnsmasq), но я не хочу использовать эту опцию.
  2. Я получил тот же результат, когда использовал Docker-CE с docker.com.
  3. Система, установленная из netinstall mini.iso, не страдает от вышеупомянутой проблемы. Используется ifupdown. Таким образом, NetworkManager является корнем этой проблемы.
1
задан 30 July 2019 в 22:32

1 ответ

Решение для docker run очень просто - мы должны выбрать сеть узла с --network host опция:

docker run -it --network host ubuntu:19.04 apt update

и затем проблема будет решена.


Но это также должно быть отмечено это docker build имеет --network опция, только начинающая только с 18.04 LTS. Таким образом, если нам нужно docker build --network host для 16.04 LTS мы должны использовать docker-ce пакет из docker.com.

0
ответ дан 7 December 2019 в 19:20

Другие вопросы по тегам:

Похожие вопросы: