Skip to main content

Docker Machine

12.1. Me dijeron que mi vida sería mejor con Docker Machine

¡Ciertamente!

Con Docker Machine puedes, con solo un comando, iniciar tu proyecto con Docker!

Antes de Docker Machine, si quisiéramos montar un Docker Host, era necesario hacer la instalación del sistema operativo, instalar y configurar Docker y otras herramientas necesarias.

Perderíamos un tiempo valioso con estos pasos, cuando ya podríamos estar trabajando efectivamente con Docker y sus containers.

Sin embargo, ¡todo cambió con Docker Machine! Con él puedes crear tu Docker Host con solo un comando. Docker Machine puede trabajar con los principales hypervisors de VMs, como VMware, Hyper-V y Oracle VirtualBox, y también con los principales proveedores de infraestructura, como AWS, Google Compute Engine, DigitalOcean, Rackspace, Azure, etc.

Para que puedas tener acceso a todos los drivers que Docker Machine soporta, accede a: https://docs.docker.com/machine/drivers/.

Cuando utilizas Docker Machine para instalar un Docker Host en AWS, por ejemplo, él proporcionará una máquina con Linux y con Docker y sus dependencias ya instaladas.

12.1.1. ¿Vamos a instalar?

La instalación de Docker Machine es bastante simple, por eso, ¡vamos a dejar de hablar y a practicar! Vale recordar que es posible instalar Docker Machine en Linux, MacOS o Windows.

Para hacer la instalación de Docker Machine en Linux, haz:

# curl -L https://github.com/docker/machine/releases/download/v0.12.0/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine
# chmod +x /tmp/docker-machine
# sudo cp /tmp/docker-machine /usr/local/bin/docker-machine

Para continuar con la instalación en MacOS:

curl -L https://github.com/docker/machine/releases/download/v0.15.0/docker-machine-`uname -s`-`uname -m` >/usr/local/bin/docker-machine
chmod +x /usr/local/bin/docker-machine

Para continuar con la instalación en Windows si estás usando Git bash:

if [[ ! -d "$HOME/bin" ]]; then mkdir -p "$HOME/bin"; fi
curl -L https://github.com/docker/machine/releases/download/v0.15.0/docker-machine-Windows-x86_64.exe > "$HOME/bin/docker-machine.exe"
chmod +x "$HOME/bin/docker-machine.exe"

Para verificar si fue instalado y cuál es su versión, haz:

root@linuxtips:~# docker-machine version
docker-machine version 0.15.0, build b48dc28

root@linuxtips:~#

Listo. Como todo lo que hace Docker, es simple de instalar y fácil de operar. :)

12.1.2. ¿Vamos a iniciar nuestro primer proyecto?

Ahora que ya tenemos Docker Machine instalado en nuestra máquina, ya podremos hacer la instalación del Docker Host de forma bastante simple -- recordando que, incluso si hubiéramos hecho la instalación de Docker Machine en Windows, podríamos tranquilamente comandar la instalación de Docker Hosts en AWS en máquinas Linux. Ten en cuenta que la máquina en la cual instalaste Docker Machine es el maestro que determina la creación de nuevos Docker Hosts, sea en VMs o en alguna nube como AWS.

En nuestro primer proyecto, vamos a hacer que Docker Machine instale el Docker Host utilizando VirtualBox.

Como utilizaremos VirtualBox, es evidente que necesitamos tener instalado VirtualBox en nuestra máquina para que todo funcione. ;)

Por lo tanto:

root@linuxtips:~# apt-get install virtualbox

Para hacer la instalación de un nuevo Docker Host, utilizamos el comando "docker-machine create". Para elegir dónde crearemos el Docker Host, utilizamos el parámetro "--driver", como sigue:

root@linuxtips:~# docker-machine create --driver virtualbox linuxtips
Running pre-create checks...
(linuxtips) Default Boot2Docker ISO is out-of-date, downloading the latest release...
(linuxtips) Latest release for github.com/boot2docker/boot2docker is v17.05.0-ce
(linuxtips) Downloading /Users/linuxtips/.docker/machine/cache/boot2docker.iso from https://github.com/boot2docker/boot2docker/releases/download/v17.05.0-ce/boot2docker.iso...
(linuxtips) 0%....10%....20%....30%....40%....50%....60%....70%....80%....90%....100%
Creating machine...
(linuxtips) Copying /Users/linuxtips/.docker/machine/cache/boot2docker.iso to /Users/linuxtips/.docker/machine/machines/linuxtips/boot2docker.iso...
(linuxtips) Creating VirtualBox VM...
(linuxtips) Creating SSH key...
(linuxtips) Starting the VM...
(linuxtips) Check network to re-create if needed...
(linuxtips) Waiting for an IP...
Waiting for machine to be running, this may take a few minutes...
Detecting operating system of created instance...
Waiting for SSH to be available...
Detecting the provisioner...
Provisioning with boot2docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!

To see how to connect your Docker Client to the Docker Engine running on
this virtual machine, run: docker-machine env linuxtips

root@linuxtips:~#

Donde:

  • docker-machine create -- Crea un nuevo Docker Host.

  • --driver virtualbox -- Lo creará utilizando VirtualBox.

  • linuxtips -- Nombre de la VM que será creada.

Para visualizar el host que acabas de crear, basta digitar el siguiente comando:

root@linuxtips:~# docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
linuxtips - virtualbox Running tcp://192.168.99.100:2376 v18.06.0 -

Como podemos notar, ¡nuestro host está siendo ejecutado perfectamente! Observa que tenemos una columna llamada URL, ¿correcto? En ella tenemos la URL para que podamos comunicarnos con nuestro nuevo host.

Otra forma de visualizar información sobre el host, más específicamente sobre sus variables de entorno, es digitar:

root@linuxtips:~# docker-machine env linuxtips
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/linuxtips/.docker/machine/machines/linuxtips"
export DOCKER_MACHINE_NAME="linuxtips"
# Run this command to configure your shell:
# eval "$(docker-machine env linuxtips)"

root@linuxtips:~#

Se mostrarán todas las variables de entorno del host, como URL, certificado y nombre.

Para que puedas acceder al entorno de este host que acabamos de crear, haz:

root@linuxtips:~# eval "$(docker-machine env linuxtips)"

El comando "eval" sirve para definir variables de entorno a través de la salida de un comando, es decir, las variables que visualizamos en la salida de "docker-machine env linuxtips".

Ahora que ya estamos en el entorno del host que creamos, vamos a visualizar los containers en ejecución:

root@linuxtips:~# docker container ls

Claro que aún no tenemos ningún container en ejecución; vamos a iniciar nuestro primero ahora:

root@linuxtips:~# docker container run busybox echo "LINUXTIPS, VAIIII"
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
385e281300cc: Pull complete
a3ed95caeb02: Pull complete
Digest: sha256:4a887a2326ec9e0fa90cce7b4764b0e627b5d6afcb81a3f73c85dc29cea00048
Status: Downloaded newer image for busybox:latest
LINUXTIPS, VAIIII

root@linuxtips:~#

Como podemos observar, el container fue ejecutado e imprimió el mensaje "LINUXTIPS, VAIIII", como solicitamos.

Recuerda que el container fue ejecutado en nuestro Docker Host, que creamos a través de Docker Machine.

Para verificar la IP del host que creamos, haz:

root@linuxtips:~# docker-machine ip linuxtips
192.168.99.100

root@linuxtips:~#

Para que podamos acceder a nuestro host, utilizamos el parámetro "ssh" pasando el nombre del host al que queremos acceder:

root@linuxtips:~# docker-machine ssh linuxtips

Para saber más detalles sobre el host, podemos utilizar el parámetro "inspect":

root@linuxtips:~# docker-machine inspect linuxtips
{
"ConfigVersion": 3,
"Driver": {
"IPAddress": "192.168.99.100",
"MachineName": "linuxtips",
"SSHUser": "docker",
"SSHPort": 57249,
"SSHKeyPath": "/Users/jeferson/.docker/machine/machines/linuxtips/id_rsa",
"StorePath": "/Users/jeferson/.docker/machine",
"SwarmMaster": false,
"SwarmHost": "tcp://0.0.0.0:3376",
"SwarmDiscovery": "",
"VBoxManager": {},
"HostInterfaces": {},
"CPU": 1,
"Memory": 1024,
"DiskSize": 20000,
"NatNicType": "82540EM",
"Boot2DockerURL": "",
"Boot2DockerImportVM": "",
"HostDNSResolver": false,
"HostOnlyCIDR": "192.168.99.1/24",
"HostOnlyNicType": "82540EM",
"HostOnlyPromiscMode": "deny",
"UIType": "headless",
"HostOnlyNoDHCP": false,
"NoShare": false,
"DNSProxy": true,
"NoVTXCheck": false,
"ShareFolder": ""
},
"DriverName": "virtualbox",
"HostOptions": {
"Driver": "",
"Memory": 0,
"Disk": 0,
"EngineOptions": {
"ArbitraryFlags": [],
"Dns": null,
"GraphDir": "",
"Env": [],
"Ipv6": false,
"InsecureRegistry": [],
"Labels": [],
"LogLevel": "",
"StorageDriver": "",
"SelinuxEnabled": false,
"TlsVerify": true,
"RegistryMirror": [],
"InstallURL": "https://get.docker.com"
},
"SwarmOptions": {
"IsSwarm": false,
"Address": "",
"Discovery": "",
"Agent": false,
"Master": false,
"Host": "tcp://0.0.0.0:3376",
"Image": "swarm:latest",
"Strategy": "spread",
"Heartbeat": 0,
"Overcommit": 0,
"ArbitraryFlags": [],
"ArbitraryJoinFlags": [],
"Env": null,
"IsExperimental": false
},
"AuthOptions": {
"CertDir": "/Users/jeferson/.docker/machine/certs",
"CaCertPath": "/Users/jeferson/.docker/machine/certs/ca.pem",
"CaPrivateKeyPath": "/Users/jeferson/.docker/machine/certs/ca-key.pem",
"CaCertRemotePath": "",
"ServerCertPath": "/Users/jeferson/.docker/machine/machines/linuxtips/server.pem",
"ServerKeyPath": "/Users/jeferson/.docker/machine/machines/linuxtips/server-key.pem",
"ClientKeyPath": "/Users/jeferson/.docker/machine/certs/key.pem",
"ServerCertRemotePath": "",
"ServerKeyRemotePath": "",
"ClientCertPath": "/Users/jeferson/.docker/machine/certs/cert.pem",
"ServerCertSANs": [],
"StorePath": "/Users/jeferson/.docker/machine/machines/linuxtips"
}
},
"Name": "linuxtips"
}

Para detener el host que creamos:

root@linuxtips:~# docker-machine stop linuxtips

Para que puedas visualizar el estado de tu host Docker, digita:

root@linuxtips:~# docker-machine ls

Para iniciarlo nuevamente:

root@linuxtips:~# docker-machine start linuxtips

Para eliminarlo definitivamente:

root@linuxtips:~# docker-machine rm linuxtips
Successfully removed linuxtips