Cómo empezar a utilizar Docker correctamente

3 de diciembre de 2019

Lang: cs en de es

Docker ha proliferado. Es bueno aprenderlo (para un chico de Linux será pan comido). Pero también es necesario entenderlo y usarlo correctamente. También será bueno conocer algunas características avanzadas si estás construyendo contenedores Docker personalizados o resolviendo el rendimiento de Docker en un Mac o Windows.

Docker ha proliferado. Es bueno aprenderlo (para un chico de Linux será pan comido). Pero también es necesario entenderlo y usarlo correctamente. También será bueno conocer algunas características avanzadas, si estás construyendo tus propios contenedores Docker o resolviendo el rendimiento de Docker en Mac o Windows.

Este artículo es una guía o tutorial sobre cómo empezar con Docker. Describe cómo funciona Docker y cómo usarlo. Más adelante habrá tutoriales sobre usos específicos.
Quien necesite poner en marcha una aplicación en Docker y no esté interesado en la formación puede concertar una colaboración individual.

Docker es una de las tecnologías de visualización, concretamente de virtualización de contenedores. Es una virtualización que aprovecha las capacidades del kernel de Linux, por lo que Docker está diseñado principalmente para Linux. Pero de varias maneras también se puede hacer que funcione en Windows y Mac OS X, y a menudo se hace.

Una aplicación en Docker se ejecuta como un proceso del sistema que comparte la memoria y el núcleo del sistema. Debido a que el kernel es compartido, la aplicación sólo tiene que utilizar las características que tiene el kernel. Pero para la mayoría de las aplicaciones comunes, no se necesitan características especiales o nuevas.

En concreto, docker utiliza la virtualización. cgroups y espacios de nombres.

¿Para qué sirve Docker?

Puedes ejecutar y desarrollar aplicaciones sin Docker. Así que Docker no es necesario, pero hay algunos usos típicos para los que el despliegue de Docker es útil.

  • Pruebas
  • Aplicaciones de línea de comandos.
  • Aplicaciones de línea de comandos: el resultado es una aplicación completa que funciona. También puede ser una aplicación que se ejecuta utilizando wine.
  • Aplicaciones sin estado.
  • Aplicaciones sin estado.
  • Aplicaciones sin estado - necesidad de almacenar datos por separado usando volúmenes.
  • Desarrollo - Vagrant también se utiliza para esto, pero Docker ha sido el más popular. (Vagrant es una simple envoltura alrededor de la interfaz CLI de Virtualbox)
  • Docker es una herramienta de desarrollo.
  • Funcionamiento abierto - el entorno tal y como lo necesitas.
  • HA, escalado - solución con herramienta de orquestación, por ejemplo, Kubernetes.
  • Test, escalado rápido - solución con herramienta de orquestación, por ejemplo, Kubernetes.
  • Pruebas, migración rápida a nuevas versiones de software. Por ejemplo, actualización de PHP.
  • Isolución de problemas.
  • Isolución de la aplicación.
  • .
  • Migración.
  • Inicio rápido.
  • Inicio rápido.
  • .

Mientras escribo, Docker ha hecho muchos avances, especialmente con aplicaciones web. Pero para algunos usos es más adecuado, por ejemplo, Virtualbox. Además, para uso en Mac OS X y Windows, sería mejor VirtualBox, ya que el uso no nativo de Docker tiene problemas de rendimiento.

Para el experimentado Administrador de Linux no tendrá ningún problema en preparar un entorno reproducible en VirtualBox utilizando, por ejemplo Ansible

El entorno en Docker se ejecuta de forma aislada, por lo que la aplicación que se ejecuta en él no puede interferir con otras aplicaciones. También es posible crear un entorno único para cada aplicación. Es posible cambiar el entorno rápidamente, por ejemplo, para actualizar a nuevas versiones o para probar la aplicación en diferentes versiones de librerías.

Virtualización

Conoce los tipos de virtualización y las tecnologías específicas que implementan la virtualización en este vídeo:

Instalación del docker

Primero necesitas instalar Docker si tienes una distribución Linux de Mageia versión 6 o 7, Docker está en sus repositorios. Y así descarga el siguiente comando para instalar Docker:

urpmi docker
Para poder gestionar docker como un usuario normal necesitas unirte al grupo docker.

Docker en Debian

Docker no está incluido en la distribución Debian Linux. Por lo tanto, necesitamos añadir el repositorio oficial de Docker y entonces podremos instalar Docker.

En primer lugar, añadimos los certificados del repositorio:

curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
 

Crear un fichero de configuración del repositorio:
echo "deb https://download.docker.com/linux/debian $(lsb_release -cs) stable">> /etc/apt/sources.list.d/docker.list

Instalar Docker:
apt-get update && apt-get install docker-ce

Este comando te dirá si Docker se está ejecutando:
systemctl status docker

Fuente - instrucciones en inglés: cómo instalar y usar docker en debian 9 . Ya he hecho esto en Debian 10.s

Impresiones

Para familiarizarse con una nueva tecnología es necesario explicar los conceptos básicos.

Imagen

Una imagen es lo que representa un entorno preparado sin modificaciones locales. Desde el punto de vista de un programador podría llamarse una clase.

Contenedor

Un contenedor se puede comparar con una instancia de un Objeto. Es un entorno en ejecución creado a partir de una imagen y ya contiene los datos o modificaciones locales que creó.

En virtualización, la relación entre imagen y máquina virtual suele ser 1:1. En Docker, sin embargo, puedes ejecutar tantos contenedores como quieras desde una única imagen.

Docker compose

Docer-compose es una herramienta para definir cómo se ejecutan múltiples contenedores Docker, cómo deben configurarse y cómo deben enlazarse. La configuración de docker-compose se escribe en un archivo que está en formato YAML. Contiene información sobre qué contenedores deben lanzarse desde qué imágenes, qué volúmenes deben conectarse y cómo deben conectarse mediante una red virtual.

Kubernetes

Kubernetes es una herramienta de orquestación para docker y otras tecnologías similares. Esta herramienta controla y gestiona los contenedores para que se ejecuten según sea necesario. Los enciende y apaga automáticamente, etc.

Enjambre Docker

Docker swarm es herramienta de orquestación de Docker, actualmente se utiliza más Kubernetes.

Comandos de uso de Docker

Este comando descargará los datos y construirá una imagen docker de ejemplo para que la pruebes.

docker run hola-mundo

Listado de contenedores en ejecución:

docker ps
También puedes ver otra información sobre los contenedores, como qué puertos están mapeados desde la máquina local a cuál en el contenedor.

Listado de paneles existentes:

imágenes docker

En el Dockerfile puedes definir tu propia configuración para crear la imagen.
Por ejemplo.

FROM php:7.2.18-cli-alpine3.9
EJECUTAR php -v
CMD php -v

Construye la imagen según tu Dockerfile y nómbrala alpine-php72:
docker build -t alpine-php72 .alpine-php72

Este comando lanzará la imagen.
 docker run alpine-php72
Puedes notar que cuando se construye la imagen, se imprime la versión de PHP y luego cuando se ejecuta la imagen.

Puede buscar contenedores precompilados utilizando la interfaz web https://hub.docker.com/ o desde la consola usando el comando:

docker search NOMBRE

Así se inicia la consola, es decir, el intérprete bash en el contenedor con el ID e286a85fdcac:

docker exec -it e286a85fdcac /bin/bash

Esto iniciará el contenedor desde la imagen web y mapeará el puerto local 8080 al puerto 80 del contenedor:

docker run -ditp 8080:80 web
Así lo que se está ejecutando en el contenedor en el puerto 80 está disponible en localhost:8080.

Ejecutando el contenedor desde la imagen docketette-web-alpine, que también nombramos www y si ya existe un contenedor con ese nombre, se borra y se vuelve a crear uno limpio.

docker run -it --rm --name www -p 80:80 -p 9001:9001 dockette-web-alpine

Importancia de los switches

-t Asignar y pseudo-tty
-i Mantener STDIN abierto aunque no esté conectado
-d desacoplará nuestro terminal
-P publicará todos los puertos expuestos a puertos aleatorios y por último --name corresponde a un nombre que queramos darle. Ahora ya podemos ver los puertos ejecutando el comando docker port [CONTAINER]

Copiar, Añadir

Cuando das el comando COPY en un Dockerfile, copia el archivo local a la imagen. Esto es bueno para subir archivos de configuración u otros que se necesiten en el contenedor.

Copiar la configuración del virtualhost para el servidor web apache:

COPIAR site.conf /etc/apache2/sitios-disponibles/000-default.conf

El comando ADD funciona casi de la misma manera.

Volúmenes

Volumes es una forma de obtener datos locales en un contenedor para que puedas trabajar en ellos al mismo tiempo. Así que es ideal para el desarrollo donde editas archivos localmente y el contenedor tiene acceso a ellos para que puedas ejecutarlos de inmediato.

Un ejemplo donde puedes probar a usar volúmenes y verificar en el contenedor que lo que creas será visible en ambos lugares:

docker run -v /root/dir_contenedor:/root/host -i -t debian /bin/bash

Crear manualmente un volumen. La ubicación es en el disco según la configuración de docker.

docker volume create mi-volumen

Lista de volúmenes disponibles: docker volume ls

Muestra los detalles de un volumen determinado: docker volume inspect mi-volumen

Iniciando un contenedor docker con una distribución de Mageia 7 y adjuntando el volumen creado a /srv y ejecutando el shell en el contenedor: docker run --mount source=mi-vol,destination=/srv -it mageia7 /bin/bash

Si usted está resolviendo un problema de rendimiento volúmenes en Mac o Windows es una opción para tener la mayoría de las cosas bien en la ventana acoplable. O tener todo en el docker y acceder a sus datos. Si usted tiene un problema de rendimiento más grande hay una opción para elegir otro tipo de virtualización como Virtualbox.

Pero las cosas en torno a desarrollo y devops ya son para consulta personal.

Más sobre volúmenes de docker.

Consejos

Sólo una cosa pertenece a un contenedor.

Vídeo del primer uso del docker

Este vídeo explica los conceptos y comandos básicos y muestra cómo usar docker por primera vez.
.

Uso avanzado de Docker

Puedes definir variables de entorno

 ENV PHP_CLI_DIR=/etc/php/7.3/cli

Copiar el archivo al contenedor en ejecución:

docker cp foo.txt micontenedor:/foo.txt

Enlazar contenedores. Iniciar un contenedor con una base de datos y luego un contenedor con un proyecto que se conectará a la base de datos. docker run --name somemysql -e MYSQL_ROOT_PASSWORD=pass1234 -d mysql docker run --name algunproyecto --link somemysql:mysql -d proyecto - MYSQL_DATABASE=nombre_db

Si necesitas cargar algunos datos en DB una vez puedes usar uno de estos comandos:

cat temp.sql | pv | docker exec -i mysql.master /bin/mysql --init-command="SET autocommit=0;"
cat dump.sql | docker-compose exec -T  mysql -u  -p 

Cuando se trata de la inicialización de la base de datos, el contenedor MariaDB normal espera un archivo SQL de inicialización en /docker-entrypoint-initdb.d/dump.sql Así, por ejemplo, con el parámetro v (de volumen) se puede postfijar la conexión del fichero SQL de inicialización al contenedor docker.

-v./dump.sql:/docker-entrypoint-initdb.d/dump.sql

Los logs de cada contenedor están aquí: /var/lib/docker/containers/

Si el contenedor Docker se está ejecutando en segundo plano (típico de un servidor) así es como se conecta a STDOU:

 docker logs -f f6010bf5a375

Videa docker

Desarrollando una aplicación web PHP/Nette3 en Docker

Aquí tienes un vídeo-live stream que muestra el uso de Docker en el desarrollo de aplicaciones web:

Docker componer

En mi distribución Linux (Mageia 6), alguna colisión hizo que no pudiera instalar docker-compose (supongo que debido al sobredesarrollo de Docker), Así que me descargué docker-compose manualmente y lo integré en el sistema.

Comando para descargar, guardar y establecer permisos: curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" \ -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
Más información sobre instalación de docker-compose.

Configuración de docker compose

La configuración para docker-compose se escribe en el archivo docker-compose.yml. Allí se puede especificar desde qué imágenes iniciar qué contenedores. Cómo se deben mapear los volúmenes y puertos y qué otros valores de configuración se les debe pasar.

Esta configuración especifica que el Dockerfile está en el mismo directorio. Se especifica el nombre del contenedor origen y cómo se llamará la imagen. Se especifica el mapeo de puertos. La variable NETTE_DEBUG=1 es una variable de entorno que podemos utilizar para cargar una configuración de proyecto diferente en PHP.

versión: 3.6
  
services:

  web:
    build: ./
    imagen: linuxserveradmin
    nombre_contenedor: linuxserveradmin
    entorno:
     - NETTE_DEBUG=1
    volúmenes:
      - .:/srv

    puertos:
      - 8081:80

Ejecuta lo que has configurado en el archivo docker-compose de una sola vez con el comando:

docker-compose up

Borrar

Lista todos los contenedores docker:

docker inspect -f '{{ .Mounts }}' containerid
Eliminar la imagen:
docker rmi hello-world
Para eliminar todas las imágenes docker, utilice el siguiente comando:
docker rmi $(docker images -a -q) -f
Este comando borra todos los contenedores, redes, imágenes y cachés construidos: docker system prune -a

Caché

Docker almacena datos en caché y luego utiliza esos datos almacenados en caché. Por ejemplo, la imagen tiene información en caché sobre los paquetes en el repositorio. Pero cuando llega una actualización, los paquetes antiguos desaparecen, y cuando tu capa construye sobre esos datos en caché, intenta descargar lo que ya no existe. Por esto, es una buena idea tener un apt-get install antes de cada comando apt-get update que actualiza la información del repositorio.

Luego lo escribes en el Dockerfile de la siguiente manera:

RUN apt-get -qq update && apt-get install -y ........
Esos switches dicen que no uses el modo interactivo, porque docker lo ejecuta automáticamente.

Reconstruir imagen sin usar caché:

docker-compose build --no-cache

Inicio automático de contenedores

Desactiva el inicio automático del contenedor después de un reinicio:

docker update --restart=no 491dfa4b274a

Configurar el contenedor para que se inicie automáticamente al arrancar el equipo:
docker update --restart=yes 491dfa4b274a

O es necesario ejecutar el contenedor con el parámetro
 --restart always

Para la misma funcionalidad en el archivo YAML de docker-compose, especifique:
    restart:
      siempre

Docker y BTRFS

Yo uso el sistema de archivos BTRFS, que Docker aprovecha. De nuevo, este es un ejemplo de por qué usar Linux y por qué usar el sistema de archivos BTRFS y otras buenas tecnologías modernas que hacen el trabajo más eficiente.

Listar las capas que están en BTRFS es decir subvolumen, mostrar el comando:

 btrfs subvolume list /
Y he aquí que verás un montón de subvolumes que Docker ha creado.

Aplicaciones de la interfaz de usuario en Docker

También puedes ejecutar aplicaciones GUI en Docker. Aquí te mostraré la forma básica de ejecutar una aplicación GUI eyes.

Crea el siguiente archivo Dockerfile:

DESDE centos
RUN yum install -y xeyes
CMD ["/usr/bin/xeyes"]

Construye la imagen:
docker build -t gui-app .
Iniciar el contenedor de imagen y el programa en él:
docker run --net=host --env="DISPLAY" --volume="$HOME/.Xauthority:/root/.Xauthority:rw" gui-app

Ejecutar Adobe Acrobad Reader en Linux sin instalación - es decir, usando docker:

docker run --net=host --env="DISPLAY" --volume="$HOME/.Xauthority:/root/.Xauthority:rw" -v $HOME:/srv mgor/acroread

Docker - Desarrollo de aplicaciones web

Si estás desarrollando aplicaciones web, es una buena idea tener alguna imagen docker por defecto. He preparado una imagen de este tipo para ti. Para PHP8 he preparado imagen docker con PHP8. También hay otras imágenes preparadas por mí, con versiones anteriores de PHP por ejemplo la versión 5.6, 7.4 etc.

Si programas aplicaciones web en frameworks PHP Nette o Symfony, he preparado una imagen docker con configuración para estos frameworks. Así que sólo tienes que arrancar el contenedor docker y adjuntar el código fuente de la aplicación. Aquí está imagen docker para Nette y aquí está imagen docker para Symfony.

A continuación, basta con crear un archivo docker-compose.yml para iniciar el entorno de desarrollo. con el siguiente contenido/configuración:
version: <3.6

services:

  web:
    imagen: debian-apache-php8.0-nette
    nombre_contenedor: linuxserveradmin_web
    entorno:
     - NETTE_DEBUG=1
    directorio_de_trabajo: /var/www/html

    volúmenes:
      - .:/var/www/html
      - ./docker/desarrollo/web/msmtprc:/etc/msmtprc
    puertos:
      - 8081:80
      - 8082:443
El fichero msmtprc contiene la configuración para el envío de correo a través de un servidor SMTP externo. Y la imagen docker está configurada para que la función mail() de PHP envíe el correo automáticamente a través del servidor de correo externo configurado. Ver el artículo para más detalles cómo configurar el envío de correo en PHP en docker.

Formación

Para las empresas que quieren agilizar sus operaciones, puedo recomendar Docker. Y a través de Formación en Docker y la posterior colaboración juntos llevaremos Docker a la empresa.

Docker Hub

Vídeo sobre cómo crear una imagen docker y subirla a Docker Hub:

Para desarrollar proyectos en PHP en el framework Nette. o Symfony puedes usar imagen docker creada por mí que contiene todo lo necesario: apache, composer, PHP con módulos. Aquí está imagen docker para Symfony con PHP7.4 y imagen docker para Nette con PHP7.4. También uso estas imágenes docker en mi cursos de formación en desarrollo de aplicaciones web.

Windows y Docker

Puedes ejecutar Docker en Windows también, pero la instalación es más complicada y el rendimiento es más débil. Hay más formas de conseguir que Docker funcione en Windows:

Tutoriales de Docker

Enlaces y recursos

docker
centro de dockinger
docs docker

Otros recursos

https://dckr.cz/
docker-800-days-pote
vojta.kalcik.cz navody:docker
docker mariadb
iniciar-contenedores-automáticamente/
proc-powered-docker/

Nette en docker

nette en docker
nette es php 7.3 - Noviembre 2019 yo mismo, ya estoy corriendo Nette en PHP 7.4

Artículos sobre un tema similar

VMware frente a Proxmox: comparación de rendimiento
GitLab CI/CD: automatización de pruebas y despliegue de aplicaciones
Migración de VPS de VMware a Proxmox
Cambio en las licencias de VMware
Ejecución de Microsoft SQL Server en Linux
Copia de seguridad: el Proxmox Backup Server
Linux como router y cortafuegos
Cómo subir una imagen Docker al Registro Docker
Linux: gestión de volúmenes lógicos
Software RAID para Linux
Ejecutar una aplicación web detrás de un proxy
Migración de correo electrónico
Construcción multietapa Docker
Copia de seguridad de los datos al encender el ordenador
Podman
Importación de Windows a la virtualización Proxmox
Docker y correo PHP
Virtualización Proxmox
Docker y Cron
Lenovo ThinkPad X1 Carbon: puesta en servicio del módem LTE EM7544
Proyecto Yocto: Cree un sistema operativo personalizado para dispositivos integrados
Preparación de un servidor Linux para ejecutar una aplicación web en Python
Cómo solucionar el bajo rendimiento de los archivos compartidos en Docker
Instalación de Linux en un servidor HPE ProLiant DL320e dedicado
Cómo poner a prueba una aplicación web
Por qué utilizar el sistema de archivos JFS
Cómo arrancar desde un disco de 4TB con GTP usando UEFI
Sistema de archivos Btrfs
Raspberry PI
WINE - ejecución de programas Windous en Linux
Sistema operativo GNU/Linux

Boletin informativo

Si está interesado en recibir noticias puntuales por correo electrónico.
Puedes registrarte rellenando tu email suscripción de noticias.


+