3.modo de red acoplador, modo puente

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


Supongo que te gusta

Origin blog.51cto.com/12922638/2591046
Recomendado
Clasificación