Joyent ha anunciado recientemente su nuevo servicio de alojamiento de contenedores Docker Triton. Ejecutar contenedores Docker en Triton en lugar de en una plataforma de alojamiento en la nube más tradicional tiene varias ventajas:
- Mejor rendimiento, ya que no hay sobrecarga de virtualización a nivel de hardware. Los contenedores se ejecutan sobre metal desnudo.
- Red simplificada entre contenedores. Cada contenedor obtiene su propia dirección ip privada (y opcionalmente pública).
- Los hosts se abstraen: basta con desplegar en la "nube de contenedores" y no importa en qué host se ejecute el contenedor.
Para más detalles, consulte la charla de Bryan Cantrill sobre Docker y el futuro de los contenedores en la producción.
Vamos a darle una vuelta con un contenedor "hola mundo", y luego con un cluster de servidores Couchbase.
Regístrese para obtener una cuenta Joyent
Siga las instrucciones de inscripción en la página Joyent sitio web.
También tendrá que añadir su clave SSH a su cuenta.
Actualizar el cliente Docker a 1.4.1 o posterior
Compruebe su versión de Docker con:
|
1 2 |
$ docker --version Docker version 1.0.1, build 990021a |
Si estás en una versión anterior a la 1.4.1 (como era mi caso), puedes actualizar Docker mediante el comando instaladores boot2docker.
Configuración de Joyent + Docker
Obtenga el repositorio sdc-docker (sdc == Smart Data Center):
|
1 |
$ git clone https://github.com/joyent/sdc-docker.git |
Realiza la configuración a través de:
|
1 2 |
$ cd sdc-docker $ ./tools/sdc-docker-setup.sh -k 165.225.168.22 $ACCOUNT ~/.ssh/$PRIVATE_KEY_FILE |
Sustituya los valores de la siguiente manera:
- $ACCUENTAPuedes conseguirlo iniciando sesión en la interfaz web de Joyent y accediendo al menú Cuenta desde el desplegable de la esquina superior derecha. Busca la opción Nombre de usuario y utilizar ese campo
- $PRIVATE_KEY_FILE: el nombre del archivo donde se almacena su clave privada, normalmente será
id_rsa
Ejecute el comando y debería ver la siguiente salida:
|
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 variables de entorno
Como sugiere la salida anterior, copie y pegue los comandos de la salida. He aquí un ejemplo de cómo se verá (pero usted debe copiar y pegar de la salida de su comando, no el fragmento de abajo):
|
1 2 3 |
$ export DOCKER_CERT_PATH=/home/ubuntu/.sdc/docker/ $ export DOCKER_HOST=tcp://:2376 $ alias docker="docker --tls" |
Docker Hola Mundo
Vamos a crear una imagen docker de Ubuntu que diga hola mundo.
Recuerda, estás ejecutando el cliente Docker en tu estación de trabajo, no en la nube. Aquí tienes un resumen de lo que va a pasar:

Para iniciar el contenedor docker::
|
1 |
$ docker run --rm ubuntu:14.04 echo "Hello Docker World, from Joyent" |
Debería ver la siguiente salida:
|
1 2 3 4 |
Unable to find image 'ubuntu:14.04' locally Pulling repository library/ubuntu ... Hello Docker World, from Joyent |
Además, puesto que el --rm el contenedor habrá sido eliminado después de salir. Puede comprobarlo ejecutando docker ps -a. Esto es importante porque los contenedores parados generan gastos en Joyent.
¡Enhorabuena! Has conseguido un contenedor Docker "hola mundo" corriendo en Joyent.
Ejecutar contenedores Couchbase Server
Ahora es el momento de ejecutar Couchbase Server.
Para poner en marcha tres contenedores de Couchbase Server, ejecute:
|
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 los contenedores están en funcionamiento, ejecute
|
1 |
$ docker ps |
y deberías 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 |
En este punto tendrás variables de entorno definidas con los ids de contenedor de cada contenedor. Puedes comprobarlo ejecutando
|
1 2 3 4 |
$ echo $container_1 && echo $container_2 && echo $container_3 21264e44d66b4004b4828b7ae408979e7f71924aadab435aa9de662024a37b0e ff9fb4db7b304e769f694802e6a072656825aa2059604ba4ab4d579bd2e5d18d 0c6f8ca2951448e497d7e12026dcae4aeaf990ec51e047cf9d8b2cbdd9bd7668 |
Obtener las direcciones ip públicas de los contenedores
Cada contenedor tendrá asignadas dos direcciones IP:
- Una IP pública, accesible desde cualquier lugar
- Una IP privada, sólo accesible desde contenedores/máquinas en tu cuenta Joyent
Para obtener la IP pública, podemos utilizar el cliente Docker. (para obtener la IP privada, es necesario utilizar las herramientas Joyent SmartDataCenter, que se describe a continuación).
|
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"` |
Ahora tendrás las direcciones IP públicas de cada contenedor definidas en variables de entorno. Puedes comprobar que ha funcionado mediante:
|
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 |
Conectarse a Couchbase Web UI
Abre tu navegador a $container_1_ip:8091 y deberías ver la pantalla de bienvenida de Couchbase:

En este punto, es posible configurar el cluster yendo a la Web UI de cada nodo de Couchbase y siguiendo el Asistente de Configuración. Sin embargo, en caso de que quieras automatizar esto en el futuro, vamos a hacerlo a través de la línea de comandos.
Configurar el primer nodo Couchbase
Elijamos arbitrariamente contenedor_1 como primer nodo del clúster. Este nodo es especial en el sentido de que otros nodos se unirán a él.
El siguiente comando realiza estas operaciones:
- Establece el nombre de usuario y la contraseña del administrador como Administrador / contraseña (debería cambiarlo).
- Establece el tamaño de la RAM del clúster en 600 MB
Nota -u admin -p contraseña debe dejarse como está, ya que es sólo pasar el nombre de administrador por defecto y la contraseña para fines de autenticación.
|
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 |
Deberías ver una respuesta como:
|
1 |
SUCCESS: init 165.225.185.11 |
Crear un cubo por defecto
Un bucket es equivalente a una base de datos en los 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 |
Deberías verlo:
|
1 |
SUCCESS: bucket-create |
Añadir 2º nodo Couchbase
Añade el segundo nodo Couchbase con 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 |
Deberías verlo:
|
1 2 |
SUCCESS: server-add 165.225.185.12:8091 |
Para verificar que se ha añadido, ejecute:
|
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 debería devolver la lista de nodos de Couchbase Server que ahora forman parte del 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 |
Añadir 3er nodo Couchbase y reequilibrar
En este paso lo haremos:
- Añade el tercer nodo Couchbase
- Activar un "reequilibrio", que distribuye los datos del cubo (vacío) por todo el clúster.
|
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 |
Deberías verlo:
|
1 2 3 4 5 6 |
INFO: rebalancing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SUCCESS: rebalanced cluster close failed in file object destructor: Error in sys.excepthook: Original exception was: |
Si ve ÉXITOEntonces funcionó. (No estoy seguro de por qué se produce el error "close failed in file ..", pero hasta ahora parece que se puede ignorar con seguridad).
Iniciar sesión en la interfaz web
Abra su navegador a $container_1_ip:8091 y debería ver la pantalla de inicio de sesión de Coucbase:

Inicia sesión con:
- Nombre de usuario: Administrador
- Contraseña: contraseña
Y deberías ver los nodos Couchbase:

¡Enhorabuena! Ya tienes un cluster de Couchbase Server funcionando en Joyent Triton.
Desmontaje
Para detener y eliminar los contenedores del servidor Couchbase, ejecute:
|
1 2 |
$ docker stop $container_1 $container_2 $container_3 $ docker rm $container_1 $container_2 $container_3 |
Para volver a comprobar que ya no tiene ningún contenedor en ejecución o en estado detenido, ejecute docker ps -a y debería ver una lista vacía.
Instalación de las herramientas de la COSUDE (opcional)
La instalación de las herramientas Joyent Smart Data Center (SDC) le permitirá obtener una mayor visibilidad de su clúster de contenedores - por ejemplo, ser capaz de ver la IP interna de cada contenedor.
A continuación se explica cómo instalar la suite sdc-tools.
Instalar smartdc
Primero instala NodeJS + NPM
Instala smartdc:
|
1 2 |
npm install -g smartdc |
Configurar variables de entorno
|
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}') |
Sustituya los valores de la siguiente manera:
- CUENTAPuedes conseguirlo iniciando sesión en la interfaz web de Joyent y accediendo al menú Cuenta desde el desplegable de la esquina superior derecha. Busca la opción Nombre de usuario y utilizar ese campo
Lista de máquinas
Ejecutar sdc-listmachines para listar todos los contenedores ejecutándose bajo tu cuenta Joyent. El resultado debería ser algo parecido a esto:
|
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" }, ] |
Encontrar la IP privada de una máquina individual
|
1 |
$ sdc-getmachine | json -aH ips | json -aH | egrep "10.|192.” |
Referencias
- API nativa de Docker vs API Triton de Joyent
- 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