Lo primero es instalar el Docker, en su versión mas moderna de mantenimiento. Para ello ejecutamos:
- sudo apt-add-repository 'deb https://apt.dockerproject.org/repo ubuntu-xenial main'
- sudo apt-get update
- sudo apt-get install docker-engine
Para saber si Docker está corriendo como servicio, basta con usar:
sudo systemctl status docker
Que nos devolverá algo parecido a esto si el servicio está funcionando
docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: e
Active: active (running) since vie 2017-08-25 16:12:09 ART; 2 days ago
Por otro lado al hacer un ifconfig debe aparecer el bridge
docker0 Link encap:Ethernet direcciónHW 02:42:04:ec:36:db
Direc. inet:172.17.0.1 Difus.:0.0.0.0 Másc:255.255.0.0
Dirección inet6: fe80::42:4ff:feec:36db/64 Alcance:Enlace
ACTIVO DIFUSIÓN FUNCIONANDO MULTICAST MTU:1500 Métrica:1
Paquetes RX:50356 errores:0 perdidos:0 overruns:0 frame:0
Paquetes TX:58643 errores:0 perdidos:0 overruns:0 carrier:0
colisiones:0 long.colaTX:0
Bytes RX:3011512 (3.0 MB) TX bytes:401585916 (401.5 MB)
Luego para evitar usar el comando sudo de manera seguida asociamos el usuario administrador al grupo docker con:
sudo usermod -aG docker $(whoami)
para saber si no necesitamos usar mas el sudo, probamos ejecutar la imagen Hola Mundo con:
docker run hello-world
Lo que nos devolverá algo parecido a esto:
Hello from Docker!
This message shows that your installation appears to be working correctly.
con
docker pull ubuntu
descargamos la imagen (en realidad es una plantilla) de un sistema base en la última versión de Ubuntu. Para ver la imagen basta con ingresar:
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest ccc7a11d65b1 2 weeks ago 120MB
hello-world latest 1815c82652c0 2 months ago 1.84kB
Luego con:
docker run -it ubuntu bash
creamos el conteiner si no existe y entramos por una terminal vt220 de manera interactiva usando bash como shell o interprete. lo que vamos a ver es esto:
root@035244c70483:~#
Siempre ingresamos como root, y el hostname del sistema es el ID del contenedor es decir 035244c70483 para instalar apache2, mysql y phpmyadmin; primero hay que hacer un apt update!! pues como dije es una plantilla y está desprovisto de cosa superfluas. Tampoco tiene nano, ni VIM. Entonces los pasos dentro del container son, en resumidas cuentas:
- apt update
- apt install nano, vim, apache2, mysql-server, etc, etc.
- apt clean
- service apache2 start
service mysql start
ahora con exit salimos del container. El cual lo podemos ver con:
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
72f37c543cff hello-world "/hello" 27 minutes ago Exited (0) 27 minutes ago jolly_goldstine
035244c70483 ubuntu "bash" 1 minutes ago Exited(0) hours amazing_euler
a160ebf0c908 tensorflow_2017_8 "bash" 24 hours ago Exited (0) 24 hours ago quirky_almeida
con docker ps vemos los conteriner activos.
Ahora bien vamos a crear una plantilla con dicho container, para eso basta con hacer, usando el ID del container:
docker commit 35244c70483 miweb_ubuntu
Se puede verificar su creación con docker images. Ahora vamos a guardar dicha imagen para luego transportala a otro VPS que ya tiene docker corriendo. Para ello la guardamos como:
- docker save -o miweb_ubuntu.tar miweb_ubuntu
- gzip miweb_ubuntu.tar
- scp miweb_ubuntu.tar.gz pepito@cosita:tmp
- gunzip miweb_ubuntu.tar.gz
- docker load --input miweb_ubuntu.tar
de nuevo con docker images verificamos que esté la imagen. Para que arranque de manera interactiva, para ajustar cosas,,,
docker run -ti -p 9080:80 miweb_ubuntu bash
cuando ingresemos los servicios no arrancan automáticamente, ya que no fue creado a partir de un dockerfile! Entonces iniciamos los servicios apache2 y mysql como antes, y salimos NO CON EXIT, sino con CTRL+P+Q. Para que podamos salir y el contenedor no se detenga. Para verificar que está andando basta con hacer:
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
035244c70483 miweb_ubuntu "bash" 19 hours ago Up 19 hours 0.0.0.0:9080->80/tcp amazing_euler
con la opción -p 9080:80 estoy redirigiendo el puerto de salida al 9080, aunque el interno sea el 80. Esto es para evitar el conflicto de puertos con mi servidor apache que corre en el VPS.
Cabe observar que se crea un dispositivo bridge para el contenedor donde serán redirigidas las solicitudes.
veth2bc2871 Link encap:Ethernet direcciónHW 46:c8:80:bf:fb:ae
Dirección inet6: fe80::44c8:80ff:febf:fbae/64 Alcance:Enlace
ACTIVO DIFUSIÓN FUNCIONANDO MULTICAST MTU:1500 Métrica:1
Paquetes RX:260 errores:0 perdidos:0 overruns:0 frame:0
Paquetes TX:348 errores:0 perdidos:0 overruns:0 carrier:0
colisiones:0 long.colaTX:0
Bytes RX:61744 (61.7 KB) TX bytes:4052635 (4.0 MB)
Con :
docker cp index.html 035244c70483:/var/www/html/index.html
copio el index.html de mi VPS al directorio dentro del contenedor.
Listo para saber que funciona todo, en un navegador fuera del VPS colocamos:
http://pepito:9080
Y debemos ver la página web que hemos creado en el contenedor.
Para volver a ingresar al contendor basta con usar el ID del contendor que corre:
docker attach 035244c70483
con:
docker start ID_contenedor, se lo activa si estaba detenido
docker stop ID_contenedor, se lo suspende si estaba activo.
Saludos.