Tengo Docker instalado (Docker para Mac). Comienzo un nuevo contenedor con
docker run -it ubuntu
Puedo ver que mi contenedor recién creado tiene acceso a Internet simplemente invocando
ping google.com
Ya veo:
root@b06e1a46cc40:/# ping google.com PING google.com (216.58.209.14) 56(84) bytes of data. 64 bytes from sof01s12-in-f14.1e100.net (216.58.209.14): icmp_seq=1 ttl=37 time=63.0 ms 64 bytes from sof01s12-in-f14.1e100.net (216.58.209.14): icmp_seq=2 ttl=37 time=63.7 ms 64 bytes from sof01s12-in-f14.1e100.net (216.58.209.14): icmp_seq=3 ttl=37 time=64.8 ms
A continuación, verifiqué las redes a las que está conectado mi contenedor:
root@b06e1a46cc40:/# ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1 link/ipip 0.0.0.0 brd 0.0.0.0 3: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN group default qlen 1 link/tunnel6 :: brd :: 6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever root@b06e1a46cc40:/#
Según tengo entendido, eth0 se usa para acceder a Internet: es una red 172.17.0.0/16.
Cuando miro la lista de redes de mi host, no estoy conectado a esta red.
Entonces, ¿cómo accede mi contenedor a Internet?
Según tengo entendido, mi contenedor debe acceder a Internet a través de mi host porque, después de todo, mi host está conectado a Internet, por lo que esta es la única forma de acceder.
Docker para Mac emplea el marco de macOS Hypervisor para ejecutar una distribución de Linux personalizada (CLD) en una máquina virtual (VM).
Ahora, el CLD dentro de la VM no tiene conectividad de red con el sistema operativo anfitrión (es decir, macOS), pero Docker para Mac llena el vacío (literalmente) a través de VPNkit .
VPNkit utiliza una cola de memoria compartida para enviar paquetes de red entre el host y el invitado, y luego los inyecta en la pila de red del otro lado.
Aquí hay algunos artículos relevantes que describen cómo funcionan estas cosas en detalle:
https://docs.docker.com/docker-for-mac/networking/ https://github.com/moby/vpnkit/blob/master/docs/ethernet.md https://github.com/moby/vpnkit /blob/master/docs/ports.md
Entonces, para responder a su pregunta directamente: las redes/interfaces que puede ver dentro de su contenedor no tienen contrapartes en el host (macOS). En cambio, cuando ejecuta ping google.com
, VPNkit intercepta los paquetes de red resultantes dentro de la máquina virtual, los transfiere al host y los inyecta en la pila de red del host.
Lo mismo sucede con los paquetes entrantes, pero en la dirección opuesta.
Según tengo entendido, los contenedores Docker tienen una red aislada a la que se pueden conectar varios contenedores. Los contenedores en la misma red pueden comunicarse inmediatamente entre sí. Esta red interna puede ponerse a disposición de Internet. Consulte esta documentación: https://docs.docker.com/v17.09/engine/userguide/networking/#bridge-networks
Use la red host en la docker run -it --network host ubuntu