Shipyard é uma aplicação desenvolvida pela comunidade de utilizadores de Docker. Ela pode ser uma boa alternativa a Swarm e dispõe de uma interface gráfica para a gestão de um cluster de máquinas Docker, permitindo a sequencialização das tarefas bem como a alocação de recursos por container dentro de uma pool de recursos físicos. vamos, num primeiro tempo, ocupar-nos da máquina master e de gerar as chaves e certificados que os permitirão autenticar nas diferentes máquinas e, além disso, poder ter trocas de dados seguras para evitar que os nodes possa, ser controlados por uma pessoa indesejada (apenas a ou as máquinas que disponham de certificados se poderão ligar aos clientes Docker das nossas máquinas remotas).
Para atingir este objetivo, pode ler a documentação oficial:
https://docs.docker.com/articles/https/
Uma vez gerados os certificados, vamos passar às máquinas cliente (nodes). No nosso exemplo, o nosso cluster serão composto por 3 maquinas (IP : 1.1.1.1, 2.2.2.2 e 3.3.3.3) .
Vamos copiar as chaves e os certificados para a pasta /etc/docker/certs/ de cada um dos nossos nodes, através do seguinte comando:
scp ca.pem server-cert.pem server-key.pem user@1.1.1.1:/etc/docker/certs/
scp ca.pem server-cert.pem server-key.pem user@2.2.2.2:/etc/docker/certs/
scp ca.pem server-cert.pem server-key.pem user@3.3.3.3:/etc/docker/certs/
Para maior segurança, dentro do cluster, vamos implementar regras no IPtables da máquina master e nos nodes. Encontrará um exemplo das regras IPtables que é possível aplicar
em cada um dos nodes :
Adicionamos as seguintes regras IPtables :
# Manter as ligações estabelecidas
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# Autorizar loopback
iptables -t filter -A INPUT -i lo -j ACCEPT
# ICMP (Ping)
iptables -t filter -A INPUT -p icmp -j ACCEPT
# SSH In
iptables -t filter -A INPUT -s 4.4.4.4 -p tcp --dport 22 -j ACCEPT
# /!\ ATENÇÃO: verifique se o endereço IP introduzido corresponde ao endereço IP da máquina master, por exemplo, pois será a única que deverá poder ligar-se por SSH aos nodes.
# HTTP In
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
# SSL In
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
# Docker In
iptables -t filter -A INPUT -s 4.4.4.4 -p tcp --dport 2375 -j ACCEPT
# /!\ ATENÇÃO: verifique se o endereço IP introduzido corresponde ao endereço IP da máquina master, pois será a única que deverá poder ligar-se à porta 2375.
# Impedir todas as ligações de entrada
iptables -P INPUT DROP
iptables -P FORWARD DROP
Uma ve definidas as regras, será necessário gravá-las para que se executem sempre que há um reboot através do seguinte comando:
apt-get install iptables-persistent
E vamos selecionar "sim" quando for perguntado se é necessário registar as regras IPtables IPv4.
/!\ ATENÇÃO: aconselhamos que verifique o bom funcionamento das suas regras antes de as gravar. Em caso de problema, um simples reboot das suas máquinas permitirá efetuar um reset, se as regras não foram previamente gravadas e apenas foram aplicadas..
A qualquer momento será possível adicionar regras IP tables e gravá-las com o comando:
iptables-persistent save
No servidor "master" :
Vamos adicionar as regras IPTABLES :
# Conservar as ligações estabelecidas
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# Autorizar loopback
iptables -t filter -A INPUT -i lo -j ACCEPT
# ICMP (Ping)
iptables -t filter -A INPUT -p icmp -j ACCEPT
# Shipyard web In
iptables -t filter -A INPUT -s « IP público da sua ligação ou da sua VPN » -p tcp --dport 8080 -j ACCEPT
# /!\ ATENÇÃO: verifique que o endereço IP introduzido é realmente o da sua ligação á Internet ou da sua VPN, pois serão os únicos a poder ligar-se à interface de Shipyard.
# SSH In
iptables -t filter -A INPUT -s « IP público da sua ligação ou da sua VPN » -p tcp --dport 22 -j ACCEPT
# /!\ ATENÇÃO: verifique que o endereço IP introduzido é realmente o endereço IP da sua ligação ou da sua VPN, pois será o único a poder ligar-se através de SSH ao servidor "Master".
# Impedir todas as ligações de "entrada"
iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
Uma vez definidas das regras, vamos gravá-las para que sejam sempre "carregadas" quando se faz um reboot ao servidor:
apt-get install iptables-persistent
E vamos selecionar "sim/yes" quando nos for perguntado se é necessário gravas as regras IPTables IPv4.
/!\ ATENÇÃO: aconselhamos vivamente a que faça uma verificação prévia do funcionamento das regras antes da gravação Assim, em caso de problema, basta fazer um reboot ao servidor para que seja efetuado o "re-set" das regras.
A qualquer momento poderá adicionar regras IPtables e gravá-las através do seguinte comando:
iptables-persistent save
Depois de termos instalado Docker nas 3 máquinas, é igualmente possível dispor de instâncias RunAbove aprovisionadas por "Docker machine". Para mais informações, poderá consultar este guia). Vamos agora ativar a "escuta" da daemon Docker numa porta (por exemplo, a porta 2375, que é a porta padrão oficial atribuída pela IANA) para que as máquinas possam dialogar com a máquina "master". Para esse fim, vamos começar por parar a execução de Docker em cada uma das máquinas através do seguinte comando:
service docker stop
De seguida vamos para a diretoria onde estão os nossos certificados:
cd /etc/docker/
E depois vamos iniciar a execução de Docker utilizando a comunicação na porta 2375 com autenticação TLS executando o seguinte comando em cada um dos nodes:
docker -d --tlsverify --tlscacert=/etc/docker/certs/ca.pem --tlscert=/etc/docker/certs/server-cert.pem --tlskey=/etc/docker/certs/server-key.pem -H=0.0.0.0:2375 --label name=node1
docker -d --tlsverify --tlscacert=/etc/docker/certs/ca.pem --tlscert=/etc/docker/certs/server-cert.pem --tlskey=/etc/docker/certs/server-key.pem -H=0.0.0.0:2375 --label name=node2
docker -d --tlsverify --tlscacert=/etc/docker/certs/ca.pem --tlscert=/etc/docker/certs/server-cert.pem --tlskey=/etc/docker/certs/server-key.pem -H=0.0.0.0:2375 --label name=node3
/!\ ATENÇÃO: estas opções não são persistentes: se a máquina for alvo de reboor será necessário executar novamente Docker com estas opções. O ideal será definir estas opções na variável de ambiente $DOCKER_OPTS. Em Ubuntu, podemos facilmente fazer a configuração em /etc/default/docker
Notaremos a presença de « --label name=node1 », o que nos vai permitir atribuir um nome a cada um dos nodes com uma "label" única (que será útil para iniciar a execução de um container Docker num node em particular através de regras pré-definidas).
Vamos, de seguida, passar à instalação de Shipyard na máquina "master".
Começamos por iniciar uma instância data volume RethinkDB
docker run -it -d --name shipyard-rethinkdb-data --entrypoint /bin/bash shipyard/rethinkdb -l
Vamos iniciar RethinkDB utilizando o data volume previamente criado:
docker run -it -P -d --name shipyard-rethinkdb --volumes-from shipyard-rethinkdb-data shipyard/rethinkdb
/!\ ATENÇÃO: se o su servidor é diretamente acessível através da Internet, tenha em consideração que RethinkDB vai ficar à escuta na portas 49153 (instância local), 49154 (cluster) e 49155 (interface web).
Vamos, de seguida, iniciar o controlador Shipyard, ligando-o à base de dados (através de --link shipyard-rethinkdb:rethinkdb):
docker run -it -p 8080:8080 -d --name shipyard --link shipyard-rethinkdb:rethinkdb shipyard/shipyard
Shipyard irá, de forma padrão, criar um utilizador "admin" que terá a palavra-passe "shipyard".
Antes de aceder à interface web, é aconselhável proceder à alteração da palavra-passe de acesso a Shipyard. Começamos por criar um container que nos permitirá acesso à CLI de Shipyard:
docker run -it shipyard/shipyard-cli
E depois autenticamo-nos :
shipyard cli> shipyard login
URL:http://<VOTRE_MACHINE>:8000
Username: admin
Password: shipyard
Puis on change le mot de passe
shipyard cli> shipyard change-password
Password: <VOTRE_MOT_DE_PASSE>
Confirm: <ENCORE>
Uma vez realizada esta operação, será necessário utilizar ctrl-d para sair da CLI.
Poderá agora aceder à interface de Shipyard através de http://
Uma vez autenticado no sistema, irá poder proceder ao registo dos motores (os nodes) através da interface web de Shipyard. Isso faz-se na secção "engines":
Não se esqueça de efetuar uma operação de copiar/colar dos seus certificados de segurança gerados previamente (preencha "SSL certificate", "SSL key" e "CA certificate" ). Deve ser efetuada a operação para cada um dos seus nodes (defina uma label única para cada um dos nodes)
É igualmente possível adicionar engines através da CLI. Para o fazer, é necessário executar o container CLI de Shipyard:
docker run -it -v /etc/docker/certs/:/home/ shipyard/shipyard-cli
A parte "-v /etc/docker/certs/:/home/" vai permitir criar uma diretoria comum entre a nossa máquina host (a máquina master) e o container CLI de Shipyard que está em execução nesta máquina para que o container possa aceder aos certificados gerados previamente.
Vamo-nos autenticar e estabelecer ligação:
shipyard cli> shipyard login
URL:http://<VOTRE_MACHINE>:8000
Username: admin
Password: votre_mot_de_passe
E executar de seguida:
shipyard add-engine --id node1 --addr https://1.1.1.1:2375 --label node1 --ssl-cert /home/client-cert.pem --ssl-key /home/client-key.pem --ca-cert /home/ca.pem
Quando esta operação tiver sido efetuada, vamos utilizar ctrl+d para sair da CLI.
Na secção "containers" iremos poder agora visualizar e gerir todos os containers criados nos diferentes nodes:

Ao clicar em "deploy" vamos poder iniciar a execução de containers em todos os nodes ou em apenas alguns nodes em particular (selecionando a label que corresponde aos nodes nos quais desejamos executar o container):
Disporá agora de um sistema de "orquestração" das suas diferentes máquinas Docker e poderá provisionar as suas aplicações/containers dentro do seu cluster de forma simples e rápida tendo ao seu dispor uma interface gráfica. Se desejar testar Docker, não esqueça o teste Alpha disponível em https://labs.runabove.com/docker/. Recentemente disponibilizamos um template Ubuntu 14.04 com Docker (pré-instalado) em VPS Cloud e VPS Classic (disponível para todos os modelos VPS exceto o modelo VPS Classic 1 que não dispõe de espaço de disco suficiente). Este template permitirá obter diretamente uma máquina pronta a executar containers, beneficiando das vantagens inerentes a um servidor VPS OVH.