Modo de red Docker
Red en puente: la relación entre su red y el host es la misma, y el mismo enrutador está conectado al mismo segmento de red del conmutador.
nat: Convirtió la red de su host en un dispositivo similar a un enrutador. Implementa la traducción de direcciones de red. Si el host puede conectarse a Internet, puede conectarse a Internet, pero sus segmentos de red son diferentes.
Solo host: deje que su host y su máquina virtual se conecten
modo anfitrión
Uso: use --net = host para especificar cuándo se ejecuta Docker
La red utilizada por la ventana acoplable es en realidad la misma que la del host, la ip de la tarjeta de red que se ve en el contenedor es la ip del host
modo contenedor
Cómo utilizar: --net = container: container_id / container_name
Varios contenedores usan una red común y las IP que ven son las mismas
modo ninguno
Uso: --net = ninguno especificado
En este modo, no se configurará ninguna red, ni tarjeta de red, ni red
Modo Puente
Cómo usar: --net = bridge especifica el modo predeterminado, no es necesario especificar el modo predeterminado es este modo de red. Este modo asignará un espacio de nombres de red independiente para cada contenedor. Similar al modo de red nat de vmware. Todos los contenedores del mismo host estarán en el mismo segmento de red y podrán comunicarse entre sí.
Gestión de red de Docker: acceso externo al contenedor
Idea: primero use la imagen de centos para crear un nuevo contenedor, luego instale el servicio nginx en el contenedor e inícielo , y luego importe el contenedor en una nueva imagen (centos_nginx), y luego use la nueva imagen para crear el contenedor y especificar la asignación del puerto de host
Cree una nueva imagen: docker run -itd -p 8888: 80 centos_nginx bash // - se puede especificar la asignación de puertos p. En este ejemplo, el puerto 80 del contenedor se asigna al puerto local 8888
Ingrese la nueva imagen: docker exec -it container_id bash
Instalar nginx: yum install -y nginx
Iniciar nginx: systemctl iniciar nginx
Salir del contenedor: salir
Prueba: curl 127.0.0.1:8888
El formato de IP: puerto: ip: puerto también se admite después de -p, como
-p 127.0.0.1:8080:80
También puede escribir ip en lugar del puerto local, que asignará un puerto a voluntad
-p 127.0.0.1::80 // Tenga en cuenta que aquí hay dos dos puntos
Acceso desde otra máquina: IP del host de alquiler de la ventana acoplable: también se puede acceder a 8888
Soluciona el error al iniciar la operación nginx no permitida
El contenedor recién creado informará un error al iniciar el servicio nginx o httpd
[root @ 34b9c062b8d9 /] # systemctl start nginx El sistema no se ha iniciado con systemd como sistema de inicio (PID 1). No puedo operar. No se pudo conectar al bus: el host está inactivo No se pudo obtener la conexión D-Bus: operación no permitida
Esto se debe a que dbus-daemon no se inicia. Para resolver el problema, puede hacerlo
Al iniciar el contenedor, agregue el parámetro --privileged -e "container = docker" y cambie el último comando a / usr / sbin / init
格式 : docker run -itd -p 8888: 80 --privileged -e "container = docker" centos_with_nginx / usr / sbin / init
O agregue: --privileged = true
docker run -itd -p 8888: 80 --privileged -e "container = true" centos_nginx / usr / sbin / init
[root @ Bogon ~] # plazo ventana acoplable -ITD -p 8888: 80 --privileged -e "contenedor = true" centos_nginx / usr / sbin / init 20df5c59352256a8bae6d8e8315f65a1f06831a68ec4dc8fc51aa56d1d2bde60 [root @ localhost ~] # ps ventana acoplable CONTENEDOR DE COMANDO DE IMAGEN CREADA ID PUERTOS DEL ESTADO NAMES 73bda065303e centos_nginx "/ usr / sbin / init" Hace 12 minutos Hasta 12 minutos 0.0.0.0:8888->80/tcp wizardly_taussig df3b494539d4 300e315adb2f "bash" Hace 31 minutos Hasta 31 minutos hopeful_haentry f251f778055e registry "/ etc "Hace 57 minutos Arriba 57 minutos 0.0.0.0:5000->5000/tcp cranky_ramanujan
Administración de la red Docker: configurar la red puente
Este modo puede hacer que su contenedor docker y el host usen el mismo conmutador, estén en el mismo segmento de red, de modo que pueda comunicarse directamente con máquinas externas, o puede tratar este docker como un servidor independiente
Para que la comunicación entre las máquinas y los contenedores Docker en la red local sea más conveniente, a menudo necesitamos configurar el contenedor Docker en el mismo segmento de red que el host. En realidad, este requisito es muy fácil de lograr: solo necesitamos unir el contenedor Docker y la tarjeta de red del host, y luego configurar el contenedor Docker con una IP.
Primero ingrese al directorio de configuración de la tarjeta de red:
cd / etc / sysconfig / network-scripts /
Copie una nueva tarjeta de red
cp ifcfg-ens33 ifcfg-br0
Cambie la configuración de br0:
vim ifcfg-br0
Primero cambie la primera línea TYPE = Bridge
Cambie el nombre nuevamente: NAME = br0; DEVICE = br0; UUID también comentar
Cambiar la configuración de ens33
vi ifcfg-ens33 // Agregue BRIDGE = br0 en la última línea, comente: UUID, IPADDR, NETMASK, GATEWAY, DNS1
De hecho, es para configurar la IP de ens33 a la nueva tarjeta de red virtual br0, y luego ens33 está puenteando
Reinicie la tarjeta de red: systemctl restart network
Después de que la configuración sea exitosa, la tarjeta de red br0 heredará la ip de ens33 y ens33 desaparecerá
[root@localhost network-scripts]# ifconfig br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.18.141 netmask 255.255.255.0 broadcast 192.168.18.255 inet6 fe80::5b35:7d8a:d448:fcf1 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:b8:0f:33 txqueuelen 1000 (Ethernet) RX packets 66 bytes 5379 (5.2 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 73 bytes 8400 (8.2 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255 inet6 fe80::42:74ff:fe8a:e688 prefixlen 64 scopeid 0x20<link> ether 02:42:74:8a:e6:88 txqueuelen 0 (Ethernet) RX packets 7464 bytes 330335 (322.5 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 12839 bytes 27117685 (25.8 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 ether 00:0c:29:b8:0f:33 txqueuelen 1000 (Ethernet) RX packets 243167 bytes 341083270 (325.2 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 60420 bytes 5248917 (5.0 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
安装pipwork
克隆:git clone https://github.com/jpetazzo/pipework
[root@localhost ~]# git clone https://github.com/jpetazzo/pipework 正克隆到 'pipework'... remote: Enumerating objects: 8, done. remote: Counting objects: 100% (8/8), done. remote: Compressing objects: 100% (6/6), done. remote: Total 518 (delta 2), reused 5 (delta 2), pack-reused 510 接收对象中: 100% (518/518), 182.72 KiB | 14.00 KiB/s, done. 处理 delta 中: 100% (272/272), done.
拷贝文件到可执行目录下:
cp pipework/pipework /usr/local/bin/
开启一个容器:(--net=none参数意思是不设置网络)
docker run -itd --net=none centos_with_nettool bash
[root@localhost pipework]# docker run -itd --net=none 772d8347a1d7 bash 62cb0a73d01b26b4b3f7972f45806b8960c0762eacd486ff5e4f578c716051b0
进入到容器里,现在是没有网卡ip的
[root@localhost pipework]# docker exec -it 62cb0a bash [root@62cb0a73d01b /]# ifconfig lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 loop txqueuelen 1000 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@62cb0a73d01b /]#
退出并设置IP:
pipework br0 62cb0a73d01b 192.168.18.142/[email protected] #192.168.18.142为自定义容器的ip,@后面的ip为网关ip
[root@localhost pipework]# pipework br0 62cb0a73d01b 192.168.18.142/[email protected]
在进入容器就有IP了,而且还能ping外网,其他机器也可以ping它,在里边安装一些服务(nginx,httpd)就可以直接ip端口访问了
[root@localhost pipework]# docker exec -it 62cb0a bash [root@62cb0a73d01b /]# ifconfig eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.18.142 netmask 255.255.255.0 broadcast 192.168.18.255 ether 2a:d0:c4:88:ba:63 txqueuelen 1000 (Ethernet) RX packets 12 bytes 896 (896.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 1 bytes 42 (42.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 loop txqueuelen 1000 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
在容器ping外网
[root@62cb0a73d01b /]# ping baidu.com PING baidu.com (39.156.69.79) 56(84) bytes of data. 64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=1 ttl=128 time=47.4 ms 64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=2 ttl=128 time=44.6 ms 64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=3 ttl=128 time=46.10 ms
其他机器ping该容器
[root@localhost ~]# ping 192.168.18.141 PING 192.168.18.141 (192.168.18.141) 56(84) bytes of data. 64 bytes from 192.168.18.141: icmp_seq=42 ttl=64 time=0.486 ms 64 bytes from 192.168.18.141: icmp_seq=43 ttl=64 time=0.313 ms 64 bytes from 192.168.18.141: icmp_seq=44 ttl=64 time=0.296 ms 64 bytes from 192.168.18.141: icmp_seq=45 ttl=64 time=0.372 ms 64 bytes from 192.168.18.141: icmp_seq=46 ttl=64 time=0.220 ms 64 bytes from 192.168.18.141: icmp_seq=47 ttl=64 time=0.297 ms