Roteamento entre contAiners Docker usando GNS3

A ideia é rotear (IPv4 e IPv6) entre containers Dockers usando GNS3 e usá-los como hosts finais em vez de máquinas virtuais.

Os contêineres usam apenas os recursos necessários para o aplicativo que executam. Usam uma imagem do sistema de arquivos do host e podem compartilhar o mesmo ambiente (binários e bibliotecas).

Por outro lado, as máquinas virtuais requerem sistemas operacionais inteiros, com memória RAM e espaço em disco reservados.

Máquinas virtuais x contêineres Docker

Se não está familiarizado com o Docker, recomendo que dê uma olhada na excelente introdução curta abaixo   e algumas explicações adicionais do site do Docker . :

Por enquanto, o Docker tem funcionalidades de rede limitadas. É aqui que a tubulação vem ao resgate. Pipework permite configurações de rede mais avançadas, como adição de novas interfaces, IPs de sub-redes diferentes e gateways definidos e muito mais …

Para ser capaz de rotear entre os contêineres usando sua própria topologia GNS3 (o céu é o limite!), O pipework permite criar uma nova interface dentro de um contêiner em execução, conectá-lo a uma interface de ponte de host, dar um IP / máscara em qualquer sub-rede que deseja e defina um gateway padrão apontando para um dispositivo no GNS3. Consequentemente, todo o tráfego de saída do contêiner é roteado para sua topologia GNS3.

Conexão GNS3 para Docker um contêiner

Como a tubulação se conecta expõe a rede de contêineres

Requisitos do laboratório:

Docker:
https://docs.docker.com/installation/ubuntulinux/#docker-maintained-package-installation
Pipework:

sudo bash -c "curl https://raw.githubusercontent.com/jpetazzo/pipework/master/pipework\> /usr/local/bin/pipework"

Para cada contêiner, geraremos uma imagem docker, executaremos um contêiner com um terminal interativo e definiremos os parâmetros de rede (IP e gateway padrão).

Para demonstrar a flexibilidade do docker, usaremos 4 contêineres do docker com 4 sub-redes diferentes:

Duas instâncias do docker container baseadas em uma imagem especial mínima do ubuntu modificada para docker ( https://github.com/phusion/baseimage-docker ). Além disso (como imagem separada), instalamos algumas ferramentas do Linux como wget, iperf, inetutils-traceroute, iputils-tracepath, mtr, dnsutils, sipp, pjsua. ( https://github.com/AJNOURI/Docker-files/blob/master/phusion-dockerbase )Uma instância do docker container baseada na primeira imagem construída (1), sobre a qual (como imagem separada) instalamos o apache ( https://github.com/AJNOURI/Docker-files/blob/master/apache-docker )Uma instância do docker container baseada em um ubuntu simples, sobre a qual (como imagem separada) instalamos o firefox ( https://github.com/AJNOURI/Docker-files/blob/master/firefox-docker )

É assim que os contêineres são criados para este laboratório:https://wpcomwidgets.com/?width=626&height=470&src=http%3A%2F%2Fhpnouri.free.fr%2Fdocker%2Flab1%2Fconfig-listing1-common-cb.swf&_tag=gigya&_hash=75ab7468cc9547ca9b375fd1f06a5d18

 .

 .

Aqui está o fluxo de trabalho geral para cada contêiner.

1- construir imagem do Dockerfile ( https://docs.docker.com/reference/builder/ ):Uma imagem é somente leitura.sudo docker build -t <image-tag>.Ou (docker v1.5) sudo docker build -t <image-tag> <DockerfileLocation>2-  Execute a imagem construída:Gerar e executar um contêiner gravável com console interativo.Os parâmetros deste comando podem diferir ligeiramente para cada contêiner de GUI.sudo docker run -t -i <id da imagem de ` sudo docker images` > / bin / bash3- Defina a rede do contêiner:Crie uma interface de ponte de host e vincule a uma nova interface dentro do contêiner, atribua a ela um IP e um novo gateway padrão.sudo pipework <bridge> -i <int> <container if from ` sudo docker ps` > <ip / mask> @ <gateway-ip

Para evitar a manipulação de ids de imagem e de contêiner para cada uma das imagens e contêineres, uso um script bash para criar e executar todos os contêineres automaticamente:

https://github.com/AJNOURI/DockerVPC/blob/master/startvpc.sh
#!/bin/bashIMGLIST="$(sudo docker images | grep mybimage | awk '{ print $1; }')"[[ $IMGLIST =~ "mybimage" ]] && sudo docker build -t mybimage -f phusion-dockerbase .[[ $IMGLIST =~ "myapache" ]] && sudo docker build -t myapache -f apache-docker .[[ $IMGLIST =~ "myfirefox" ]] && sudo docker build -t myfirefox -f firefox-docker . BASE_I1="$(sudo docker images | grep mybimage | awk '{ print $3; }')"lxterminal -e "sudo docker run -t -i --name baseimage1 $BASE_I1 /bin/bash"sleep 2BASE_C1="$(sudo docker ps | grep baseimage1 | awk '{ print $1; }')"sudo pipework br4 -i eth1 $BASE_C1 192.168.44.1/24@192.168.44.100  BASE_I2="$(sudo docker images | grep mybimage | awk '{ print $3; }')"lxterminal -e "sudo docker run -t -i --name baseimage2 $BASE_I2 /bin/bash"sleep 2BASE_C2="$(sudo docker ps | grep baseimage2 | awk '{ print $1; }')"sudo pipework br5 -i eth1 $BASE_C2 192.168.55.1/24@192.168.55.100  APACHE_I1="$(sudo docker images | grep myapache | awk '{ print $3; }')"lxterminal -t "Base apache" -e "sudo docker run -t -i --name apache1 $APACHE_I1 /bin/bash"sleep 2APACHE_C1="$(sudo docker ps | grep apache1 | awk '{ print $1; }')"sudo pipework br6 -i eth1 $APACHE_C1 192.168.66.1/24@192.168.66.100  lxterminal -t "Firefox" -e "sudo docker run -ti --name firefox1 --rm -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix myfirefox"sleep 2FIREFOX_C1="$(sudo docker ps | grep firefox1 | awk '{ print $1; }')"sudo pipework br7 -i eth1 $FIREFOX_C1 192.168.77.1/24@192.168.77.100

E acabamos com os seguintes conainers:

Recipientes, imagens e dependências.


GNS3

Tudo que precisa fazer é vincular uma nuvem separada a cada interface de ponte (br4, br5, br6 e br7) criada pela tubulação e, em seguida, conectá-los ao segmento apropriado em sua topologia.

Topologia de laboratório

Observe que a topologia GNS3 já está configurada para IPv6, portanto, assim que iniciar os roteadores, os containers Docker receberão endereços IPv6 dos roteadores por meio de SLAAC (Stateles Auto Configuration), o que os torna acessíveis por IPv6.

Aqui está um vídeo sobre como iniciar o laboratório:


Limpar

Para limpar seu host de todos os contêineres e imagens, use o seguinte script bash:

https://github.com/AJNOURI/Docker-files/blob/master/clean_docker.sh que usa os comandos docker abaixo:

Pare de executar contêineres:sudo docker stop <id do contêiner de ` sudo docker ps` >Remova o contêiner parado:sudo docker rm <id do contêiner de ` sudo docker ps -a` >Remova a imagem:sudo docker rmi <id de imagem de ` sudo docker images` >
sudo ./clean_docker.shStopping all running containers...bf3d37220391f8ad6f5c354fRemoving all stopped containers...bf3d37220391f8ad6f5c354fErasing all images...Make sure you are generating image from a Dockerfileor have pushed your images to DockerHub.*** Do you want to continue? No

Respondi “Não”, porque ainda preciso dessas imagens para gerar containers, pode responder “Sim” à pergunta se não precisar mais das imagens ou se precisar alterá-las.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *