Lo tenía funcionando bien, pero ahora se detuvo. Intenté los siguientes comandos sin resultado:
docker run -dns 8.8.8.8 base ping google.com
docker run base ping google.com
sysctl -w net.ipv4.ip_forward=1
- tanto en el host como en el contenedor
Todo lo que tengo es unknown host google.com
. Docker versión 0.7.0
¿Algunas ideas?
PS ufw
deshabilitado también
sysctl -w net.ipv4.ip_forward=1
(en Centos 6)sysctl -w net.ipv4.ip_forward=1
/etc/resolv.conf
en la máquina hostsysctl -w net.ipv4.ip_forward=1
que tuve que corrersudo service docker restart
.Respuestas:
Lo primero que debe verificar es ejecutar
cat /etc/resolv.conf
en el contenedor acoplable . Si tiene un servidor DNS no válido, comonameserver 127.0.x.x
, entonces el contenedor no podrá resolver los nombres de dominio en direcciones IP, porping google.com
lo que fallará.La segunda cosa a verificar se ejecuta
cat /etc/resolv.conf
en la máquina host . Docker básicamente copia los hosts/etc/resolv.conf
al contenedor cada vez que se inicia un contenedor. Entonces, si el host/etc/resolv.conf
está equivocado, también lo hará el contenedor docker.Si descubrió que el host
/etc/resolv.conf
está equivocado, entonces tiene 2 opciones:Codifique el servidor DNS en daemon.json. Esto es fácil, pero no es ideal si espera que cambie el servidor DNS.
Arreglar los anfitriones
/etc/resolv.conf
. Esto es un poco más complicado, pero se genera dinámicamente y no está codificando el servidor DNS.1. Hardcode servidor DNS en docker daemon.json
Editar
/etc/docker/daemon.json
Reinicie el Docker Daemon para que esos cambios surtan efecto:
sudo systemctl restart docker
Ahora, cuando ejecuta / inicia un contenedor, Docker se completará
/etc/resolv.conf
con los valores dedaemon.json
.2. Arreglar los hosts
/etc/resolv.conf
A. Ubuntu 16.04 y anterior
Para Ubuntu 16.04 y versiones anteriores,
/etc/resolv.conf
fue generado dinámicamente por NetworkManager.Comente la línea
dns=dnsmasq
(con a#
) en/etc/NetworkManager/NetworkManager.conf
Reinicie el NetworkManager para regenerar
/etc/resolv.conf
:sudo systemctl restart network-manager
Verificar en el host:
cat /etc/resolv.conf
B. Ubuntu 18.04 y posterior
Ubuntu 18.04 cambió para usar
systemd-resolved
para generar/etc/resolv.conf
. Ahora, por defecto, utiliza un caché de DNS local 127.0.0.53. Eso no funcionará dentro de un contenedor, por lo que Docker usará de forma predeterminada el servidor DNS 8.8.8.8 de Google, lo que puede dañar a las personas que se encuentran detrás de un firewall./etc/resolv.conf
en realidad es un enlace simbólico (ls -l /etc/resolv.conf
) que apunta a/run/systemd/resolve/stub-resolv.conf
(127.0.0.53) de forma predeterminada en Ubuntu 18.04.Simplemente cambie el enlace simbólico al que apunta
/run/systemd/resolve/resolv.conf
, que enumera los servidores DNS reales:sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
Verificar en el host:
cat /etc/resolv.conf
Ahora debería tener un válido
/etc/resolv.conf
en el host para que Docker lo copie en los contenedores.fuente
systemctl
(Ubuntu 14.04) intente ¿Cómo reiniciar el servicio de red? y / o reinicie su computadora./etc/resolv.conf
al contenedor en la construcción, tuve que copiar manualmente el archivo en el contenedor.Solucionado siguiendo este consejo:
https://github.com/dotcloud/docker/issues/866#issuecomment-19218300
Parece que la interfaz fue 'colgada' de alguna manera.
Actualización para versiones más recientes de docker:
La respuesta anterior aún puede hacer el trabajo por usted, pero ha pasado bastante tiempo desde que se publicó esta respuesta y la ventana acoplable está más pulida ahora, así que asegúrese de probar esto primero antes de comenzar a destrozar
iptables
y todo.sudo service docker restart
o (si está en una distribución de Linux que no usa el sistema de arranque)sudo systemctl restart docker
fuente
docker -d
falla No hay-d
banderaip link del docker0
docker -d
no existe en versiones más nuevas. En cambio:,service docker stop
entoncesdockerd
, entoncesservice docker start
La forma prevista de reiniciar Docker no es hacerlo manualmente, sino utilizar el
service
comando o init:fuente
systemctl enable docker
)Actualización de esta pregunta con una respuesta para OSX (usando Docker Machine)
Si está ejecutando Docker en OSX con Docker Machine, lo siguiente funcionó para mí:
Entonces (al menos en mi experiencia), si hace ping a google.com desde un contenedor, todo estará bien.
fuente
No sé lo que estoy haciendo, pero eso funcionó para mí:
fuente
iptables -t nat -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE
. Puede verificar si tiene esta regla coniptables -t nat -L POSTROUTING
Estaba usando
DOCKER_OPTS="--dns 8.8.8.8"
y luego descubrí que mi contenedor no tenía acceso directo a Internet, pero podía acceder a mi intranet corporativa. CambiéDOCKER_OPTS
a lo siguiente:reemplazando
internal_corporate_dns_address
con la dirección IP o FQDN de nuestro DNS y reiniciando Docker usandoy luego engendré mi contenedor y verifiqué que tenía acceso a internet.
fuente
Estaba perplejo cuando esto sucedió al azar para mí para uno de mis contenedores, mientras que los otros contenedores estaban bien. El contenedor estaba conectado a al menos una red no interna , por lo que no había nada de malo en la
Compose
definición. Reiniciar el demonio VM / docker no ayudó. Tampoco fue un problema de DNS porque el contenedor ni siquiera podía tenerping
una IP externa. Lo que me resolvió fue recrear las redes de acopladores. En mi caso,docker-compose down && docker-compose up
funcionó.Componer
Esto obliga a la recreación de todas las redes de todos los contenedores:
docker-compose down
&&docker-compose up
Modo enjambre
Supongo que simplemente eliminas y vuelves a crear el servicio, que recrea las redes del servicio:
docker service rm some-service
docker service create ...
Si las redes del contenedor son externas
Simplemente elimine y vuelva a crear las redes externas de ese servicio:
docker network rm some-external-network
docker network create some-external-network
fuente
Para mí fue el firewall del host. Tenía que permitir DNS en el firewall del host. Y también tuvo que reiniciar Docker después de cambiar la configuración del firewall del host.
fuente
sudo service iptables stop
ysudo chkconfig iptables off
(en CentOS / RHEL).Ningún acceso a Internet también puede ser causado por la falta de configuraciones de proxy . En ese caso,
--network host
puede que tampoco funcione. El proxy se puede configurar configurando las variables de entornohttp_proxy
yhttps_proxy
:No olvide establecer no_proxy también, o todas las solicitudes (incluidas las de localhost) pasarán por el proxy.
Más información: Configuración de proxy en Archlinux Wiki.
fuente
Para mí fue una regla de reenvío de iptables. Por alguna razón, la siguiente regla, cuando se combinó con las reglas de iptables de Docker, causó que todo el tráfico saliente de los contenedores golpeara
localhost:8080
:fuente
Tuve el problema en Ubuntu 18.04. Sin embargo, el problema fue con el DNS. Estaba en una red corporativa que tiene su propio servidor DNS y bloquea otros servidores DNS. Esto es para bloquear algunos sitios web (pornografía, torrents, etc.)
Para resolver su problema
use --dns your_dns como lo sugiere @jobin
docker run --dns your_dns -it --name cowsay --hostname cowsay debian bash
fuente
En Windows (8.1) eliminé la interfaz de virtualbox (a través de taskmgr) y resolvió el problema.
fuente
Es posible que haya iniciado su ventana acoplable con las opciones de DNS
--dns 172.x.x.x
Tuve el mismo error y eliminé las opciones de
/etc/default/docker
Las líneas:
fuente
Para Ubuntu 19.04 que usa openconnect 8.3 para VPN, tuve que vincular /etc/resolve.conf con el de systemd (opuesto a answerby wisbucky)
sudo ln -sf /etc/resolv.conf /run/systemd/resolve/resolv.conf
Pasos para depurar
Versión Docker: Docker versión 19.03.0-rc2, compilación f97efcc
fuente
Si está en OSX, es posible que deba reiniciar su máquina después de instalar Docker. Esto ha sido un problema a veces.
fuente
Originalmente, mi contenedor Docker pudo llegar a Internet externo (este es un servicio / contenedor Docker que se ejecuta en un Amazon EC2).
Como mi aplicación es una API, seguí la creación de mi contenedor (logró extraer todos los paquetes que necesitaba) con la actualización de mis Tablas IP para enrutar todo el tráfico desde el puerto 80 al puerto donde estaba mi API (ejecutándose en la ventana acoplable) escuchando
Luego, más tarde cuando intenté reconstruir el contenedor, falló. Después de mucha lucha, descubrí que mi paso anterior (establecer la regla de reenvío de puertos IPTable) estropeó la capacidad de red externa del acoplador.
Solución: Detenga su servicio de IPTable:
sudo service iptables stop
Reinicia el Docker Daemon:
sudo service docker restart
Luego, intente reconstruir su contenedor. Espero que esto ayude.
Seguimiento
Pasé por alto por completo que no necesitaba meterme con las Tablas IP para reenviar el tráfico entrante a 80 al puerto en el que se ejecutaba la API que se ejecutaba en la ventana acoplable. En cambio, simplemente alias el puerto 80 al puerto en el que se ejecutaba la API en Docker:
docker run -d -p 80:<api_port> <image>:<tag> <command to start api>
fuente
Simplemente agregue esto aquí en caso de que alguien se encuentre con este problema dentro de un contenedor virtualbox que ejecuta Docker. Volví a configurar la red virtualbox en puente en lugar de nat, y el problema desapareció.
fuente
para mí, mi problema fue porque iptables-services no estaba instalado, esto funcionó para mí (CentOS):
fuente
En centos 8, mi problema fue que no instalé e inicié iptables antes de iniciar el servicio de Docker. Asegúrese de que el servicio de iptables esté en funcionamiento antes de iniciar el servicio de docker.
fuente
También encontré un problema al intentar configurar un proyecto usando Docker-Compose en Ubuntu.
El Docker no tenía acceso a Internet en absoluto, cuando intenté hacer ping a cualquier dirección IP o buscar alguna URL, fallaba todo el tiempo.
Probé todas las posibles soluciones con resolución DNS descritas anteriormente en vano.
Pasé todo el día tratando de averiguar qué demonios estaba pasando, y finalmente descubrí que la causa de todos los problemas era el antivirus, en particular su firewall, que por alguna razón impidió que Docker obtuviera la dirección IP y el puerto.
Cuando lo desactivé, todo funcionó bien.
Entonces, si tiene un antivirus instalado y nada ayuda a solucionar el problema, el problema podría ser el firewall del antivirus.
fuente
He tenido un problema similar en los últimos días. Para mí, la causa fue una combinación de systemd, docker y mi proveedor de alojamiento. Estoy ejecutando CentOS actualizado (7.7.1908).
Mi proveedor de alojamiento genera automáticamente un archivo de configuración para systemd-networkd. Comenzando con systemd 219, que es la versión actual de CentOS 7, systemd-networkd tomó el control de los parámetros sysctl relacionados con la red. Docker parece ser incompatible con esta versión y restablecerá los indicadores de reenvío de IP cada vez que se inicie un contenedor.
Mi solución fue agregar
IPForward=true
la[Network]
sección del archivo de configuración generado por mi proveedor. Este archivo puede estar en varios lugares, muy probablemente en/etc/systemd/network
.El proceso también se describe en los documentos oficiales de Docker: https://docs.docker.com/v17.09/engine/installation/linux/linux-postinstall/#ip-forwarding-problems
fuente
/usr/lib/sysctl.d/50-default.conf
pero la sintaxis es diferente./etc/systemd/network/10-mainif.network
para mí. Otros lugares que puede consultar son/usr/local/lib/systemd/
y/usr/lib/systemd/
según la página de manual de systemd.para mí, usando centos 7.4, no se trataba de /etc/resolve.conf, iptables, iptables nat rules ni docker en sí. El problema es que al host le falta el paquete bridge-utils que Docker requiere para construir el puente usando el comando brctl. yum install -y bridge-utils y reinicie docker, resuelva el problema.
fuente