Instalando WordPress num Cluster de Docker Swarm

O Docker Swarm é o gerenciador de containers nativo do Docker. Ele suporta a manutenção de diversos nodos para a gestão dos containers. Alguns nodos são chamados de managers, responsável por centralizar a comunicação e suportar comandos administrativos. Já outros nodos são workers que possuem apenas a responsabilidade de distribuir a carga de trabalho. A escolha sobre como deve ser a carga de trabalho fica, a princípio, com o próprio docker Swarm.

Nesse sentido esse artigo mostrará como criar um cluster swarm, adicionar nós (administrativos e workers), criar redes para swarm, instalar o mysql e o wordpress em cluster. O artigo não se aprofundará em criação de volumes compartilhados ou regras de firewall, mas são pontos que devem ser considerados num uso real em produção.

1 – Como iniciar um cluster de Docker Swarm

Para criar um ambiente para suportar um cluster de docker swam é necessário ter diversas maquinas físicas ou virtuais. Para estudos eu sugiro trabalhar com o https://labs.play-with-docker.com/ que oferece um ambiente para criação de até 5 maquinas para serem utilizadas por até 4 horas.

Após entrar no ambiente clique em ‘Add new instance’ para criar os nodos. Para meu teste criei 5 nodos. Os dois primeiros nodos serão nodos administrativos e os outros 3 serão nodos worker. Para criar o cluster de docker na primeira maquina (node1) basta executar a seguinte linha de comando. Após fazer isso essa mesma máquina já se tornará um nodo administrativo (manager) do docker:

docker swarm init --advertise-addr 192.168.0.13 # é necessário passar o IP da própria maquina node1

docker node ls # Esse comando exibe todos os nodos instalados no cluster

2 – Como adicionar nodos administrativos ao Swarm

Alguns comandos só são disponíveis nos nodos administrativos, por exemplo: docker node, docker service e docker swarm (com algumas exceções). Ao criar mais nodos administrativos mais maquinas terão acesso a esses comandos, portanto, tenha uma ambiente segudo para tal.

A primeira coisa a ser feita para adicionar um novo nodo é descobrir qual é o token de acesso. Para descobrir o token abra o nodo administrativo e execute a seguinte linha de comando. Ela exibirá uma nova linha de comando que deve ser executada no novo nodo: execute-a no nodo que deseja que se torne node manager.

# Execute essa linha de comando no manager
# A linha de comando seguinte será exibida para você com um token alterado
docker swarm join-token manager

# Execute essa linha de comando na maquina que deverá se tornar manager
# Você receberá um outro token. A linha de comando, em específico, exibida aqui não tem como funcionar em seu ambiente
docker swarm join --token SWMTKN-1-5dke8fso085man4qeivirfno9n9cwsmpiikudvwzmbqnto9f2v-cc512ovkd1w0qijfqt5jhoo2b 192.168.0.13:2377

# Esse comando exibe todos os nodos instalados no cluster
# Execute esse comando em cada um dos nós administrativos
docker node ls

3 – Como adicionar nodos worker ao Swarm

A criação de novos worker é muito semelhante a criação de nodos administrativos, mas o comando a ser executado no manager é ligeiramente diferente. Execute as seguintes linhas:


# Execute essa linha de comando no manager (em qualquer um dos managers)
# A linha de comando seguinte será exibida para você com um token alterado
docker swarm join-token worker

# Execute essa linha de comando nas maquinas que deverão se tornar worker
# Você receberá um outro token. A linha de comando, em específico, exibida aqui não tem como funcionar em seu ambiente
docker swarm join --token SWMTKN-1-5dke8fso085man4qeivirfno9n9cwsmpiikudvwzmbqnto9f2v-0yx2711zq8k3eagy57vw1gzt6 192.168.0.13:2377

# Esse comando exibe todos os nodos instalados no cluster
# Execute esse comando em um dos nós administrativos
docker node ls

4 – Como criar uma rede overlay

As redes overlay são exclusivas para o Docker no modo swarm. Ela serve para colocar maquinas em nodos distintos numa mesma rede. Podemos dizer que a rede overlay está para o swarm assim como a rede bridge está para o docker normal. No cenário proposto nesse artigo vamos ter uma maquina com MySQL e uma maquina com WordPress, ambas precisam estar na mesma rede, por isso a explicação sobre o overlay. Para criar uma rede overlay basta:

# Esse comando cria a rede
docker network create -d overlay minharede

# Esse comando lista todas as redes configuradas
# Esse comando funciona corretamente nas maquinas administrativas (manager) 
#   nos workers a rede 'minharede' só estará disponível 
#   se um serviço estiver instalado nela com essa rede
docker network ls

5 – Como criar um serviço para o MySQL no docker

Para ambientes de produção é obrigatório que o volume do MySQL esteja mapeado na maquina host e, além disso, os diferentes hosts devem conseguir enxergar os mesmos arquivos. Para o exemplo aqui explicado vamos disconsiderar esses pontos portanto não vamos mapear volumes.

No Docker em modo normal para subir um container basta executar o comando ‘docker run’ ou ‘docker create’ e seu container estará no ar. No modo docker swarm isso deve ser feito de um modo diferente. O docker swarm trabalha com um objeto chamado Service que cria uma abstração especial de modo a garantir o melhor uso dos nodos do docker.

Para criar um service é importante levar em consideração que apenas container que efetivamente ficam em deamon deve estar nele. Caso você utilize um container hello-world por exemplo (que abre e fecha) o swarm não conseguirá deixá-lo ativo como serviço. Ele simplesmente ficará reinstanciando os containers nos diferentes nodos para garantir uma disponibilidade que não faz sentido.

Os services são criados com uma linha de comando muito semelhante a do próprio ‘docker run’, com a diferença do argumento –replicas que indica a quantidade de duplicações que ele terá no cluster swarm. Siga com o comando com 1 replica:

# comando para a criação do serviço
docker service create --name mysqldb --network minharede --replicas 1 -e MYSQL_DATABASE=answordpress -e MYSQL_USER=anselme -e MYSQL_PASSWORD=123456 -e MYSQL_RANDOM_ROOT_PASSWORD='1' mysql:5.7

# Execute esse comando em cada maquina
# No meu caso há um container mysql no node3
docker ps

# Para verificar se o container está funcionando corretamente
#  Execute os comandos a seguir na maquina que possui o container
docker ps  # descubra o Id do container
docker exec -it ID_DO_CONTAINER bash   # substitua pelo ID do container

mysql -uroot -p
mysql
show databases;

6 – Como criar um serviço para o WordPress no docker

De maneira muito semelhante ao passo anterior vamos criar containers para o wordpress. Esse wordpress se conectará ao container do MySQL que estará em alguma das maquinas do cluster, podendo estar na mesma maquina ou não. Para criar o service é necessário rodar a seguinte linha de comando:

# Esse comando cria o serviço docker swarm
docker service create -p 80:80 --name wordpress --replicas 1 -e WORDPRESS_DB_HOST=mysqldb -e WORDPRESS_DB_USER=anselme -e WORDPRESS_DB_PASSWORD=123456 -e WORDPRESS_DB_NAME=answordpress --network minharede wordpress

# Esse comando deve exibir os dois serviços ativos
#   O MySQL ativo
#   O WordPress ativo, expondo sua porta 80
docker service ls

7 – Como testar o ambiente criado

Por fim, para testar tudo isso é bem simples. No topo do play-with-docker há um botão chamado ‘Open Port’ que dá acesso a uma porta para uso externo. Como se trata de comunicação http é possível fazer tudo diretamente pelo navegador. Inicialmente deve aparecer uma tela de configuração do WordPress que solicita usuário, senha, e-mail e afins. Após você estará apto a se logar no wordpress. Para fins de teste criei um artigo chamado ‘Docker em cluster com Docker Swarm’ e prontinho. Veja a seguir.


Thiago Anselme
Thiago Anselme - Gerente de TI - Arquiteto de Soluções

Ele atua/atuou como Dev Full Stack C# .NET / Angular / Kubernetes e afins. Ele possui certificações Microsoft MCTS (6x), MCPD em Web, ITIL v3 e CKAD (Kubernetes) . Thiago é apaixonado por tecnologia, entusiasta de TI desde a infância bem como amante de aprendizado contínuo.

Deixe um comentário