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:
#!/bin/bash IMGLIST= "$(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 2 BASE_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 2 BASE_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 2 APACHE_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 2 FIREFOX_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.sh Stopping all running containers... bf3d37220391 f8ad6f5c354f Removing all stopped containers... bf3d37220391 f8ad6f5c354f Erasing all images... Make sure you are generating image from a Dockerfile or 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.