Utilice el comando de host de red de Docker

David Mbochi Njonge 20 junio 2023
  1. Crear un proyecto Nginx
  2. Ejecute un contenedor en el controlador de red predeterminado
  3. Ejecutar un contenedor en la red host
  4. Conclusión
Utilice el comando de host de red de Docker

Los contenedores de Docker funcionan aprovechando los controladores de red creados durante la instalación de Docker. Los controladores predeterminados disponibles para nosotros incluyen las redes puente y anfitrión.

Cuando creamos contenedores sin especificar la red, se agregan a la red puente, y si queremos agregar un comando network a la red host o una red personalizada, usamos el comando --network .

En este tutorial, aprenderemos cómo agregar un contenedor a la red host usando el comando --network. También aprenderemos cómo se agregan contenedores a la red predeterminada si no especificamos una red usando este comando.

Crear un proyecto Nginx

Abra WebStorm IDEA y seleccione Archivo > Nuevo > Proyecto. En la ventana que se abre, seleccione Proyecto vacío y cambie el nombre del proyecto de sin título a docker-network-host o use el nombre que prefiera.

Finalmente, presione el botón etiquetado como Crear para generar el proyecto.

Cree un archivo llamado index.html en la carpeta actual y copie y pegue el siguiente código en el archivo.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>Welcome to docker networking !</h1>
</body>
</html>

En este archivo, hemos creado una página web simple que muestra un encabezado cuando accedemos a la aplicación que se ejecuta en nuestro contenedor. Esto ayudará a verificar que nuestro contenedor esté ejecutando la aplicación Nginx.

Definir una imagen

Cree un archivo llamado Dockerfile y copie y pegue las siguientes instrucciones en el archivo. Tenga en cuenta que generalmente usamos un archivo con este nombre para crear nuestra imagen personalizada a partir de imágenes existentes.

FROM nginx:alpine
ADD . /usr/share/nginx/html
  1. FROM - Establece la imagen base sobre la que crear nuestra imagen personalizada siguiendo las instrucciones posteriores.
  2. AÑADIR: copia los archivos y carpetas de la carpeta actual en el destino del sistema de archivos de imágenes /usr/share/nginx/html.

Construir una imagen

Para construir nuestra imagen personalizada usando el Dockerfile definido anteriormente. Abra una nueva ventana de terminal usando el atajo de teclado ALT+F12, y use este comando para construir la imagen.

~/WebstormProjects/docker-network-host$ docker build --tag docker-network-host:latest .

Este comando ejecuta el Dockerfile de forma secuencial para crear una imagen con la etiqueta, y podemos ver cada una de las instrucciones que se ejecutan en la ventana de la terminal, como se muestra a continuación.

=> [1/2] FROM docker.io/library/nginx:alpine@sha256:082f8c10bd47b6acc8ef15ae61ae45dd8fde0e9f389a8b5cb23c37408642bf5d               0.1s
 => => resolve docker.io/library/nginx:alpine@sha256:082f8c10bd47b6acc8ef15ae61ae45dd8fde0e9f389a8b5cb23c37408642bf5d               0.1s
 => CACHED [2/2] ADD . /usr/share/nginx/html

Ejecute un contenedor en el controlador de red predeterminado

Para ejecutar un contenedor de nuestra aplicación en la red predeterminada, ejecute el siguiente comando en la ventana del terminal. Tenga en cuenta que este contenedor se agregará a la red puente.

~/WebstormProjects/docker-network-host$ docker run --name docker-network-bridge-test -d -p 8000:80 docker-network-host:latest

Este comando ejecuta un contenedor llamado docker-network-bridge-test que escucha en el puerto 80 del contenedor y expone el puerto 8000 en el host. Para verificar que este contenedor se agregó a la red puente, ejecute el siguiente comando para inspeccionar la red puente.

~/WebstormProjects/docker-network-host$ docker network inspect bridge

Producción :

[
    {
        "Name": "bridge",
        "Id": "45773c7633cf28baa742ceca9c054a8dd6b4ea609dd9944d7ae12bdb57e86bcd",
        "Created": "2022-10-06T07:53:45.935633743Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "5e452da9b047ce94ff23b4841d1cb3358f34b037ef566c2f12a9eb57012a5f85": {
                "Name": "docker-network-bridge-test",
                "EndpointID": "d3491eb0c518d91be71b170e8ca0a077e07781bffbe20f3e1a1fd415eef9c288",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

En el JSON devuelto, la propiedad Containers tiene un contenedor llamado docker-network-bridge-test y se le asigna una MacAddress y una IPv4Address. Este es el mismo contenedor creado al comienzo de esta sección.

Para servir esta aplicación en el navegador, envíe una solicitud a localhost:8000 (http://localhost:8000/) y asegúrese de que devuelva un encabezado que contenga el texto ¡Bienvenido a la red docker!.

Ejecutar un contenedor en la red host

El término red de host significa que el contenedor se ejecuta en la red de nuestra máquina host, ya que la red de host no puede contener la red de contenedores. Para ejecutar el contenedor en la red host, ejecute el siguiente comando en la ventana del terminal.

~/WebstormProjects/docker-network-host$ docker run --rm -d --network host --name docker-network-host-test docker-network-host:latest

Este comando usa el comando --network con un valor de host para ejecutar un contenedor llamado docker-network-host-test en la red del host. Para verificar que este contenedor se agregó a la red del host, ejecute el siguiente comando en la ventana de la terminal.

~/WebstormProjects/docker-network-host$ docker network inspect host

Producción :

[
    {
        "Name": "host",
        "Id": "4ce9d3806cd88f9d9ea446272f4338f7b1f5e7098d4d0bc2a11090c1759d1880",
        "Created": "2022-09-19T07:51:50.247290701Z",
        "Scope": "local",
        "Driver": "host",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": []
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "22d15c7eee861ec7fdfd22936c30dfe1d17b2dde52ada93256f3e30943a3ed80": {
                "Name": "docker-network-host-test",
                "EndpointID": "7bd01907c8b86a881b86ae9e9c8ad8c1d3aa9f0583adebb7d41ae15bd565fabe",
                "MacAddress": "",
                "IPv4Address": "",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

En el JSON devuelto, la propiedad Containers tiene un contenedor llamado docker-network-host-test y tenga en cuenta que, en este caso, al contenedor no se le ha asignado una MacAddress o una IPv4Adress porque se está ejecutando en la red anfitriona. Este es el mismo contenedor creado al comienzo de esta sección.

Para servir esta aplicación en el navegador, envíe una solicitud a localhost:80 (http://localhost:80/) y asegúrese de que devuelva un encabezado que contenga el texto ¡Bienvenido a la red docker!. Sin embargo, asegúrese de que el puerto 80 en la red host esté abierto para aceptar solicitudes.

Conclusión

En este tutorial, hemos aprendido a ejecutar contenedores tanto en el controlador de red predeterminado puente como en el controlador de red host. Tenga en cuenta que usamos el comando --network para agregar un contenedor en una red diferente a la red predeterminada.

Para asegurarse de que su aplicación funcione en la nueva red, asegúrese de que el puerto utilizado esté abierto para las conexiones y que otro proceso no esté utilizando el puerto.

David Mbochi Njonge avatar David Mbochi Njonge avatar

David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.

LinkedIn GitHub