Skip to main content

Command Palette

Search for a command to run...

Docker

Explicación de docker y algunos comandos.

Updated
•7 min read•View as Markdown
Docker
C

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:

www.docker.com

DockerHub:

https://hub.docker.com/

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

37 views