Docker – Crie uma ponte e uma rede compartilhada

Às vezes eu quero usar contêineres Docker como VMs regulares, criando uma ponte em um host Docker, tendo contêineres na mesma sub-rede e, em seguida, logando neles através da porta 22. (Sem encaminhamento de porta, por favor.) Então, aqui está como fazer isso.

Neste exemplo, eu uso o Vagrant e o VirtualBox no meu MacBook e crio containers com endereços IP mostrados na tabela abaixo. Depois de seguir essas etapas, você poderá estender a ideia para sua rede local.

|Host                | IP Address     |
|:-------------------|:---------------|
| MacBook | 192.168.33.1 |
| host1(VirtualBox) | 192.168.33.10 |
| container1 | 192.168.33.11 |
| container2 | 192.168.33.12 |
| container3 | 192.168.33.13 |

Pré-requisitos

Este exemplo é feito com estes:

Criando um Vagrantfile

Você pode querer ir com , mas é importante mudar a rede para fazer a ponte de rede funcionar. É fácil fazer isso, que se parece com isto:docker-machine create -d virtualbox <hostname>Adapter TypeVagrantfile

Vagrant.configure(2) do |config|
config
.vm.box = "ubuntu/trusty64"
config
.vm.hostname = "host1"
config
.vm.network "private_network", ip: "192.168.33.10"

config
.vm.provider "virtualbox" do |v|
v
.memory = "2048"
# Change the network adapter type and promiscuous mode
v
.customize ['modifyvm', :id, '--nictype1', 'Am79C973']
v
.customize ['modifyvm', :id, '--nicpromisc1', 'allow-all']
v
.customize ['modifyvm', :id, '--nictype2', 'Am79C973']
v
.customize ['modifyvm', :id, '--nicpromisc2', 'allow-all']
end

# Install bridge-utils
config
.vm.provision "shell", inline: <<-SHELL
apt
-get update
apt
-get -y install bridge-utils
SHELL

end

Criar uma máquina Docker

# Create a VM
$ vagrant up


# Setup the VM as your Docker machine
$ docker
-machine create
--driver "generic"
--generic-ip-address 192.168.33.10
--generic-ssh-user vagrant
--generic-ssh-key .vagrant/machines/default/virtualbox/private_key
--generic-ssh-port 22
host1

Criação de uma ponte docker1e rede compartilhadashared_nw

# Log in to the VM
$ vagrant ssh


# Delete the IP address from eth1
$ sudo ip addr del
192.168.33.10/24 dev eth1

# Create "shared_nw" with a bridge name "docker1"
$ sudo docker network create

--driver bridge
--subnet=192.168.33.0/24
--gateway=192.168.33.10
--opt "com.docker.network.bridge.name"="docker1"
shared_nw


# Add docker1 to eth1
$ sudo brctl addif docker1 eth1

Nota: Você pode querer usar para fazer login no host1, mas precisa usar em vez disso, porque 192.168.33.10 será excluído uma vez no processo.docker-machine ssh host1vagrant ssh

Contêineres em execução

Volte para o seu MacBook e inicie os contêineres:

$ eval $(docker-machine env host1) # Setup the environment
$ docker run
--name container1 --net shared_nw --ip 192.168.33.11 -dt ubuntu
$ docker run
--name container2 --net shared_nw --ip 192.168.33.12 -dt ubuntu
$ docker run
--name container3 --net shared_nw --ip 192.168.33.13 -dt ubuntu

E agora você deve conseguir acessar os endereços IP do contêiner:

$ ping -c 3 192.168.33.11
$ ping
-c 3 192.168.33.12
$ ping
-c 3 192.168.33.13

Tornando a configuração de rede permanente

Neste ponto, a ponte de rede será desconectada eth1se você
reiniciar a máquina. Portanto, aqui estão mais duas coisas para tornar a configuração
permanente.

Atualização como esta:/etc/network/interfaces

auto eth1
iface eth1 inet manual

pre
-up ifconfig $IFACE up
post
-down ifconfig $IFACE down

E adicione o seguinte comando em (antes ):/etc/rc.localexit 0

brctl addif docker1 eth1

Limpando

Depois de terminar seu teste, você pode remover os contêineres e a VM:

$ docker stop $(docker ps -aq) # Stop all containers
$ docker rm $
(docker ps -aq) # Remove all containers
$ docker
-machine rm host1 # Remove host1 from your machine list
$ vagrant destroy
# Remove the VM

Para onde ir a seguir

Você pode tentar encaixar um serviço daemon SSH .

Referências

Os links a seguir são realmente úteis para entender a rede do Docker e altamente recomendados.
* Docker – Configuração de rede
* Docker – criação de rede
* Odd Bits – Quatro maneiras de conectar um contêiner docker a uma rede local
* Github – jpetazzo / pipework
* Stack Overflow – Atribuir IP estático ao contêiner Docker