À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:
- Mac OS X 10.11.4
- VirtualBox v5.0.16
- Vagrant v1.8.1
- Docker Toolbox v1.10.3
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 Type
Vagrantfile
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 docker1
e 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 host1
vagrant 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 eth1
se 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.local
exit 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