# Using Networks

## Network creation

With the release of Docker 1.9 you can now manage custom networks.


Here you can see how to create a network named `network1` using
the `bridge` driver

```python
docker_client.create_network("network1", driver="bridge")
```

You can also create more advanced networks with custom IPAM configurations.
For example, setting the subnet to `192.168.52.0/24` and gateway address
to `192.168.52.254`

```python
ipam_pool = docker.utils.create_ipam_pool(
    subnet='192.168.52.0/24',
    gateway='192.168.52.254'
)
ipam_config = docker.utils.create_ipam_config(
    pool_configs=[ipam_pool]
)

docker_client.create_network("network1", driver="bridge", ipam=ipam_config)
```

By default, when you connect a container to an overlay network, Docker also
connects a bridge network to it to provide external connectivity. If you want
to create an externally isolated overlay network, with Docker 1.10 you can
create an internal network.

```python

docker_client.create_network("network1", driver="bridge", internal=True)
```

## Container network configuration

In order to specify which network a container will be connected to, and
additional configuration, use the `networking_config` parameter in
`Client.create_container`. Note that at the time of creation, you can
only connect a container to a single network. Later on, you may create more
connections using `Client.connect_container_to_network`.


```python
networking_config = docker_client.create_networking_config({
    'network1': docker_client.create_endpoint_config(
        ipv4_address='172.28.0.124',
        aliases=['foo', 'bar'],
        links=['container2']
    )
})

ctnr = docker_client.create_container(
    img, command, networking_config=networking_config
)

```

## Network API documentation

### Client.create_networking_config

Create a networking config dictionary to be used as the `networking_config`
parameter in `Client.create_container_config`

**Params**:

* endpoints_config (dict): A dictionary of `network_name -> endpoint_config`
  relationships. Values should be endpoint config dictionaries created by
  `Client.create_endpoint_config`. Defaults to `None` (default config).

**Returns** A networking config dictionary.

```python

docker_client.create_network('network1')

networking_config = docker_client.create_networking_config({
    'network1': docker_client.create_endpoint_config()
})

container = docker_client.create_container(
    img, command, networking_config=networking_config
)
```


### Client.create_endpoint_config

Create an endpoint config dictionary to be used with
`Client.create_networking_config`.

**Params**:

* aliases (list): A list of aliases for this endpoint. Names in that list can
  be used within the network to reach the container. Defaults to `None`.
* links (list): A list of links for this endpoint. Containers declared in this
  list will be [linked](https://docs.docker.com/engine/userguide/networking/work-with-networks/#linking-containers-in-user-defined-networks)
  to this container. Defaults to `None`.
* ipv4_address (str): The IP address of this container on the network,
  using the IPv4 protocol. Defaults to `None`.
* ipv6_address (str): The IP address of this container on the network,
  using the IPv6 protocol. Defaults to `None`.

**Returns** An endpoint config dictionary.

```python
endpoint_config = docker_client.create_endpoint_config(
    aliases=['web', 'app'],
    links=['app_db'],
    ipv4_address='132.65.0.123'
)

docker_client.create_network('network1')
networking_config = docker_client.create_networking_config({
    'network1': endpoint_config
})
container = docker_client.create_container(
    img, command, networking_config=networking_config
)
```
### docker.utils.create_ipam_config

Create an IPAM (IP Address Management) config dictionary to be used with
`Client.create_network`.


**Params**:

* driver (str): The IPAM driver to use. Defaults to `'default'`.
* pool_configs (list): A list of pool configuration dictionaries as created
  by `docker.utils.create_ipam_pool`. Defaults to empty list.

**Returns** An IPAM config dictionary

```python
ipam_config = docker.utils.create_ipam_config(driver='default')
network = docker_client.create_network('network1', ipam=ipam_config)
```

### docker.utils.create_ipam_pool

Create an IPAM pool config dictionary to be added to the `pool_configs` param
in `docker.utils.create_ipam_config`.

**Params**:

* subnet (str): Custom subnet for this IPAM pool using the CIDR notation.
  Defaults to `None`.
* iprange (str): Custom IP range for endpoints in this IPAM pool using the
  CIDR notation. Defaults to `None`.
* gateway (str): Custom IP address for the pool's gateway.
* aux_addresses (dict): A dictionary of `key -> ip_address` relationships
  specifying auxiliary addresses that need to be allocated by the
  IPAM driver.

**Returns** An IPAM pool config dictionary

```python
ipam_pool = docker.utils.create_ipam_pool(
    subnet='124.42.0.0/16',
    iprange='124.42.0.0/24',
    gateway='124.42.0.254',
    aux_addresses={
        'reserved1': '124.42.1.1'
    }
)
ipam_config = docker.utils.create_ipam_config(pool_configs=[ipam_pool])
network = docker_client.create_network('network1', ipam=ipam_config)
```
