# Define y administra redes en Docker Compose




Las redes ayudan a los servicios a comunicarse entre sí. De forma predeterminada, Compose configura una única red para tu aplicación. Cada contenedor de un servicio se une a la red predeterminada y es accesible por otros contenedores en esa red, además de ser detectable por el nombre del servicio. El elemento de nivel superior `networks` te ayuda a configurar redes con nombre que se pueden reutilizar en múltiples servicios.


Para usar una red en varios servicios, debes otorgar acceso explícitamente a cada servicio utilizando el atributo [networks](/reference/compose-file/networks/services/) dentro del elemento de nivel superior `services`. El elemento de nivel superior `networks` tiene una sintaxis adicional que proporciona un control más detallado.

## Ejemplos

### Ejemplo básico

En el siguiente ejemplo, en tiempo de ejecución, se crean las redes `front-tier` y `back-tier` y el servicio `frontend` se conecta a las redes `front-tier` y `back-tier`.

```yml
services:
  frontend:
    image: example/webapp
    networks:
      - front-tier
      - back-tier

networks:
  front-tier:
  back-tier:
```

### Ejemplo avanzado

```yml
services:
  proxy:
    build: ./proxy
    networks:
      - frontend
  app:
    build: ./app
    networks:
      - frontend
      - backend
  db:
    image: postgres:18
    networks:
      - backend

networks:
  frontend:
    # Especifica opciones del controlador
    driver: bridge
    driver_opts:
      com.docker.network.bridge.host_binding_ipv4: "127.0.0.1"
  backend:
    # Usa un controlador personalizado
    driver: custom-driver
```

Este ejemplo muestra un archivo de Compose que define dos redes personalizadas. El servicio `proxy` está aislado del servicio `db` porque no comparten ninguna red en común. Solo `app` puede comunicarse con ambos.

## La red predeterminada

Cuando un archivo de Compose no declara redes explícitas, Compose utiliza una red implícita `default`. Compose conecta los servicios sin una declaración explícita de [`networks`](/reference/compose-file/networks/services/#networks) a esta red `default`:

```yml
services:
  some-service:
    image: foo
```

Este ejemplo es equivalente a:

```yml
services:
  some-service:
    image: foo
    networks:
      default: {}
networks:
  default: {}
```

Puedes personalizar la red `default` con una declaración explícita:

```yml
networks:
  default:
    name: a_network # Usa un nombre personalizado
    driver_opts: # Pasa opciones al controlador para la creación de la red
      com.docker.network.bridge.host_binding_ipv4: 127.0.0.1
```

Para ver las opciones, consulta la [documentación de Docker Engine](https://docs-docker.esdocu.com/engine/network/drivers/bridge/#options).

## Atributos

### `attachable`

Si `attachable` se establece en `true`, los contenedores independientes podrán conectarse a esta red, además de los servicios. Si un contenedor independiente se conecta a la red, puede comunicarse con los servicios y otros contenedores independientes que también estén conectados a ella.

```yml
networks:
  mynet1:
    driver: overlay
    attachable: true
```

### `driver`

`driver` especifica qué controlador se debe usar para esta red. Compose devuelve un error si el controlador no está disponible en la plataforma.

```yml
networks:
  db-data:
    driver: bridge
```

Para obtener más información sobre los controladores y las opciones disponibles, consulta [Controladores de red](/engine/network/drivers/).

### `driver_opts`

`driver_opts` especifica una lista de opciones como pares clave-valor para pasar al controlador. Estas opciones dependen del controlador.

```yml
networks:
  frontend:
    driver: bridge
    driver_opts:
      com.docker.network.bridge.host_binding_ipv4: "127.0.0.1"
```

Consulta la [documentación de los controladores de red](/engine/network/) para obtener más información.

### `enable_ipv4`




`enable_ipv4` se puede usar para desactivar la asignación de direcciones IPv4.

```yml
networks:
  ip6net:
    enable_ipv4: false
    enable_ipv6: true
```

### `enable_ipv6`

`enable_ipv6` habilita la asignación de direcciones IPv6.

```yml
networks:
  ip6net:
    enable_ipv6: true
```

### `external`

Si se establece en `true`:

- `external` especifica que el ciclo de vida de esta red se administra fuera del de la aplicación. Compose no intenta crear estas redes y devuelve un error si no existen.
- Todos los demás atributos, excepto el nombre, son irrelevantes. Si Compose detecta cualquier otro atributo, rechaza el archivo de Compose por considerarlo inválido.

En el siguiente ejemplo, `proxy` es la puerta de enlace al mundo exterior. En lugar de intentar crear una red, Compose consulta a la plataforma por una red existente llamada `outside` y conecta los contenedores del servicio `proxy` a ella.

```yml
services:
  proxy:
    image: example/proxy
    networks:
      - outside
      - default
  app:
    image: example/app
    networks:
      - default

networks:
  outside:
    external: true
```

### `ipam`

`ipam` especifica una configuración de IPAM personalizada. Este es un objeto con varias propiedades, cada una de las cuales es opcional:

- `driver`: Controlador IPAM personalizado, en lugar del predeterminado.
- `config`: Una lista con cero o más elementos de configuración, cada uno de los cuales contiene:
  - `subnet`: Subred en formato CIDR que representa un segmento de red.
  - `ip_range`: Rango de direcciones IP desde el cual asignar las IP de los contenedores.
  - `gateway`: Puerta de enlace IPv4 o IPv6 para la subred principal.
  - `aux_addresses`: Direcciones IPv4 o IPv6 auxiliares utilizadas por el controlador de red, representadas como un mapeo de nombre de host a IP.
- `options`: Opciones específicas del controlador como un mapeo clave-valor.

```yml
networks:
  mynet1:
    ipam:
      driver: default
      config:
        - subnet: 172.28.0.0/16
          ip_range: 172.28.5.0/24
          gateway: 172.28.5.254
          aux_addresses:
            host1: 172.28.1.5
            host2: 172.28.1.6
            host3: 172.28.1.7
      options:
        foo: bar
        baz: "0"
```

### `internal`

Por defecto, Compose proporciona conectividad externa a las redes. `internal`, cuando se establece en `true`, te permite crear una red aislada externamente.

### `labels`

Añade metadatos a los contenedores usando `labels`. Puedes usar un array o un diccionario.

Se recomienda utilizar la notación DNS inversa para evitar que las etiquetas entren en conflicto con las utilizadas por otro software.

```yml
networks:
  mynet1:
    labels:
      com.example.description: "Financial transaction network"
      com.example.department: "Finance"
      com.example.label-with-empty-value: ""
```

```yml
networks:
  mynet1:
    labels:
      - "com.example.description=Financial transaction network"
      - "com.example.department=Finance"
      - "com.example.label-with-empty-value"
```

Compose establece las etiquetas `com.docker.compose.project` and `com.docker.compose.network`.

### `name`

`name` establece un nombre personalizado para la red. El campo de nombre se puede usar para hacer referencia a redes que contienen caracteres especiales. El nombre se usa tal cual y no tiene como prefijo el nombre del proyecto.

```yml
networks:
  network1:
    name: my-app-net
```

También se puede utilizar junto con la propiedad `external` para definir la red de la plataforma que Compose debe recuperar, normalmente mediante el uso de un parámetro para que el archivo de Compose no tenga que codificar valores específicos del entorno de ejecución:

```yml
networks:
  network1:
    external: true
    name: "${NETWORK_ID}"
```

## Recursos adicionales

Para obtener más ejemplos, consulta [Redes en Compose](/compose/how-tos/networking/).

