Qué es Docker

¿Qué es Docker?

Docker para principiantes

Docker es un software de creación de contenedores que se utiliza para automatizar la implementación y la gestión de aplicaciones dentro de un entorno aislado. Este software nos permite “empaquetar” y enviar una aplicación, junto con todos sus archivos, bibliotecas y dependencias necesarios, en un “contenedor acoplable”.

Leer más

Ese contenedor se puede portar fácilmente a cualquier sistema Linux que contenga soporte de cgroups dentro del Kernel y proporcione un entorno de administración de contenedores. Docker es una de varias implementaciones de creación de contenedores (que no debe confundirse con la virtualización) basada en estos mecanismos de cgroups integrados en el Kernel de Linux

¿Qué son los CGroups?

Los CGroups (o grupos de control) y los espacios de nombres son mecanismos especiales en el Kernel de Linux que nos permiten aislar y virtualizar los recursos del sistema global de múltiples procesos.

Al ejecutar una aplicación dentro de este entorno aislado, el sistema debe asegurarse de que la aplicación tenga suficientes recursos. Debido a esto, debe conocer, rastrear, administrar, auditar y restringir la asignación de recursos para que las aplicaciones no consuman en exceso activos adicionales, lo que podría interrumpir el resto del sistema. Para resolver este problema, se introdujeron cgroups y espacios de nombres en el Kernel de Linux.

¿Por qué se creó Docker?

El punto interesante a tener en cuenta es que las implementaciones de contenedores, como la contenedorización LXC de Ubuntu, existían desde 2014. Entonces, ¿por qué se creó Docker?

Docker se desarrolló con la idea de que deberíamos poder transferir un contenedor entre cualquier tipo de servidor sin preocuparnos por las configuraciones o ajustes. Es importante tener en cuenta que podemos ejecutar la imagen de Docker en cualquier computadora, y debería funcionar igualmente bien sin cambios de configuración innecesarios.

Estas imágenes acoplables simplificadas funcionarán con cualquier contenedor, ya que es independiente de la plataforma.

¿Qué problemas resuelve Docker?

Debido a que Docker nos permite empaquetar una aplicación completa, se puede usar dentro de múltiples tipos de entornos de sistema, incluidas nubes privadas, clústeres de servidores o servidores principales privados.

Docker erradica el problema de la falta de código, archivos binarios o bibliotecas de dependencia de aplicaciones incompletas. También elimina la necesidad de configurar aplicaciones específicamente para un entorno de sistema operativo específico y elimina los problemas con las actualizaciones del sistema operativo que afectan a la aplicación.

Por último, hay más de 10 000 imágenes empaquetadas de Docker listas para usar que se pueden extraer y usar sin tener que crear y configurar nuevas aplicaciones en un sistema.

¿Qué es un contenedor?

Un contenedor es un tipo de entorno aislado con una aplicación que se ejecuta directamente en un sistema operativo y no en una máquina virtual, dentro de un único entorno que comparte el acceso a sus propios recursos, inaccesible para otros contenedores. Este enfoque ahorra tiempo de procesador y RAM en comparación con una máquina virtual. Linux originalmente tenía chroot y varios ambientes de prueba.

Funcionamiento del Dockerhttps://www.docker.com/resources/what-container

El contenedor virtualizado en sí está hecho de una imagen especialmente preparada, pero en Docker, el proceso es mucho más conveniente. Una imagen acoplable consta de varios componentes, que se pueden dividir en otras imágenes.

Los beneficios de la contenedorización y las opciones ahorran espacio en disco, ancho de banda de red y también reducen el tiempo de ensamblaje del contenedor a partir de la imagen. Por supuesto, también hay algunas desventajas involucradas. Dado que las aplicaciones se inician desde el Kernel del sistema operativo, no podemos seleccionar un sistema operativo diferente desde allí. La ventaja es que Docker se ejecutará en cualquier sistema operativo.

Objetivos del uso de Docker

Al principio, el objetivo de un sistema en contenedores como este era principalmente el aislamiento. Solomon Hykes, el creador de Docker, ideó un enfoque ligeramente diferente. Imaginó usar contenedores que pudieran implementar una aplicación, con todos los activos y atributos incluidos dentro del contenedor para evitar saturar el sistema operativo con programas adicionales.

Si un contenedor tuviera problemas, simplemente podríamos implementar una nueva versión del contenedor. ¡Él creó este proceso conveniente y sencillo, lo estandarizó y lo llamó Docker!

Podemos enviar un archivo de un contenedor a múltiples sistemas y todo funcionará igual que el programa original. Podemos compartir públicamente una imagen en un repositorio común de Docker Hub donde otros pueden descargar la imagen. También podemos subir nuestras imágenes allí. Si es importante mantener la imagen privada, simplemente podemos crear nuestro concentrador acoplable en una red local.

Instalación

Actualizar servidor

Primero, actualizamos nuestros paquetes de servidor.

root@host:~# apt-get -y update && apt-get -y upgrade
Hit:1 http://by.archive.ubuntu.com/ubuntu bionic InRelease
Hit:2 http://by.archive.ubuntu.com/ubuntu bionic-updates InRelease
Hit:3 http://by.archive.ubuntu.com/ubuntu bionic-backports InRelease
Get:4 http://security.ubuntu.com/ubuntu bionic-security InRelease [88,7 kB]
Fetched 88,7 kB in 1s (85,8 kB/s)
Reading package lists... Done
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
root@host:~#

Instalar Docker

A continuación, podemos instalar Docker

root@host:~# apt install docker.io
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following
packages will be installed:
bridge-utils cgroupfs-mount containerd git git-man liberror-perl pigz runc
ubuntu-fan
Suggested packages:
aufs-tools btrfs-progs debootstrap docker-doc rinse zfs-fuse | zfsutils
git-daemon-run | git-daemon-sysvinit git-doc git-el git-email git-gui gitk
gitweb git-cvs git-mediawiki git-svn
The following NEW packages will be installed:
bridge-utils cgroupfs-mount containerd docker.io git git-man liberror-perl
pigz runc ubuntu-fan
0 upgraded, 10 newly installed, 0 to remove and 0 not upgraded.
Need to get 68,5 MB of archives.
After this operation, 353 MB of additional disk space will be used.
Do you want to continue? [Y/n] Y
Get:1 http://by.archive.ubuntu.com/ubuntu bionic/universe amd64 pigz amd64 2.4-1 [57,4 kB]
Get:2 http://by.archive.ubuntu.com/ubuntu bionic/main amd64 bridge-utils amd64 1.5-15ubuntu1 [30,1 kB]...
Fetched 68,5 MB in 6s (10,7 MB/s)
Preconfiguring packages ...
Selecting previously unselected package pigz.
(Reading database ... 155677 files and directories currently installed.)...
Setting up git-man (1:2.17.1-1ubuntu0.7) ...
Setting up runc (1.0.0~rc10-0ubuntu1~18.04.2) ...
Setting up liberror-perl (0.17025-1) ...
Setting up cgroupfs-mount (1.4) ...
Setting up containerd (1.3.3-0ubuntu1~18.04.2) ...
Created symlink /etc/systemd/system/multi-user.target.wants/containerd.service → /lib/systemd/system/containerd.service.
Setting up bridge-utils (1.5-15ubuntu1) ...
Setting up ubuntu-fan (0.12.10) ...
Created symlink /etc/systemd/system/multi-user.target.wants/ubuntu-fan.service → /lib/systemd/system/ubuntu-fan.service.
Setting up pigz (2.4-1) ...
Setting up git (1:2.17.1-1ubuntu0.7) ...
Setting up docker.io (19.03.6-0ubuntu1~18.04.1) ...
Adding group `docker' (GID 127) ...
Done.
Created symlink /etc/systemd/system/sockets.target.wants/docker.socket → /lib/systemd/system/docker.socket.
docker.service is a disabled or a static unit, not starting it.
Processing triggers for systemd (237-3ubuntu10.39) ...
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
Processing triggers for ureadahead (0.100.0-21) ...
root@host:~#

Verificar la versión de Docker

Para verificar la versión de Docker instalada, usaremos el indicador “—version” para verificar que se instaló.

root@host:~# docker –version
Docker version 19.03.6, build 369ce74a3c
root@host:~#

Crear un usuario en Docker

Si no somos el usuario raíz en el sistema, debemos agregar nuestro nombre de usuario al grupo Docker para que no tengamos que agregar el comando sudo cada vez que ejecutamos un comando Docker.

cviteri@host:~$ sudo usermod -aG docker ${USER}
cviteri@host:~$

Para aplicar estos cambios al grupo, debemos cerrar sesión y volver a iniciar sesión en el servidor.

cviteri@host:~$ su - ${USER}
Password:
cviteri@host:~$

A continuación, nos aseguraremos de que nuestro usuario se agregue al grupo de Docker.

cviteri@host:~$ id -nG
cviteri adm cdrom sudo dip plugdev lpadmin sambashare docker
cviteri@host:~$

Probando Docker

Ahora, ejecutaremos el contenedor Docker “Hello World” para verificar que todo esté instalado y funcione como se esperaba usando el siguiente comando.

root@host:~# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:8e3114318a995a1ee497790535e7b88365222a21771ae7e53687ad76563e8e76
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image that runs the executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
root@host:~#

Como podemos ver en el resultado del comando anterior, Docker no pudo encontrar la imagen de Docker “Hello World”. Afortunadamente, Docker fue lo suficientemente inteligente como para extraer la imagen que faltaba y ejecutarla. Ahora, intentemos ejecutar el comando nuevamente.

root@host:~# docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image that runs the executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/
For more examples and ideas, visit:
 https://docs.docker.com/get-started/

¿Notas la diferencia? En la primera instancia, esperamos unos segundos, la segunda vez que se inició al instante. Esto se debe a que la primera vez, Docker no encontró la imagen, sino que la descargó y luego inició el programa. En la segunda instancia, cuando lanzamos la imagen del Docker “hello-world”, la descripción apareció en la terminal y no sucedió nada. Esto se debe a que, gracias al comando “run”, ejecutamos el programa, completó su tarea y finalizó.

Sintaxis de Docker

La sintaxis de Docker se ve así.

root@host:~# docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

Comandos Básicos de Docker

Todos los comandos se pueden encontrar en la documentación de Docker, y revisaremos y analizaremos algunos de los más básicos:

  • run – crea e inicia el contenedor
  • pull – sube una imagen del repositorio a nuestra computadora.
  • ps – ver contenedores en ejecución.
  • rm – eliminación de contenedores.
  • stop – detener un contenedor en ejecución.
  • start – iniciar un contenedor detenido.
  • exec – ejecutar un comando en un contenedor en ejecución.
  • cp – copiar archivos entre el contenedor y el sistema host.
  • info – estado del contenedor e información de configuración.
  • logs – registros de contenedores.
  • search – búsqueda de imágenes en el repositorio.

Uso de comandos de Docker

Ahora, ejecutaremos el comando Docker utilizando Ubuntu como software. Una vez que se completa el comando, nos encontramos dentro de una consola contenedora.

root@host:~# docker run -it ubuntu bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/Ubuntu
d51af753c3d3: Pull complete
fc878cd0a91c: Pull complete
6154df8ff988: Pull complete
fee5db0ff82f: Pull complete
Digest: sha256:747d2dbbaaee995098c9792d99bd333c6783ce56150d1b11e333bbceed5c54d7
Status: Downloaded newer image for ubuntu:latest
root@c6835d3c4e91:/#

A continuación, analizaremos con más detalle los indicadores utilizados.

  • -i modo interactivo
  • -t conectarse a la consola tty

Prestemos atención a este mensaje.

Unable to find image 'ubuntu:latest' locally

Como no especificamos qué versión de Ubuntu queremos ejecutar, Docker seleccionó automáticamente la última versión, luego la descargó y la lanzó. El comando también creó una nueva consola dentro del contenedor recién lanzado. Podemos salir de esa consola usando el comando “exit”.

Trabajando con contenedores

Comando “Uname”

root@c6835d3c4e91:/# uname -a
Linux c6835d3c4e91 5.3.0-51-generic #44~18.04.2-Ubuntu SMP Thu Apr 23 14:27:18 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
root@c6835d3c4e91:/#

Ingrese el comando uname en la terminal para el contenedor.

Este comando muestra la información sobre Ubuntu.

Comando “DMesg”

root@c6835d3c4e91:/# dmesg
dmesg: read kernel buffer failed: Operation not permitted
root@c6835d3c4e91:/#

Ahora ingrese el comando “dmesg”. Este comando nos permite imprimir o administrar el búfer de anillo del núcleo; sin embargo, debido a que no tenemos suficientes derechos para generar el comando “dmesg” como usuario, la operación no se permitió.

Aunque iniciamos sesión como usuario raíz dentro del contenedor, el contenedor en sí se ejecuta como un usuario que no tiene permiso para ver el registro del Kernel. Esto demuestra claramente que la propiedad del contenedor es diferente de la máquina virtual.

Comando “Exit”

root@c6835d3c4e91:/# exit
exit
root@cviteri-VirtualBox:/home/cviteri#

Podemos salir del contenedor usando el comando “exit”.

Comando “Run”

root@host:~# docker run -d -it Ubuntu
de84ba80507e71d81034a2eefabdde5d65520d6bee71ec38eb72cee299e7d382
root@host:~#

A continuación, ejecutemos el comando “docker” usando el indicador “-d”.

Este comando fue ejecutado y completado. No fuimos a la consola, pero recibimos una lista de caracteres en la salida. Este conjunto de caracteres es el identificador único real del contenedor.

Podemos ver los archivos de trabajo del contenedor si seguimos la ruta /var/lib/docker/set_our_characters.

Comando PS

Usando el comando PS, podemos ver la lista de todos los contenedores en ejecución en el motor acoplable.

root@host:~# docker ps
CONTAINER ID IMAGE  COMMAND     CREATED       STATUS       PORTS NAMES
de84ba80507e ubuntu "/bin/bash" 3 minutes ago Up 3 minutes awesome_pasteur
root@host:~#

Esta salida muestra la siguiente información:

  • CONTAINER ID – estos son los primeros 12 caracteres del identificador del contenedor. Es necesario direccionar el contenedor en este id.
  • IMAGE – este es el tipo de imagen que usamos para el contenedor.
  • COMMAND – el comando se especifica cuando se inicia el contenedor si no especificamos el comando, se ejecutará el comando predeterminado.
  • CREATED – la fecha en que se lanzó por primera vez el contenedor.
  • STATUS – muestra el estado del contenedor, si se está ejecutando, muestra cuánto tiempo ha estado funcionando. Si se detuvo, ¿cuándo se detuvo el código de salida?
  • PORTS – este parámetro se refiere a la red de contenedores. En resumen, al crear un contenedor, se crea una interfaz de red virtual y se agrega al conmutador virtual creado en base a Linux-bridge.
  • Nos comunicamos con el contenedor a través de la red a través de esta cuadrícula virtual. También podemos reenviar un puerto de contenedor a la máquina host cuando se inicia el contenedor. Estos puertos reenviados se reflejan en este campo. Dicho reenvío de puertos es conveniente porque no necesitamos conocer la dirección IP del contenedor en esta cuadrícula virtual.
  • NAMES – este es el nombre del contenedor. El contenedor tiene una identificación, pero es difícil de recordar y, por lo tanto, también introdujimos un parámetro como un nombre. Cuando la computadora se ejecuta con una docena de contenedores, será más fácil entender a qué nombre pertenece, especialmente si los contenedores se ejecutan desde la misma imagen.
    Cada vez que se inicia un comando de ejecución de la ventana acoplable, se crea un nuevo contenedor y no se guardan cambios dentro del contenedor anterior. Cuando ejecutamos “docker start”, el contenedor se reconstruye a partir de la imagen con todas sus capas. Dentro del contenedor, podemos usar el comando “rm -rf” y luego reiniciarlo, y todos los archivos de imagen predeterminados estarán en su lugar. Pero, esos archivos que se crean al trabajar en el contenedor desaparecerán. Docker puede reenviar una carpeta desde el sistema host al contenedor para que los cambios permanezcan residentes y no desaparezcan.

Lista de contenedores en ejecución

Ahora listaremos todos los contenedores usando el indicador -a que identifica todos los contenedores en ejecución.

root@host:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
de84ba80507e ubuntu "/bin/bash" 58 minutes ago Up 58 minutes awesome_pasteur
c6835d3c4e91 ubuntu "bash" About an hour ago Exited (1) About an hour ago interesting_turig
36d2ad21d7db hello-world "/hello" About an hour ago Exited (0) About an hour ago zen_ganguy
6bbc372dab1f hello-world "/hello" 2 hours ago Exited (0) 2 hours ago vigilant_diffie
root@host:~#

Lista de contenedores detenidos

Para mostrar una lista de contenedores que están desactivados, ingresamos el comando “docker ps” con el indicador “-f”.

root@host:~# docker ps -a -f status=exited
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c6835d3c4e91 ubuntu "bash" About an hour ago Exited (1) About an hour ago interesting_turig
36d2ad21d7db hello-world "/hello" 2 hours ago Exited (0) 2 hours ago zen_ganguly
6bbc372dab1f hello-world "/hello" 2 hours ago Exited (0) 2 hours ago vigilant_diffie
root@host:~#

La lista de contenedores que están apagados aún no es muy grande, sin embargo, más adelante en nuestra práctica, la lista puede ser bastante grande. Para eliminar un contenedor, podemos usar el comando “docker rm”.

Pero usar ese comando constituirá una gran cantidad de trabajo manual, por lo que usaremos el comando “docker rm” con el indicador -q que mostrará solo la identificación del contenedor. Luego, podemos seleccionar y trabajar fácilmente con los contenedores usando ese comando para eliminar todos los contenedores.

root@host:~# docker rm 
$(docker ps -a -q -f status=exited)
c6835d3c4e91
36d2ad21d7db
6bbc372dab1f
root@host:~#

Ahora veamos la lista de contenedores que se apagan usando el comando:

root@host:~# docker ps -a -f status=exited
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
root@host:~#

Pero en realidad, todavía tenemos un contenedor en ejecución. Lo revisaremos usando el comando “docker” con el indicador “ps”.

root@host:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
de84ba80507e ubuntu "/bin/bash" About an hour ago Up About an hour awesome_pasteur
root@host:~#

Comando “Attach”

Entonces, iniciamos este contenedor, pero no iniciamos sesión en la consola. Ahora ejecutaremos el comando “docker” con el indicador de conexión. Este comando nos registra en esa instancia en ejecución.

root@host:~# docker attach awesome_pasteur
root@b089f595d469:/#

Comando “Stop”

Ahora que nos hemos conectado a la consola de nuestro contenedor en ejecución, podemos detenerlo usando el comando “exit” para finalizarlo.

root@host:~# docker stop awesome_pasteur
awesome_pasteur
root@host:~#

Comando “Search”

Podemos usar el comando de búsqueda en la ventana acoplable para intentar encontrar una imagen específica que podamos necesitar. Veamos qué tipo de imágenes MySQL están disponibles usando el comando de búsqueda.

root@host:~# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation... 9484 [OK]
mariadb MariaDB is a community-developed fork of MyS... 3429 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create... 696 [OK]
centos/mysql-57-centos7 MySQL 5.7 SQL database server 75
mysql/mysql-cluster Experimental MySQL Cluster Docker images. Cr... 69
centurylink/mysql Image containing mysql. Optimized to be link... 61 [OK]
deitch/mysql-backup REPLACED! Please use http://hub.docker.com/r... 41 [OK]
bitnami/mysql Bitnami MySQL Docker Image 39 [OK]
tutum/mysql Base docker image to run a MySQL database se... 35
schickling/mysql-backup-s3 Backup MySQL to S3 (supports periodic backup... 30 [OK]
prom/mysqld-exporter 27 [OK]
linuxserver/mysql A Mysql container, brought to you by LinuxSe... 25
centos/mysql-56-centos7 MySQL 5.6 SQL database server 19
circleci/mysql MySQL is a widely used, open-source relation... 19
databack/mysql-backup Back up mysql databases to... anywhere! 17
mysql/mysql-router MySQL Router provides transparent routing be... 15
arey/mysql-client Run a MySQL client from a docker container 14 [OK]
openshift/mysql-55-centos7 DEPRECATED: A Centos7 based MySQL v5.5 image... 6
fradelg/mysql-cron-backup MySQL/MariaDB database backup using cron tas... 6 [OK]
genschsa/mysql-employees MySQL Employee Sample Database 5 [OK]
devilbox/mysql Retagged MySQL, MariaDB and PerconaDB offici... 3
ansibleplaybookbundle/mysql-apb An APB which deploys RHSCL MySQL 2 [OK]
jelastic/mysql An image of the MySQL database server mainta... 1
widdpim/mysql-client Dockerized MySQL Client (5.7) including Curl... 0 [OK]
monasca/mysql-init A minimal decoupled init container for mysql 0
root@host:~#

Ahora, si necesitamos una imagen mysql de la versión 5.6 para CentOS 7, seleccionamos centos / mysql-56-centos7. Podemos instalar la imagen desde el repositorio sin ejecutarla

root@host:~# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
54fec2fa59d0: Pull complete
bcc6c6145912: Pull complete
951c3d959c9d: Pull complete
05de4d0e206e: Pull complete
319f0394ef42: Pull complete
d9185034607b: Pull complete
013a9c64dadc: Pull complete
42f3f7d10903: Pull complete
c4a3851d9207: Pull complete
82a1cc65c182: Pull complete
a0a6b01efa55: Pull complete
bca5ce71f9ea: Pull complete
Digest: sha256:61a2a33f4b8b4bc93b7b6b9e65e64044aaec594809f818aeffbff69a893d1944
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
root@host:~#

Comando “Start”

A continuación, podemos iniciar el contenedor MySQL.

root@host:~# docker run -it mysql
2020-05-11 19:33:55+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.20-1debian10 started.
2020-05-11 19:33:55+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2020-05-11 19:33:55+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.20-1debian10 started.
2020-05-11 19:33:56+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD
root@host:~#

¡No pasó nada, pero nos dieron una pista!

2020-05-11 19:33:56+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD

Podemos configurar la contraseña de root para acceder a la base de datos nosotros mismos o confiarle al script que lo haga por nosotros. También es posible prohibir o permitir contraseñas vacías. Esto se hace usando variables que se escriben en mayúsculas. Para establecer una contraseña, usaríamos el siguiente comando.

root@host:~# docker run --name Project1.MySQL -e MYSQL_ROOT_PASSWORD=ellen -P -d mysql
10de0d398748a27da0ba19e5b55b11600aee9c52f4f5f35a7d693bb2deeea641
root@host:~#

Aquí hay un desglose de las banderas que usamos en ese comando.

  • –name: crea un nombre de base de datos al crear un contenedor
  • environment: – con este indicador establecemos la variable de contraseña cuando se inicia el contenedor
  • -P: es responsable de reenviar un puerto desde el contenedor a la máquina host. El uso de la bandera de mayúsculas al azar da el reenvío de puertos. Si necesitamos uno específico, lo hacemos así -p 2222: 22 esta bandera publicó el puerto host, luego el puerto contenedor.
  • -d: ejecuta el contenedor en segundo plano e imprime la ID del contenedor

Como tenemos un nombre de base de datos, podemos encontrar el puerto MySQL de nuestro contenedor que está usando.

root@host:~# docker port Project1.MySQL
3306/tcp -> 0.0.0.0:32771
33060/tcp -> 0.0.0.0:32770
root@host:~#

Otro punto importante; El parámetro de reenvío de puertos (de la máquina virtual a la máquina host) comienza con la dirección 0.0.0.0. Esto significa que el puerto se muestra en la máquina host en todas las interfaces de red y acepta solicitudes de todos.

Comando “Logging”

Ahora usaremos el siguiente comando de registro dentro del contenedor, que es muy útil para el diagnóstico.

root@host:~# docker logs Project1.MySQL
2020-05-11 19:38:12+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.20-1debian10 started.
2020-05-11 19:38:12+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2020-05-11 19:38:12+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.20-1debian10 started.
2020-05-11 19:38:12+00:00 [Note] [Entrypoint]: Initializing database files
2020-05-11T19:38:12.637104Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a future release.
2020-05-11T19:38:12.637221Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.20) initializing of server in progress as process 42
2020-05-11T19:38:12.652198Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2020-05-11T19:38:17.463918Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2020-05-11T19:38:20.230586Z 6 [Warning] [MY-010453] [Server] root@localhost is created with an empty password! Please consider switching off the --initialize-insecure option.
2020-05-11 19:38:29+00:00 [Note] [Entrypoint]: Database files initialized
2020-05-11 19:38:29+00:00 [Note] [Entrypoint]: Starting temporary server
2020-05-11T19:38:29.485259Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a future release.
2020-05-11T19:38:29.485431Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.20) starting as process 89
2020-05-11T19:38:29.521148Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2020-05-11T19:38:30.889054Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2020-05-11T19:38:31.216916Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: '/var/run/mysqld/mysqlx.sock'
2020-05-11T19:38:31.709888Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2020-05-11T19:38:31.740322Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
2020-05-11T19:38:31.778124Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.20' socket: '/var/run/mysqld/mysqld.sock' port: 0 MySQL Community Server - GPL.
2020-05-11 19:38:31+00:00 [Note] [Entrypoint]: Temporary server started.
Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it.
2020-05-11 19:38:40+00:00 [Note] [Entrypoint]: Stopping temporary server
2020-05-11T19:38:40.110433Z 10 [System] [MY-013172] [Server] Received SHUTDOWN from user root. Shutting down mysqld (Version: 8.0.20).
2020-05-11T19:38:42.043063Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.20) MySQL Community Server - GPL.
2020-05-11 19:38:42+00:00 [Note] [Entrypoint]: Temporary server stopped
2020-05-11 19:38:42+00:00 [Note] [Entrypoint]: MySQL init process done. Ready for start up.
2020-05-11T19:38:42.462522Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a future release.
2020-05-11T19:38:42.462711Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.20) starting as process 1
2020-05-11T19:38:42.496840Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2020-05-11T19:38:44.141457Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2020-05-11T19:38:44.452387Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: '/var/run/mysqld/mysqlx.sock' bind-address: '::' port: 33060
2020-05-11T19:38:44.620529Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2020-05-11T19:38:44.642722Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
2020-05-11T19:38:44.692891Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.20' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL.
root@host:~#
(Note: we have added spacing to improve viewing)

Comando “Inspect”

El siguiente comando mostrará la configuración detallada del contenedor en ejecución. Aquí podemos ver todo lo relacionado con el contenedor Docker de MySQL. Nota: Esto generará una GRAN cantidad de datos.

root@host:~# docker inspect Project1.MySQL
[
{
"Id": "10de0d398748a27da0ba19e5b55b11600aee9c52f4f5f35a7d693bb2deeea641",
"Created": "2020-05-11T19:38:09.822005568Z",
"Path": "docker-entrypoint.sh",
"Args": [
"mysqld"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 12026,
"ExitCode": 0,
"Error": "",
"StartedAt": "2020-05-11T19:38:12.042161194Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:a7a67c95e83189d60dd24cfeb13d9f235a95a7afd7749a7d09845f303fab239c",
"ResolvConfPath": "/var/lib/docker/containers/10de0d398748a27da0ba19e5b55b11600aee9c52f4f5f35a7d693bb2deeea641/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/10de0d398748a27da0ba19e5b55b11600aee9c52f4f5f35a7d693bb2deeea641/hostname",
"HostsPath": "/var/lib/docker/containers/10de0d398748a27da0ba19e5b55b11600aee9c52f4f5f35a7d693bb2deeea641/hosts",
"LogPath": "/var/lib/docker/containers/10de0d398748a27da0ba19e5b55b11600aee9c52f4f5f35a7d693bb2deeea641/10de0d398748a27da0ba19e5b55b11600aee9c52f4f5f35a7d693bb2deeea641-json.log",
"Name": "/Project1.MySQL",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "docker-default",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"CapAdd": null,
"CapDrop": null,
"Capabilities": null,
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "private",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": true,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"ConsoleSize": [
0,
0
],
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": [],
"BlkioDeviceReadBps": null,
"BlkioDeviceWriteBps": null,
"BlkioDeviceReadIOps": null,
"BlkioDeviceWriteIOps": null,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
]"Devices": [],
"DeviceCgroupRules": null,
"DeviceRequests": null,
"KernelMemory": 0,
"KernelMemoryTCP": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": false,
"PidsLimit": null,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0,
"MaskedPaths": [
"/proc/asound",
"/proc/acpi",
"/proc/kcore",
"/proc/keys",
"/proc/latency_stats",
"/proc/timer_list",
"/proc/timer_stats",
"/proc/sched_debug",
"/proc/scsi",
"/sys/firmware"
],
"ReadonlyPaths": [
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
]
},
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/3882aacffce3543db691b71ca4e475b8ce3b52be69b52600bac2776547d77002-init/diff:/var/lib/docker/overlay2/f4a9198e2b09aa276a470ac4eb5f500590c89e3628552a8cb46c4e5e0260d102/diff:/var/lib/docker/overlay2/c4adca2b3163496e2ac04a6b023c41c50f8dfddfbe966f3fd2dcf1d19d3629f8/diff:/var/lib/docker/overlay2/6c50572970f7e9a0241d21ba2ac105a3e90cf734c5f3325119834b268cccc2a1/diff:/var/lib/docker/overlay2/ec5aab1f09c7eed68399363afd202d3e1b991a856c8527003ae497c9b37b80bb/diff:/var/lib/docker/overlay2/321d286ec329f8ed36f6fedfa65387c9ad3a6de5d192d27e1cd43a9efc0ea003/diff:/var/lib/docker/overlay2/6393fe5f99f7bb6ef798d5e7e69add3572f545a5a58d6dfc7f745caedcf5d91b/diff:/var/lib/docker/overlay2/2e26a48961ce5ea41f1104e838c77d86648667623f4e3364433ddcbd286df594/diff:/var/lib/docker/overlay2/10e04f695a94d89a58c8464524adab3262202c0e66db4b32d21ce407148523d2/diff:/var/lib/docker/overlay2/1d8c025d18d1a55b317a464552f0e834c5c21a4abfa3e5983489a43eb648f3e7/diff:/var/lib/docker/overlay2/93e34d1d135455553370c57fbe79355661ac605eb9936ed6246c766bb6687c71/diff:/var/lib/docker/overlay2/09115b618288a320f7d0dab773a6f2824d7a832b6844532824c42f0c3f36be3a/diff:/var/lib/docker/overlay2/9385e9e66b48468eba82867e9b8783ae2362688e8be153e850e8360dc75ddc70/diff",
"MergedDir": "/var/lib/docker/overlay2/3882aacffce3543db691b71ca4e475b8ce3b52be69b52600bac
776547d77002/merged",
"UpperDir": "/var/lib/docker/overlay2/3882aacffce3543db691b71ca4e475b8ce3b52be69b52600bac2
76547d77002/diff",
"WorkDir": "/var/lib/docker/overlay2/3882aacffce3543db691b71ca4e475b8ce3b52be69b52600bac27
6547d77002/work"
},
"Name": "overlay2"
},
"Mounts": [
{
"Type": "volume",
"Name": "7b2e8ee4837513ecc3bbc03803b542611975622ad5a2f39352457560717010fd",
"Source": "/var/lib/docker/volumes/7b2e8ee4837513ecc3bbc03803b542611975622ad5a2f3935245756
717010fd/_data",
"Destination": "/var/lib/mysql",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
"Config": {
"Hostname": "10de0d398748",
"Domainname": "",
"User": ""
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"3306/tcp": {},
"33060/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"MYSQL_ROOT_PASSWORD=ellen",
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"GOSU_VERSION=1.12",
"MYSQL_MAJOR=8.0",
"MYSQL_VERSION=8.0.20-1debian10"
],
"Cmd": [
"mysqld"
],
"Image": "mysql",
"Volumes": {
"/var/lib/mysql": {}
},
"WorkingDir": "",
"Entrypoint": [
"docker-entrypoint.sh"
],
"OnBuild": null,
"Labels": {}
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "526463f58f908b63569038509da04fb0d5813ff0d56db591434ddbd496c71913",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
"3306/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "32771"
}
],
"33060/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "32770"
}
]
},
"SandboxKey": "/var/run/docker/netns/526463f58f90",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "10c8b1b0f62439d05ea147b6139d6a8302f4555eec071cbb02327d969dda6f0d",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "e93127c6d3efe1360f68a9e0c1da0ec7d4c9619ef8a9f4a689ecb3f30d4ecc5c",
"EndpointID": "10c8b1b0f62439d05ea147b6139d6a8302f4555eec071cbb02327d969dda6f0d",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}
}
}
}
]
root@host:~#

Conclusión

En este tutorial, aprendimos qué es la contenedorización de Docker, cómo funciona y por qué ahora casi todas las grandes empresas que dependen de una plataforma estable la utilizan. Docker utiliza la virtualización para proporcionar paquetes de software que se encuentran en contenedores.

Estos contenedores están separados entre sí para que si una parte de un sistema falla, no afecte al resto del sistema. También puede activar una nueva imagen de la ventana acoplable para reemplazar el contenedor fallido casi al instante, lo que limita el tiempo de inactividad y aumenta la estabilidad general del sistema.

Estos contenedores agrupan todo el software, las bibliotecas y los archivos de configuración necesarios para ejecutar el software. Además, los contenedores pueden comunicarse entre sí a través de redes definidas. En general, Docker ahorra tiempo, dinero y valiosos recursos.

Deja un comentario

Ir arriba