Recentemente foi anunciado o Swarm 1.0, pronto para ser utilizado em ambientes de produção, portanto achei que seria um bom momento para checar as novas funcionalidades e escrever algo a respeito.
Neste artigo vou demonstrar como criar um cluster docker Swarm utlizando o Machine, mas antes de mais nada, vamos “dar nome aos bois”.
Docker Swarm
O Swarm é a ferramenta nativa de clustering do Docker. Ela te possibilita a criação de um grupo de servidores docker.
Como o Swarm provê a API Docker padrão, qualquer ferramenta que se comunica com o Docker utilizando essa api, pode se comunicar com um cluster Swarm de maneira transparente.
Para saber como instalar o Swarm, clique aqui.
Docker Machine
O Machine é uma ferramenta de linha de comando que facilita o provisionamento de servidores docker no seu computador, provedores cloud ou em seu próprio data center. A ferramenta cria hosts, instala o docker-engine e configura seu client, para que este se comunique com o servidor recém criado.
Uma “machine” é a combinação de um host Docker e um client docker configurado.
A ferramenta provê uma série de comandos para facilitar a administração de seus “machines”.
Utilizando esses comandos você consegue:
- controlar o status do host ( start, inspect, stop, restart )
- Atualizar o Docker daemon
- configurar um client docker para se comunicar com o host Docker
Para saber mais a respeito, veja este guia de introdução e o manual de instalação.
Criando o cluster
Criando o cluster – Passo a Passo
Primeiro vamos nos certificar que o docker-machine está instalado e funcionando corretamente.
Comando:
user@local:~> docker-machine --version
Retorno:
docker-machine version 0.5.0 (04cfa58)
Docker-machine está ok. Agora temos que criar o token de identificação do cluster Swarm.
Comando:
user@local:~> docker run swarm create
Retorno:
Unable to find image 'swarm:latest' locally latest: Pulling from library/swarm 2bc79aec8ea0: Pull complete dc2fb86a875a: Pull complete 435e648d0f23: Pull complete e16042a92d05: Pull complete 045bd7b00b5b: Pull complete 3caea1253d76: Pull complete 2b4c55187a27: Pull complete 6b40fe7724bd: Pull complete Digest: sha256:1ab748e67f00ee34d0bedcb306caede47c02dad3e0e03455d55 Status: Downloaded newer image for swarm:latest 70102c42555f190d42fb24c3d8a32773
Pronto, nosso token é a última linha retornada, o valor 70102c42555f190d42fb24c3d8a32773.
Agora vamos criar nosso node master.
Comando:
user@local:~> docker-machine create \ -d virtualbox \ --swarm \ --swarm-master \ --swarm-discovery token://VALOR_TOKEN \ swarm-master
Retorno:
Running pre-create checks... Creating machine... Waiting for machine to be running, this may take a few minutes... Machine is running, waiting for SSH to be available... Detecting operating system of created instance... Provisioning created instance... Copying certs to the local machine directory... Copying certs to the remote machine... Setting Docker configuration on the remote daemon... Configuring swarm... To see how to connect Docker to this machine, run: docker-machine env swarm-master
O nosso nó master está pronto. Para nos certificar podemos utilizar o comando docker-machine ls.
user@local:~> docker-machine ls
Retorno:
NAME ACTIVE DRIVER STATE URL SWARM swarm-master - virtualbox Running tcp://192.168.99.107:2376 swarm-master (master)
O próximo passo é criar nosso node-00, onde os containers serão executados.
Comando:
user@local:~> docker-machine ls docker-machine create \ -d virtualbox \ --swarm \ --swarm-discovery token://VALOR_TOKEN \ swarm-node-00
Vamos verificar novamente se o host foi criado e está no ar.
user@local:~> docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM swarm-master - virtualbox Running tcp://192.168.99.107:2376 swarm-master (master) swarm-node-00 - virtualbox Running tcp://192.168.99.108:2376 swarm-master
O cluster está no ar e pronto para uso.
Para “apontar” nosso cliente docker para o cluster, vamos utilizar o seguinte comando:
eval "$(docker-machine env --swarm swarm-master)"
Para termos certeza que o cliente está utilizando cluster, podemos utilizar o comando docker info.
user@local:~> docker info Containers: 3 Images: 2 Role: primary Strategy: spread Filters: health, port, dependency, affinity, constraint Nodes: 2 swarm-master: 192.168.99.107:2376 └ Containers: 2 └ Reserved CPUs: 0 / 1 └ Reserved Memory: 0 B / 1.021 GiB └ Labels: executiondriver=native-0.2, kernelversion=4.1.12-boot2docker, operatingsystem=Boot2Docker 1.9.0 (TCL 6.4); master : 16e4 a2a - Tue Nov 3 19:49:22 UTC 2015, provider=virtualbox, storagedriver=aufs swarm-node-00: 192.168.99.108:2376 └ Containers: 1 └ Reserved CPUs: 0 / 1 └ Reserved Memory: 0 B / 1.021 GiB └ Labels: executiondriver=native-0.2, kernelversion=4.1.12-boot2docker, operatingsystem=Boot2Docker 1.9.0 (TCL 6.4); master : 16e4 a2a - Tue Nov 3 19:49:22 UTC 2015, provider=virtualbox, storagedriver=aufs CPUs: 2 Total Memory: 2.043 GiB Name: 412cc93d5d40
É isso, o cluster está funcionando, o cliente docker está apontado para o cluster, já podemos testar o cluster subindo um container com a imagem hello-world.
user@local:~> docker run hello-world Hello from Docker. This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker Hub account: https://hub.docker.com For more examples and ideas, visit: https://docs.docker.com/userguide/
Por hoje é só, no próximo artigo vou mostrar como fazer coisas mais interessantes com o cluster, não se esqueça de excluir o cluster utilizando o comando docker-machine rm.