Docker – Docker Host Network – Learning-Ocean

Docker Networking (Host Network)

In this article, we will learn about host networks.

Host Network :

If you use the host network mode for a container, that container’s network interface is in the same namespace as that of the host machine. All the namespaces inside the container are well isolated , only the network namespace is common between the container and the host machine and hence the container does not get its own IP address allocated. 

List all the networks –

gaurav

@learning

-

ocean:

~

$

docker network ls NETWORK ID     NAME      DRIVER    SCOPE 6c51373f78ac   bridge    bridge    local 3a33f83c3663   host      host      local e4ebd601732c   none      null      local gaurav

@learning

-

ocean:

~

$

Create a new ubuntu container with network type as ‘host’

gaurav

@learning

-

ocean:

~

$

docker container run -it --network host

ubuntu:

14.04

bash root

@learning

-

ocean:

/

Now run the ifconfig command on both container and on host and compare the output –

Ifconfig on container-

root

@learning

-

ocean:

/ docker0   Link

encap:

Ethernet  HWaddr

02

:

42

:d6:f2:

05

:

07

          inet

addr:

172.17

.

0.1

 

Bcast:

172.17

.

255.255

 

Mask:

255.255

.

0.0

          inet6

addr:

fe80::

42

:d6ff:fef2:

507

/

64

Scope:

Link           UP BROADCAST MULTICAST 

MTU:

1500

 

Metric:

1

          RX

packets:

9

errors:

0

dropped:

0

overruns:

0

frame:

0

          TX

packets:

18

errors:

0

dropped:

0

overruns:

0

carrier:

0

         

collisions:

0

txqueuelen:

0

          RX

bytes:

506

(

506.0

B)  TX

bytes:

1513

(

1.5

KB) enp0s3    Link

encap:

Ethernet  HWaddr 08

:

00

:

27

:e8:

05

:e4

          inet

addr:

192.168

.

1.11

 

Bcast:

192.168

.

1.255

 

Mask:

255.255

.

255.0

          inet6

addr:

fe80::

a00:

27

ff:fee8:

5e4

/

64

Scope:

Link           UP BROADCAST RUNNING MULTICAST 

MTU:

1500

 

Metric:

1

          RX

packets:

40190

errors:

0

dropped:

0

overruns:

0

frame:

0

          TX

packets:

17790

errors:

0

dropped:

0

overruns:

0

carrier:

0

         

collisions:

0

txqueuelen:

1000

          RX

bytes:

51431164

(

51.4

MB)  TX

bytes:

1564093

(

1.5

MB) lo        Link

encap:

Local Loopback           inet

addr:

127.0

.

0.1

 

Mask:

255.0

.

0.0

          inet6

addr:

::

1

/

128

Scope:

Host           UP LOOPBACK RUNNING 

MTU:

65536

 

Metric:

1

          RX

packets:

306

errors:

0

dropped:

0

overruns:

0

frame:

0

          TX

packets:

306

errors:

0

dropped:

0

overruns:

0

carrier:

0

         

collisions:

0

txqueuelen:

1000

          RX

bytes:

25039

(

25.0

KB)  TX

bytes:

25039

(

25.0

KB) root

@learning

-

ocean:

/

Ifconfig on host-

gaurav

@learning

-

ocean:

~

$

ifconfig docker0   Link

encap:

Ethernet  HWaddr

02

:

42

:d6:f2:

05

:

07

          inet

addr:

172.17

.

0.1

 

Bcast:

172.17

.

255.255

 

Mask:

255.255

.

0.0

          inet6

addr:

fe80::

42

:d6ff:fef2:

507

/

64

Scope:

Link           UP BROADCAST MULTICAST 

MTU:

1500

 

Metric:

1

          RX

packets:

9

errors:

0

dropped:

0

overruns:

0

frame:

0

          TX

packets:

18

errors:

0

dropped:

0

overruns:

0

carrier:

0

         

collisions:

0

txqueuelen:

0

          RX

bytes:

506

(

506.0

B)  TX

bytes:

1513

(

1.5

KB) enp0s3    Link

encap:

Ethernet  HWaddr 08

:

00

:

27

:e8:

05

:e4

          inet

addr:

192.168

.

1.11

 

Bcast:

192.168

.

1.255

 

Mask:

255.255

.

255.0

          inet6

addr:

fe80::

a00:

27

ff:fee8:

5e4

/

64

Scope:

Link           UP BROADCAST RUNNING MULTICAST 

MTU:

1500

 

Metric:

1

          RX

packets:

40190

errors:

0

dropped:

0

overruns:

0

frame:

0

          TX

packets:

17790

errors:

0

dropped:

0

overruns:

0

carrier:

0

         

collisions:

0

txqueuelen:

1000

          RX

bytes:

51431164

(

51.4

MB)  TX

bytes:

1564093

(

1.5

MB) lo        Link

encap:

Local Loopback           inet

addr:

127.0

.

0.1

 

Mask:

255.0

.

0.0

          inet6

addr:

::

1

/

128

Scope:

Host           UP LOOPBACK RUNNING 

MTU:

65536

 

Metric:

1

          RX

packets:

306

errors:

0

dropped:

0

overruns:

0

frame:

0

          TX

packets:

306

errors:

0

dropped:

0

overruns:

0

carrier:

0

         

collisions:

0

txqueuelen:

1000

          RX

bytes:

25039

(

25.0

KB)  TX

bytes:

25039

(

25.0

KB) gaurav

@learning

-

ocean:

~

$

It’s exactly the same. This implies that both of them share the same network configurations.

And as they share the same network configurations, containers can be accessed from the port on the host’s IP address. For example, if you run a container that binds to port 80 and you use host networking, the container’s application is available on port 80 on the host’s IP address.

Let’s demonstrate this with an example-

Create an NGINX container with network type ‘host’ –

gaurav

@learning

-

ocean:

~

$

docker container run -itd --network=host nginx 6923aa43d532a38df73d9ebcac9c79b613aae5470a96cc3bb54d0c761bd35f8c gaurav

@learning

-

ocean:

~

$

docker container ls CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES 6923aa43d532   nginx     

"/docker-entrypoint.…"

   

6

seconds ago   Up

5

seconds             eager_nash gaurav

@learning

-

ocean:

~

$

Inspect the container using inspect command-

 

"Networks"

: {                

"host"

: {                    

"IPAMConfig"

:

null

,                    

"Links"

:

null

,                    

"Aliases"

:

null

,                    

"NetworkID"

:

"3a33f83c366348ed543af33e16be2ff7224bbe067e99e1e732a60e899f7f66e0"

,                    

"EndpointID"

:

"b860ca4fdda3e0732367949cb94fd2eded08a4f2e46715a6c125b1bf336c102f"

,                    

"Gateway"

:

""

,                    

"IPAddress"

:

""

,                    

"IPPrefixLen"

:

0

,                    

"IPv6Gateway"

:

""

,                    

"GlobalIPv6Address"

:

""

,                    

"GlobalIPv6PrefixLen"

:

0

,                    

"MacAddress"

:

""

,                    

"DriverOpts"

:

null

                }             }

Here NetworkID is the same as that of the host id and the IP address is null.

So you can use the host machine IP to access the application without any port mapping.

Host mode networking can be useful to optimize performance, and when you don’t want to do port mappings.

Cannot be duplicated

Host networks are unique and one cannot create 2 host networks. If one is present, docker won’t allow you to create a new one.

gaurav

@learning

-

ocean:

~

$

docker network create -d host test Error response from

daemon:

only one instance of

"host"

network is allowed gaurav

@learning

-

ocean:

~

$

So, if you want to create another host network, just delete the existing one first and then create a new one with the name as ‘host’.