1

I have a server on my network and I would like to use that one to pretend to be many different servers.

The physical pc is running a Ubuntu server and when connected to the network the dhcp server gives that server ip number 192.168.1.10.

Then inside of that it is fairly easy to start many different docker images and to avoid collisions on ports I can give the services non standard port numbers. However that is not very user friendly for the other users on the network.

It would be more user friendly to expose each docker image with it's own ip-number.

Let's therefore try to describe a typical usecase, where this server would host both a gitlab and a jenkins master.

High level server description

This setup is possible with VirtualBox when the virtual servers uses "bridged adapters", however I'm struggling to do the same but with dockers instead. (Please note that I don't want to use VirtualBox for this since it eats so much resources compared with docker).

From my basic understading of docker, it seems like I need to create a couple of virtual docker networks, however I can't figure out if those should be "bridge", "macvlan" or similar to create this.


What I have tried are for example to create 2 bridged networks in on the host ubuntu server

First we have the default network

enp0s31f6 Link encap:Ethernet  HWaddr 54:bf:64:96:51:57  
          inet addr:192.168.1.10  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fdac:b176:f48b:0:c9bf:3d46:a9f6:8a08/64 Scope:Global
          inet6 addr: fe80::6f2:9b6e:b8a4:225/64 Scope:Link
          inet6 addr: fdac:b176:f48b:0:de76:744c:f42a:75e1/64 Scope:Global
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1356 errors:0 dropped:0 overruns:0 frame:0
          TX packets:842 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:152299 (152.2 KB)  TX bytes:63753 (63.7 KB)
          Interrupt:16 Memory:ef500000-ef520000 

Then I find the one that docker created:

docker0   Link encap:Ethernet  HWaddr 02:42:b1:ff:6e:89  
          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0
          inet6 addr: fe80::42:b1ff:feff:6e89/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:4372 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4665 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:175876 (175.8 KB)  TX bytes:333163 (333.1 KB)

And then I created bridge11 for the .11 and bridge12 for .12

bridge11  Link encap:Ethernet  HWaddr 4a:2b:6b:07:51:70  
          inet addr:192.168.1.11  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

bridge12  Link encap:Ethernet  HWaddr 82:ec:66:9c:f2:b5  
          inet addr:192.168.1.12  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:828 (828.0 B)

However when I try to start a vanilla gitlab docker image with the .12 network

docker run \
    --name gitlab \
    --hostname gitlab \
    --publish 192.168.1.12:443:443 \
    --publish 192.168.1.12:80:80 \
    --publish 192.168.1.12:22:22 \
    --volume /var/gitlab/config:/etc/gitlab:Z \
    --volume /var/gitlab/logs:/var/log/gitlab:Z \
    --volume /var/gitlab/data:/var/opt/gitlab:Z \
    gitlab/gitlab-ce:latest

Then he complains that port 22 is already in use like this:

docker: Error response from daemon: 
  driver failed programming external connectivity on endpoint gitlab 
  (4fda91298a6b9d416cb7e91813d95ad0d35315260881377d1238887724cf3d1f): 
  Error starting userland proxy: listen tcp 192.168.1.12:22: 
  bind: address already in use.
ERRO[0000] error waiting for container: context canceled 

Please note that port 22 is in use on 192.168.1.10 not on 192.168.1.12, and if I use another unused port, that actually works.

However my idea was to be able to reuse things like the standard ssh port on different docker images.

4
  • Try docker-compose and study an example: github.com/mgcrea/docker-compose-gitlab-ce
    – Michael D.
    Commented Feb 16, 2019 at 22:50
  • @MichaelD. Sorry don't know what I'm searching for, the standard docker image exposes web and ssh on the correct ports. I thought that you would compose a new image when you need to modify the image. Or do you think that I need to add modified network configuration into the image, and stop using the bridge network configurations on the host?
    – Johan
    Commented Feb 17, 2019 at 6:51
  • 1
    Use docker network or docker-compose tag networks: docs.docker.com/compose/networking. You build the image/s and deploy the container from the image with the configuration.
    – Michael D.
    Commented Feb 17, 2019 at 9:30
  • Containers fails to bind to 22 port since you are already exposing that port with different container. I believe it is really not needed exposing ssh port, since you can enter containers with docker exec or attach command. You should just expose gitlab and jenkins port, and add iptables rule so other hosts can access your containers from the network.
    – fugitive
    Commented Feb 24, 2019 at 17:28

0

You must log in to answer this question.

Browse other questions tagged .