A Joyent anunciou recentemente seu novo serviço de hospedagem de contêineres Triton Docker. Há várias vantagens em executar contêineres Docker no Triton em vez de em uma plataforma de hospedagem em nuvem mais tradicional:
- Melhor desempenho, pois não há sobrecarga de virtualização em nível de hardware. Seus contêineres são executados em bare metal.
- Rede simplificada entre contêineres. Cada contêiner recebe seu próprio endereço IP privado (e, opcionalmente, público).
- Os hosts são abstraídos - basta implementar na "nuvem de contêineres" e não importa em qual host o contêiner está sendo executado.
Para obter mais detalhes, confira a palestra de Bryan Cantrill sobre o Docker e o futuro dos contêineres na produção.
Vamos dar uma olhada com um contêiner "hello world" e, em seguida, com um cluster de servidores Couchbase.
Registre-se em uma conta Joyent
Siga as instruções de registro no site Joyent site.
Você também precisará adicionar sua chave SSH à sua conta.
Atualize o cliente Docker para a versão 1.4.1 ou posterior
Verifique sua versão do Docker com:
|
1 2 |
$ docker --version Docker version 1.0.1, build 990021a |
Se você estiver em uma versão anterior à 1.4.1 (como eu estava), poderá atualizar o Docker por meio do comando instaladores do boot2docker.
Joyent + configuração do Docker
Obtenha o repositório sdc-docker (sdc == Smart Data Center):
|
1 |
$ git clone https://github.com/joyent/sdc-docker.git |
Realizar a configuração via:
|
1 2 |
$ cd sdc-docker $ ./tools/sdc-docker-setup.sh -k 165.225.168.22 $ACCOUNT ~/.ssh/$PRIVATE_KEY_FILE |
Substitua os valores da seguinte forma:
- $ACCOUNTPara obter isso, faça login na interface do usuário da Web da Joyent e acesse o menu Account (Conta) no menu suspenso no canto superior direito. Encontre a seção Nome de usuário e usar esse campo
- $PRIVATE_KEY_FILE: o nome do arquivo em que sua chave privada está armazenada, normalmente será
id_rsa
Execute o comando e você verá o seguinte resultado:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Setting up Docker client for SDC using: CloudAPI: https://165.225.168.22 Account: Key: /home/ubuntu/.ssh/id_rsa [..snip..] Wrote certificate files to /home/ubuntu/.sdc/docker/ Docker service endpoint is: tcp://:2376 * * * Success. Set your environment as follows: export DOCKER_CERT_PATH=/home/ubuntu/.sdc/docker/ export DOCKER_HOST=tcp://:2376 alias docker="docker --tls" Then you should be able to run 'docker info' and see your account name 'SDCAccount: ' in the output. |
Exportar variáveis de ambiente
Como a saída acima sugere, copie e cole os comandos da saída. Aqui está um exemplo de como isso será (mas você deve copiar e colar a partir da saída do comando, não do trecho abaixo):
|
1 2 3 |
$ export DOCKER_CERT_PATH=/home/ubuntu/.sdc/docker/ $ export DOCKER_HOST=tcp://:2376 $ alias docker="docker --tls" |
Docker Hello World
Vamos criar uma imagem do docker do Ubuntu que diz hello world.
Lembre-se de que você está executando o cliente Docker em sua estação de trabalho, não na nuvem. Aqui está uma visão geral do que vai acontecer:

Para iniciar o contêiner do docker::
|
1 |
$ docker run --rm ubuntu:14.04 echo "Hello Docker World, from Joyent" |
Você deverá ver o seguinte resultado:
|
1 2 3 4 |
Unable to find image 'ubuntu:14.04' locally Pulling repository library/ubuntu ... Hello Docker World, from Joyent |
Além disso, como o --rm foi passado, o contêiner terá sido removido após a saída. Você pode verificar isso executando docker ps -a. Isso é importante porque contêineres parados incorrem em cobranças no Joyent.
Parabéns! Você conseguiu um contêiner Docker "hello world" em execução na Joyent.
Executar contêineres do Couchbase Server
Agora é hora de executar o Couchbase Server.
Para iniciar três contêineres do Couchbase Server, execute:
|
1 2 3 4 |
$ for i in `seq 1 3`; do echo "Starting container $i"; export container_$i=$(docker run --name couchbase-server-$i -d -P couchbase/server); done |
Para confirmar que os contêineres estão ativos, execute:
|
1 |
$ docker ps |
e você verá:
|
1 2 3 4 |
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5bea8901814c couchbase/server "couchbase-start" 3 minutes ago Up 2 minutes couchbase-server-1 bef1f2f32726 couchbase/server "couchbase-start" 2 minutes ago Up 2 minutes couchbase-server-2 6f4e2a1e8e63 couchbase/server "couchbase-start" 2 minutes ago Up About a minute couchbase-server-3 |
Nesse ponto, você terá variáveis de ambiente definidas com os IDs de cada contêiner. Você pode verificar isso executando:
|
1 2 3 4 |
$ echo $container_1 && echo $container_2 && echo $container_3 21264e44d66b4004b4828b7ae408979e7f71924aadab435aa9de662024a37b0e ff9fb4db7b304e769f694802e6a072656825aa2059604ba4ab4d579bd2e5d18d 0c6f8ca2951448e497d7e12026dcae4aeaf990ec51e047cf9d8b2cbdd9bd7668 |
Obter endereços IP públicos dos contêineres
Cada contêiner terá dois endereços IP atribuídos:
- Um IP público, acessível de qualquer lugar
- Um IP privado, acessível apenas a partir de contêineres/máquinas da sua conta Joyent
Para obter o IP público, podemos usar o cliente Docker. (para obter o IP privado, você precisa usar as ferramentas Joyent SmartDataCenter, descritas abaixo)
|
1 2 3 |
$ container_1_ip=`docker inspect $container_1 | grep -i IPAddress | awk -F: '{print $2}' | grep -oE "b([0-9]{1,3}.){3}[0-9]{1,3}b"` $ container_2_ip=`docker inspect $container_2 | grep -i IPAddress | awk -F: '{print $2}' | grep -oE "b([0-9]{1,3}.){3}[0-9]{1,3}b"` $ container_3_ip=`docker inspect $container_3 | grep -i IPAddress | awk -F: '{print $2}' | grep -oE "b([0-9]{1,3}.){3}[0-9]{1,3}b"` |
Agora você terá os endereços IP públicos de cada contêiner definidos nas variáveis de ambiente. Você pode verificar se funcionou via:
|
1 2 3 4 |
$ echo $container_1_ip && echo $container_2_ip && echo $container_3_ip 165.225.185.11 165.225.185.12 165.225.185.13 |
Conectar-se à interface do usuário da Web do Couchbase
Abra o navegador em $container_1_ip:8091 e você verá a tela de boas-vindas do Couchbase:

Neste ponto, é possível configurar o cluster acessando a interface do usuário da Web de cada nó do Couchbase e seguindo o assistente de configuração. No entanto, caso você queira automatizar isso no futuro, vamos fazer isso pela linha de comando.
Configurar o primeiro nó do Couchbase
Vamos escolher arbitrariamente contêiner_1 como o primeiro nó do cluster. Esse nó é especial no sentido de que outros nós se juntarão a ele.
O comando a seguir executa essas operações:
- Define o nome de usuário e a senha do administrador como Administrator / password (você deve alterar isso)
- Define o tamanho da RAM do cluster como 600 MB
Observação: o -u admin -p password deve ser deixado como está, uma vez que ele está apenas passando o nome e a senha padrão do administrador para fins de autenticação.
|
1 2 3 4 5 6 |
$ docker run --rm --entrypoint=/opt/couchbase/bin/couchbase-cli couchbase/server cluster-init -c $container_1_ip --cluster-init-username=Administrator --cluster-init-password=password --cluster-init-ramsize=600 -u admin -p password |
Você deverá ver uma resposta como:
|
1 |
SUCCESS: init 165.225.185.11 |
Criar um bucket padrão
Um bucket é equivalente a um banco de dados em sistemas RDMS típicos.
|
1 2 3 4 5 6 7 8 |
$ docker run --rm --entrypoint=/opt/couchbase/bin/couchbase-cli couchbase/server bucket-create -c $container_1_ip:8091 --bucket=default --bucket-type=couchbase --bucket-port=11211 --bucket-ramsize=600 --bucket-replica=1 -u Administrator -p password |
Você deveria ver:
|
1 |
SUCCESS: bucket-create |
Adicionar o segundo nó do Couchbase
Adicione o segundo nó do Couchbase com este comando
|
1 2 3 4 5 6 |
$ docker run --rm --entrypoint=/opt/couchbase/bin/couchbase-cli couchbase/server server-add -c $container_1_ip -u Administrator -p password --server-add $container_2_ip --server-add-username Administrator --server-add-password password |
Você deveria ver:
|
1 2 |
SUCCESS: server-add 165.225.185.12:8091 |
Para verificar se ele foi adicionado, execute:
|
1 2 3 |
$ docker run --rm --entrypoint=/opt/couchbase/bin/couchbase-cli couchbase/server server-list -c $container_1_ip -u Administrator -p password |
que deve retornar a lista de nós do Couchbase Server que agora fazem parte do cluster:
|
1 2 |
ns_1@165.225.185.11 165.225.185.11:8091 healthy active ns_1@165.225.185.12 165.225.185.12:8091 healthy inactiveAdded |
Adicionar o terceiro nó do Couchbase e rebalancear
Nesta etapa, faremos o seguinte:
- Adicionar o terceiro nó do Couchbase
- Acionar um "rebalanceamento", que distribui os dados do bucket (vazio) pelo cluster
|
1 2 3 4 5 6 |
$ docker run --rm --entrypoint=/opt/couchbase/bin/couchbase-cli couchbase/server rebalance -c $container_1_ip -u Administrator -p password --server-add $container_3_ip --server-add-username Administrator --server-add-password password |
Você deveria ver:
|
1 2 3 4 5 6 |
INFO: rebalancing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SUCCESS: rebalanced cluster close failed in file object destructor: Error in sys.excepthook: Original exception was: |
Se você vir SUCESSOe depois funcionou. (Não sei ao certo por que o erro "close failed in file ..." está ocorrendo, mas até agora parece que ele pode ser ignorado com segurança).
Faça login na interface do usuário da Web
Abra seu navegador em $container_1_ip:8091 e você verá a tela de login do Coucbase:

Faça login com:
- Nome de usuário: Administrador
- Senha: senha
E você verá os nós do Couchbase:

Parabéns! Você tem um cluster do Couchbase Server instalado e em execução no Joyent Triton.
Desmontagem
Para parar e remover os contêineres do servidor Couchbase, execute:
|
1 2 |
$ docker stop $container_1 $container_2 $container_3 $ docker rm $container_1 $container_2 $container_3 |
Para verificar se não há mais contêineres em execução ou no estado parado, execute docker ps -a e você verá uma lista vazia.
Instalação das ferramentas do SDC (opcional)
A instalação das ferramentas do Joyent Smart Data Center (SDC) permitirá que você obtenha mais visibilidade do seu cluster de contêineres, por exemplo, a possibilidade de visualizar o IP interno de cada contêiner.
Veja como instalar o pacote sdc-tools.
Instalar o smartdc
Primeiro, instale o NodeJS + NPM
Instale o smartdc:
|
1 2 |
npm install -g smartdc |
Configurar variáveis de ambiente
|
1 2 3 |
$ export SDC_URL=https://us-east-3b.api.joyent.com $ export SDC_ACCOUNT= $ export SDC_KEY_ID=$(ssh-keygen -l -f $HOME/.ssh/id_rsa.pub | awk '{print $2}') |
Substitua os valores da seguinte forma:
- CONTAPara obter isso, faça login na interface do usuário da Web da Joyent e acesse o menu Account (Conta) no menu suspenso no canto superior direito. Encontre a seção Nome de usuário e usar esse campo
Lista de máquinas
Executar máquinas da lista sdc para listar todos os contêineres em execução na sua conta Joyent. Seu resultado deve ser algo parecido com isto:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
$ sdc-listmachines [ { "id": "0c6f8ca2-9514-48e4-97d7-e12026dcae4a", "name": "couchbase-server-3", "type": "smartmachine", "state": "running", "image": "335a8046-0749-1174-5666-6f084472b5ef", "ips": [ "192.168.128.32", "165.225.185.13" ], "memory": 1024, "disk": 25600, "metadata": {}, "tags": {}, "created": "2015-03-26T14:50:31.196Z", "updated": "2015-03-26T14:50:45.000Z", "networks": [ "7cfe29d4-e313-4c3b-a967-a28ea34342e9", "178967cb-8d11-4f53-8434-9c91ff819a0d" ], "dataset": "335a8046-0749-1174-5666-6f084472b5ef", "primaryIp": "165.225.185.13", "firewall_enabled": false, "compute_node": "44454c4c-4400-1046-8050-b5c04f383432", "package": "t4-standard-1G" }, ] |
Localizar o IP privado de uma máquina individual
|
1 |
$ sdc-getmachine | json -aH ips | json -aH | egrep "10.|192.” |
Referências
- API nativa do Docker versus API Joyent Triton
- https://www.joyent.com/blog/container-service-preview
- https://www.joyent.com/blog/docker-bake-off-aws-vs-joyent
- https://github.com/joyent/sdc-docker
- https://github.com/joyent/sdc-docker/blob/master/docs/divergence.md