
Hi, I'm Cristina Ramirez, I'm a computer engineer and software developer with more than 10 years of experience as backend developer, web application development, API REST services for mobile applications, system analysis and logic.
Programming languages: Ruby, PHP, C, C++, C#, CSS, JavaScript.
Frameworks: Ruby on Rails, PHP (Codeigniter, APPHP).
Experience of relational databases (Postgres, MySql, Oracle) and NoSQL databases (MongoDB, Neo4j).
I like innovation and teamwork.
¿Qué es un contenedor?
Es una forma de poder empaquetar nuestras aplicaciones y también todas las dependencias que tenga, incluyendo los archivos de configuración. Por lo tanto, generaremos un empaquetado que contendrá todo junto:
Código HTML.
Código NodeJs, Python, Java o otro lenguaje.
.env
Los contenedores tiene la ventaja de ser portables para compartir entre los desarrolladores y el equipo de operaciones, por lo cual, el desarrollo y despliegue es mucho mas fácil.
Capas de imágenes, la más baja es una distribución de linux.
¿Dondé se almacenan?
En los repositorios de contenedores que puede ser:
Privados.
Públicos como los de DockerHub. DockerHub contiene empaquetados de html, NodeJs, Postgresql, Python, Golang, MySQL, entre muchos otros.
Ventajas:
Misma versiones de trabajo para todos los desarrolladores, un equipo con el mismo ambiente de trabajo, los desarrolladores descargan una imagen con dependencias y archivos de configuración, luego ejecutan pocos comandos para empezar a trabajar.
El equipo de operaciones y desarrollo construyen una única imagen, luego los despliegues a producción son más rápido y casi automático.
Las imágenes pesan poco.
Docker es una forma de virtualización. Docker usa el kernel del sistema operativo que se esta ejecutando (anfitrión) y sólo se virtualiza la capa de aplicaciones, a diferencia de las máquinas virtuales en las cuales existe la capa del kernel además de la capa de aplicaciones.
¿Qué es una imagen?:
Es un empaquetado que contiene las dependencias y código que es lo que finalmente se comparte. El contenedor es la imagen que nosotros configuramos pero con la cual ejecutamos un comando que corre el código con sus variables de entorno.
Docker Desktop:
Es una máquina virtual optimizada que corre linux y permite ejecutar contenedores. Permite acceder al sistema de archivos y a la red. Trae varias herramientas como Docker Compose, CLI (command line interface). Puede correr. de manera nativa en windows con WSL2 = Windows Subsystem for Linux.
Instalación de Docker:
DockerHub:
En esta página podemos ver la configuración de cada imagen.
Comandos de Docker:
1.- Descarga una imagen, descargar la última versión disponible de la imagen de node sería con el comando:
docker pull node
Si quiere indicar una versión, por ejemplo, la versión 18 de node sería:
docker pull node:18
2.- Muestra todas las imágenes descargadas en mi computador. Cada imagen esta conformada por capas.
docker images
Repository: El nombre de la imagen que descargamos.
Tag: Etiqueta, muestra la versión.
Imagen ID: Identificador único.
Created: Cuando fue creada la imagen.
Size: Tamaño de la imagen.
3.- Elimina una imagen del computador.
docker image rm <id_image>
Por ejemplo:
docker image rm 0ebe7d6d8db4
4.- Crear un contenedor. Este comando crea un contenedor con la imagen base de node y retorna el ID del contenedor.
docker create node
O forma más larga:
docker container create node
Otro ejemplo indicando el puerto y el nombre del contenedor para poder referenciarlos posteriormente con el nombre:
docker create -p<puerto_anfitrion>:<puerto_contenedor_mapear> --name <nombre_contenedor> <nombre_imagen>:<etiqueta_version>
docker create -p80:81 --name myphp php:5.6.25-apache
5.- Inicia la ejecución del contenedor.
docker start <id_contenedor>
En el ejemplo:
docker start myphp
6.- Detener el contenedor.
docker stop <id_contenedor>
En el ejemplo:
docker stop myphp
7.- Mostrar los contenedores creados pero que no se están ejecutando.
docker ps
Mostrar contenedores creados y que se están ejecutando.
docker ps -a
8.- Historial de contenedor corriendo.
docker logs <id_contenedor o nombre_contenedor>
Forma de mostrar el historial y que se quede esperando para mostrar más información del historial del contenedor:
docker logs <id_contenedor o nombre_contenedor> --follow
9.- Docker run: Busca la imagen, si no la encuentra, descarga la image, crear el contenedor y lo ejecuta de una vez. Se agrega (-d) para indicar modo dettached, de esta forma no se quede mostrando el historial (logs), sino que nos devuelve a la línea de comando.
docker run --name <nombre_contenedor> -p<puerto_anfitrion>:<puerto_contenedor_mapear> -d <imagen:version>
Por ejemplo:
docker run --name phpcito -p80:80 -d php:5.6.25-apache
Red de contenedores:
Para que los contenedores puedan comunicarse entre sí, hay que crear una red.
10.- Listar las redes de contenedores, la forma de visualizar las redes existentes sería:
docker network ls
11.- Crear una red.
docker network create <nombre_red>
Por ejemplo:
docker network create mired
12.- Eliminar una red.
docker network rm mired
13.- Crear contenedores indicando la red:
Cuando no estamos haciendo uso de docker-compose lo ideal es crear los contenedores previamente asociandole una red, de esta manera se permite la comunicación entre los contenedores, por ejemplo:
docker pull postgres:9.6.24
docker create -p5432:5432 --name mipostgres --network mired -e POSTGRES_PASSWORD=postgres -e POSTGRES_USER=postgres -e POSTGRES_DB=midb postgres:9.6.24
docker pull php:7.1.27-apache-stretch
docker create -p8080:80 --name miphp --network mired php:7.1.27-apache-stretch
Si usa docker-compose la red se crea automáticamente.
Dockerfile
14.- Archivo dockerfile: El archivo se utiliza para escribir las configuraciones de nuestro contenedor y que este pueda crearse. Todas las imágenes que creemos se tiene que basar en otras imágenes.
FROM node:18 (Imagen base).
RUN mkdir -p /home/app (Indicar la carpeta donde vamos a meter el código fuente de nuestra aplicación dentro del contenedor).
COPY . /home/app (Toma los archivos de esta ruta del anfitrión / máquina local, y los copia a la ruta del contenedor indicada previamente).
EXPOSE 3000 (Exponer un puerto para conectarnos a este contenedor).
CMD ["node", "home/app/index.js"] (Comando que hay que ejecutar para que la aplicación se ejecute).
15.- Construir imagen: Para construir una imagen a partir del archivo Dockerfile se ejecuta docker build, debemos esta posicionados dentro de la carpeta donde esta el archivo Dockerfile para ejecutarlo:
docker build -t <nombre_asignar_imagen:etiqueta> .
Por ejemplo:
docker build -t miapp:1.0.0 .
16.- Volumen:
Parte de los archivos de tu contenedor puedes montarlos en el equipo anfitrión, para que estos datos no sean eliminados cada vez que elimines un contenedor y persistan en el tiempo. Muy útiles para mantener la base de dato. Ejemplo crear contenedor con volumen:
docker run --name miphp -p81:80 -d -v $(pwd)/src:/var/www/html/ php:5.6.25-apache
Docker-Compose
17.- Archivo docker-compose.yaml: Docker compose permite configurar varios contenedores en un solo archivo llamado docker-compose.yaml, este asigna una red automáticamente. Aquí un ejemplo de un archivo docker-compose que incluye contenedores de php-apache, postgresql y pgadmin:
version: "3.8"
services:
php:
build:
context: ./
dockerfile: Dockerfile
container_name: php-server
restart: always
ports:
- "8080:80"
volumes:
- ./sistema:/var/www/html
- ./config/php:/usr/local/etc/php
postgres:
image: postgres:11
container_name: postgres-server
restart: always
ports:
- "5432:5432"
environment:
- DATABASE_HOST=127.0.0.1
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=midb
volumes:
- ./postgres-data:/var/lib/postgresql/data
pgadmin:
image: dpage/pgadmin4
container_name: pgadmin-server
environment:
PGADMIN_DEFAULT_EMAIL: "admin@admin.com"
PGADMIN_DEFAULT_PASSWORD: "admin"
ports:
- "80:80"
depends_on:
- postgres
volumes:
sistema: {}
config: {}
postgres-data:
18.- Crear y ejecutar automáticamente los contenedores del archivo docker-compose:
docker-compose up -d
19.- Visualizar los contenedores que se están ejecutando con docker-compose:
docker-compose ps
20.- Detener y eliminar los contenedores que se están ejecutando con docker-compose:
docker-compose down
21.- Enviar un contenedor a Docker Hub:
a. Para subir un contenedor a docker hub lo primero es crear un usuario e iniciar sesión:
docker login
b. Posteriormente debe verificar las imágenes existente, en este caso, estas imágenes fueron creadas previamente a partir del llamado del docker-compose up -d:
docker images

c. Renombrar la imagen que desea subir, recuerde indicar su usuario, seguido del nombre que le dará a la imagen y la etiqueta (tag), esto creará una nueva imagen con los datos indicados:
docker tag app_academy_php delgadocris/php_apache_postgresql:1.0

d. Subir el contenedor (el proceso puede tardar unos minutos):
docker push delgadocris/php_apache_postgresql:1.0

e. Ir a docker hub y verificar que se haya creado la imagen. Puede editar la información adicional de esta nueva imagen en docker hub.

f. Para probar que este funcionando correctamente, puede intentar eliminar las imágenes en local y posteriormente descargarla de docker hub:
docker run --name php_apache_postgresql -p8081:80 -d delgadocris/php_apache_postgresql:1.0
O también puede editar el archivo docker-compose.yaml para incluir la nueva imagen personalizada por usted.

Posteriomente correr el comando siguiente y verificar que la aplicación se este ejecutando correctamente:
docker-compose up -d




