Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 13

Introducción Docker.

Problemática.
Docker fue creado en 2013 por Solomon Hykes y su equipo como una respuesta a los
problemas de incompatibilidad y complejidad que surgen:

Mover aplicaciones entre diferentes entornos, como por ejemplo entre entornos de
desarrollo, pruebas y producción.

Problemas de compatibilidad de versiones: Entre el sw propio y de compañeros de


trabajo de equipo.
Docker permite a los desarrolladores puedan empaquetar las aplicaciones junto con todas
sus dependencias y bibliotecas en un contenedor, lo que facilita la portabilidad y la
ejecución de aplicaciones en diferentes entornos de trabajo y/o equipos de trabajo de forma
consistente y confiable.

Ejemplo Mover aplicaciones entre diferentes entornos.


Hace unos meses estuve trabajando en una funcionalidad para la plataforma de EDteam,
para la cual estaba utilizando la versión 13 de Go, yo subí mis cambios al repositorio, estos
fueron revisados y fusionados, pero, cuando mis compañeros bajaron los cambios e
intentaron compilar la aplicación, les generó una serie de errores debido a que estaban
utilizando una versión desactualizada de Go, por lo cual les tocó actualizar a la última
versión para que así la aplicación compilara. Pudo ser el caso, en que ellos estuvieran
trabajando en otro proyecto que requiriera específicamente la versión que estaban usando,
y hubiesen tenido que instalar a la par la nueva versión de Go, lo cual hubiese podido
generar "problemas", problemas los cuales pudieron ser evitados si hubiésemos estado
utilizando Docker.

Ejemplo Problemas de compatibilidad de versiones.


Imagina que tienes una aplicación web desarrollada en tu entorno local que se ejecuta en
un servidor web Apache con PHP 7.4, una base de datos MySQL y una cola de mensajes
RabbitMQ.

Además, la aplicación utiliza ciertas bibliotecas y módulos de software específicos que no


están disponibles en los repositorios predeterminados de tu sistema operativo. Ahora,
supongamos que deseas migrar esta aplicación a un servidor de producción en la nube que
utiliza una distribución diferente de Linux, con una versión más reciente de PHP (8.0), una
versión diferente de MySQL y una cola de mensajes diferente (por ejemplo, Kafka), la
infraestructura de red y seguridad puede ser diferente, lo que puede requerir cambios
adicionales en la configuración.

Método de trabajo.

● El desarrollador 1 desarrolla y prueba la aplicación en su entorno local de desarrollo.


El desarrollador 1 crea una imagen de contenedor que incluye la aplicación y todas
las dependencias necesarias.
● El desarrollador 1 sube la imagen de contenedor al registro de contenedores o al
control de versiones, como Git.
● El desarrollador 2 descarga la imagen de contenedor y la ejecuta en su entorno local
de desarrollo.
● El desarrollador 2 agrega la funcionalidad necesaria a la aplicación y prueba los
cambios en el contenedor.
● El desarrollador 2 crea una nueva imagen de contenedor que incluye la aplicación
actualizada y todas las dependencias necesarias.
● El desarrollador 2 sube la nueva imagen de contenedor al registro de contenedores
o al control de versiones, como Git.
● De esta manera, los desarrolladores pueden trabajar en diferentes máquinas y
sistemas operativos sin tener que preocuparse por las diferencias en los entornos de
desarrollo.
Al utilizar contenedores, pueden estar seguros de que la aplicación se ejecutará de la
misma manera en todas las máquinas donde se ejecute el contenedor.

Misma Metodo pero Sistema Operativo Ubuntu y python:3

El nuevo método de trabajo utilizando un contenedor de Ubuntu y Python 3 podría ser el


siguiente:
● El desarrollador 1 desarrolla y prueba la aplicación en su entorno local de desarrollo,
utilizando un contenedor de Ubuntu y Python 3.
● El desarrollador 1 crea una imagen de contenedor que incluye la aplicación y todas
las dependencias necesarias.
● El desarrollador 1 sube la imagen de contenedor al registro de contenedores o al
control de versiones, como Git.
● El desarrollador 2 descarga la imagen de contenedor y la ejecuta en su entorno local
de desarrollo, también utilizando un contenedor de Ubuntu y Python 3.
● El desarrollador 2 agrega la funcionalidad necesaria a la aplicación y prueba los
cambios en el contenedor.
● El desarrollador 2 crea una nueva imagen de contenedor que incluye la aplicación
actualizada y todas las dependencias necesarias.
● El desarrollador 2 sube la nueva imagen de contenedor al registro de contenedores
o al control de versiones, como Git.

Este nuevo método de trabajo permite a los desarrolladores trabajar en diferentes máquinas
y sistemas operativos, siempre y cuando usen un contenedor de Ubuntu y Python 3. De
esta manera, se garantiza que la aplicación y todas sus dependencias estén disponibles en
el contenedor y funcionen correctamente, independientemente del sistema operativo
subyacente. Además, la utilización de contenedores también simplifica el proceso de
instalación de las dependencias y configuración del entorno de desarrollo, lo que agiliza el
proceso de desarrollo y aumenta la productividad.

Docker Run.
Cada vez que ejecutas el comando docker run, se crea un nuevo contenedor a partir de la
imagen especificada en el comando. Un contenedor de Docker es una instancia en tiempo
de ejecución de una imagen Docker.

docker run nombreImagen

Cada contenedor tiene:


● Su propio sistema de archivos aislado.
● Su propia configuración de red.
● Se ejecuta como un proceso independiente en el host.

Vamos a aclarar estos puntos:

Su propio sistema de archivos aislado: Cada contenedor tiene su propio sistema de


archivos aislado del host y de otros contenedores. Esto significa que los archivos y
directorios dentro del contenedor no son visibles ni accesibles desde fuera del contenedor.
El sistema de archivos aislado permite que cada contenedor tenga su propio conjunto de
aplicaciones, bibliotecas y configuraciones, lo que hace que sea más fácil y eficiente para
los desarrolladores crear, probar y distribuir aplicaciones.

Su propia configuración de red: Cada contenedor tiene su propia configuración de red


aislada de otros contenedores y del host. Esto significa que cada contenedor tiene su propia
dirección IP y su propia interfaz de red, lo que le permite interactuar con otros contenedores
y con el host de forma independiente. Los contenedores pueden estar conectados a redes
virtuales internas o externas para permitir la comunicación entre ellos o con otros sistemas
fuera del contenedor.

Se ejecuta como un proceso independiente en el host: Cada contenedor se ejecuta


como un proceso independiente en el host, lo que significa que tiene su propio espacio de
usuario y recursos de sistema asignados. Esto permite que los contenedores se inicien y se
detengan de forma independiente, lo que los hace más flexibles y escalables que las
máquinas virtuales. Además, los contenedores pueden compartir el mismo kernel del
sistema operativo del host, lo que los hace más eficientes en el uso de recursos que las
máquinas virtuales.

Cuando decimos que cada contenedor "tiene su propio espacio de usuario y recursos de
sistema asignados", nos referimos a que el contenedor tiene un espacio de usuario y
recursos de sistema asignados de forma exclusiva para su funcionamiento, lo que incluye la
asignación de CPU, memoria, espacio de almacenamiento y otros recursos del sistema. En
otras palabras, el sistema operativo subyacente es el que proporciona los recursos del
sistema a cada contenedor, pero cada contenedor tiene su propio conjunto de recursos
asignados que son exclusivos para su uso.

Estos recursos son gestionados por el sistema operativo del host y están disponibles para
los procesos que se ejecutan dentro del contenedor, lo que permite que los contenedores se
ejecuten como procesos independientes en el host. Por lo tanto, los recursos asignados a
un contenedor no son compartidos con otros contenedores o procesos del host, lo que
permite una mayor eficiencia y aislamiento en la ejecución de diferentes aplicaciones o
servicios en un entorno de contenedores.

Hello-world Docker.
Cada contenedor es una instancia única e independiente que puede ser iniciada, detenida y
eliminada por separado. Entonces, cada vez que ejecutas el comando docker run, se crea
un nuevo contenedor a partir de la imagen especificada. Sino especifica la versión se
descarga la última versión de la imagen.

Cuando se ejecuta este comando, Docker si no está presente la imagen en el host local,
buscará la imagen "nombre_imagen" en el registro (registry) predeterminado de Docker y la
descarga, También podemos descargar la imagen manualmente desde dockerhub en el
margen derecho se puede ver el comando docker pull nombre_imagen que se debe
ingresar en la terminal del host local. Esto descargara la imagen en la carpeta
/var/lib/docker. en linux y en windows en la carpeta C:\ProgramData\Docker.
Opcional (Descargar la imagen en el host local).
docker pull nombre_imagen

El comando sudo docker run hello-world es uno de los comandos más básicos que se
pueden ejecutar en Docker. Este comando se utiliza para descargar y ejecutar la imagen
"hello-world" de Docker. Cuando se ejecuta este comando, Docker buscará la imagen
"hello-world" en el registro (registry) predeterminado de Docker y la descarga, si no está
presente en la máquina. Luego, Docker creará un nuevo contenedor a partir de esta imagen
y lo ejecutará. El contenedor imprimirá un mensaje simple en la consola y luego se detendrá
automáticamente.

También tenemos la bandera --rm, sino agregamos la bandera --rm el contenedor no se


eliminará automáticamente cuando se detenga y seguirá existiendo en el sistema. Por lo
tanto, es importante asegurarse de que no estés creando contenedores innecesarios que
consumen recursos innecesarios en tu sistema. Este comando es útil para verificar que
Docker está instalado y funcionando correctamente en una máquina. Si la imagen
"hello-world" se ejecuta correctamente, significa que Docker está configurado correctamente
y está listo para ejecutar otras imágenes y contenedores.
docker run hello-world --rm

Cada contenedor tiene su propio ID único, que se puede ver ejecutando el comando:
docker ps para listar todos los contenedores. Además si agregamos el comando -a se
listarán contenedores activos e inactivos.
docker ps -a
Podemos ver que nos sugiere el comando para correr un contenedor ubuntu (Sistemas
operativo distribución de linux) en una máquina windows. Esto es posible gracias a docker.

Sistema operativo Ubuntu (Distribución de Linux).


El comando sudo docker run -it ubuntu bash ejecuta un contenedor de Docker utilizando la
imagen "ubuntu" y te conecta a su shell interactivo utilizando el comando "bash". Este
comando utiliza dos opciones:
● it: Esta opción inicia el contenedor en modo interactivo (interactivo tty). Esto significa
que podrás interactuar con el contenedor a través de la terminal y el teclado.
● bash: Este comando especifica que el shell utilizado dentro del contenedor será
Bash. Es decir, una vez que se inicie el contenedor, se abrirá automáticamente un
shell Bash para que puedas interactuar con él.

Entonces al ejecutar este comando, Docker descargará la imagen "ubuntu" desde Docker
Hub si aún no la tienes en tu sistema local. A continuación, creará un contenedor a partir de
la imagen y te conectará a su shell interactivo utilizando Bash.

Desde el shell interactivo, podrás ejecutar comandos en el contenedor de Ubuntu como si


estuvieras trabajando en una terminal de Ubuntu local. Una vez que hayas terminado de
trabajar en el contenedor, puedes salir del shell Bash utilizando el comando exit y el
contenedor se detendrá automáticamente.
sudo docker run -it ubuntu bash

Servidor web - Nginx:1.17-alpine


Vamos a correr un contenedor de un servidor web con páginas estáticas.
Si no lo tiene en tu host la imagen del servidor web nginx, el demon docker lo buscara en
registry (Repositorio de imagen), lo buscara y la descargara.
sudo docker run nginx:1.17-alpine

Ahora como lo expongo, le pasamos al comando una bandera para exponerlo -p 80:80.
Una vez que el contenedor se ejecuta correctamente, puedes acceder a la página de
bienvenida de Nginx en un navegador web visitando la dirección IP del contenedor en el
puerto 80 (por ejemplo, http://<dirección IP del contenedor>:80).
sudo docker run -p 80:80 nginx:1.17-alpine

La diferencia entre los comandos "sudo docker run nginx:1.17-alpine" y "sudo docker run -p
80:80 nginx:1.17-alpine" es que el segundo comando utiliza la opción "-p" para especificar la
asignación de puertos entre el host y el contenedor de Docker. Específicamente, el
comando "sudo docker run -p 80:80 nginx:1.17-alpine" mapea el puerto 80 del contenedor
de Docker al puerto 80 del host. Esto significa que cualquier tráfico que llegue al puerto 80
del host se redirigirá automáticamente al puerto 80 del contenedor de Docker, permitiendo
que los usuarios accedan al servicio web que se ejecuta en el contenedor.
Podemos ver que está corriendo, el demon docker, además de correr imágenes puede
hacer el manejo de redes. Vamos a ver si nginx está corriendo. Esto podemos verlo con el
comando sudo docker ps.
sudo docker ps

También podemos manejar las redes, revisamos la ip con el comando ipconfig de host local
en la terminal de windows.
Terminal de Windows:
ipconfig

El puerto 80 es el puerto predeterminado para HTTP y es el puerto en el que la mayoría de


los servidores web, incluido Nginx, escuchan las solicitudes de los clientes web. Por lo
tanto, cuando se ejecuta un contenedor de Nginx y se desea acceder a la página de
bienvenida de Nginx, se debe usar la dirección IP del contenedor y el puerto 80 para
comunicarse con el servidor Nginx dentro del contenedor.

Sudo es para linux para un superusuario/root, podemos usar un comando para que el
usuario actual (User) pueda usarlo sin sudo. Para que se apliquen los cambios hay que
cerrar sesión y volver a entrar.
sudo usernod -aG docker $User,

Logs, Puertos y Procesos.


"Docker ps" es un comando de la línea de comandos de Docker que se utiliza para listar los
contenedores Docker que están en ejecución actualmente en un host de Docker (El host
que tiene instalado docker).

La salida de este comando incluye información relevante sobre cada contenedor, como:
● ID,
● nombre,
● estado,
● puerto(s) expuesto(s),
● imagen,

El comando "docker ps" también acepta una serie de opciones que permiten personalizar la
salida del comando:
● "docker ps -a" que lista todos los contenedores (independientemente de su estado)
● "docker ps -q" que lista solo los IDs de los contenedores.

docker ps

El comando "docker run -d --name mi-nginx nginx" se utiliza para crear un nuevo contenedor
Docker a partir de la imagen "nginx" y ejecutarlo en segundo plano en el host de Docker.
Aquí hay una descripción detallada de los parámetros utilizados en este comando:
docker run -d --name mi-nginx nginx
● "docker run": es el comando utilizado para crear y ejecutar un nuevo contenedor
Docker.
● "-d": es una opción que indica que el contenedor debe ejecutarse en segundo plano
(modo "daemon").
● "--name mi-nginx": Es una opción que establece el nombre del contenedor como
"mi-nginx".
● "nginx": es el nombre de la imagen base que se utilizará para crear el contenedor.

Hacemos el comando docker ps y podemos ver el contenedor creado:


docker ps
El comando "docker logs mi-nginx" se utiliza para ver los registros (logs) generados por el
contenedor Docker llamado "mi-nginx". Aquí hay una descripción detallada de los
parámetros utilizados en este comando:
● "docker logs": es el comando utilizado para ver los registros de un contenedor
Docker.
● "mi-nginx": es el nombre del contenedor del que se desea ver los registros (Salida).

docker logs mi-nginx

El comando "docker top mi-nginx" se utiliza para ver los procesos en ejecución dentro del
contenedor Docker llamado "mi-nginx". Aquí hay una descripción detallada de los
parámetros utilizados en este comando:
● "docker top": es el comando utilizado para ver los procesos en ejecución dentro de
un contenedor Docker.
● "mi-nginx": es el nombre del contenedor del que se desean ver los procesos.

docker top mi-nginx

El comando "docker exec mi-nginx ls" se utiliza para ejecutar:


● El comando "ls" (listar contenido del directorio) dentro del contenedor Docker
llamado "mi-nginx".
● El comando "docker exec" se utiliza para ejecutar un comando dentro de un
contenedor de Docker en ejecución. Con este comando, puedes interactuar con el
sistema de archivos del contenedor y ejecutar comandos en su interior.

Los archivos que se muestran en la salida de "ls" probablemente serán los archivos de
configuración y los archivos de contenido web necesarios para que el servidor web Nginx se
ejecute correctamente.

docker exec mi-nginx ls


En Docker, para crear una carpeta dentro de un contenedor, puedes utilizar el comando
"docker exec" para poder ejecutar el comando "mkdir" que crea una carpeta llamada hola
dentro del contenedor que tiene corriendo un servidor web.
docker exec mi-nginx mkdir hola
00:08:22 Falta

El comando "docker exec -it mi-nginx bash" se utiliza para abrir una sesión de terminal
interactiva dentro del contenedor Docker llamado "mi-nginx".
Aquí hay una descripción detallada de los parámetros utilizados en este comando:
● "docker exec": es el comando utilizado para ejecutar un comando dentro de un
contenedor Docker en ejecución.
● "-it": son dos opciones combinadas que indican que se desea una sesión interactiva
en la terminal del contenedor.
● "mi-nginx": es el nombre del contenedor en el que se desea ejecutar el comando.
● "bash": es el comando que se desea ejecutar dentro del contenedor para abrir una
sesión de terminal.
Al ejecutar este comando, se abrirá una sesión de terminal dentro del contenedor "mi-nginx"
que permitirá al usuario interactuar con el sistema operativo del contenedor de la misma
manera que si estuviera en una terminal local de su propia máquina.

Una vez dentro del contenedor, se puede utilizar cualquier comando de terminal válido. Esto
es útil para depurar problemas o errores que pueden estar ocurriendo dentro del
contenedor, ya que permite al usuario interactuar con el sistema operativo y realizar
cualquier operación que pueda ser necesaria.
docker exec -it mi-nginx bash
Frenar contenedor
docker stop mi-nginx

Mostrar contenedores parados y activos.


docker ps -a

Eliminar contenedor
docker --rm mi-nginx

Eliminar una vez que se detiene el contenedor.


docker run -d --rm --name mi-nginx nginx

Exponer el puerto del contenedor para el uso, las peticiones redireccionan del puerto 8000
al 80. El comando docker run -d --rm -p 8000:80 --name mi-nginx nginx mapea el puerto 80
del contenedor de Nginx al puerto 8000 de la máquina local. Entonces, cuando ejecutes ese
comando y accedas a http://localhost:8000 en tu navegador web, estás accediendo a la
instancia de Nginx que se está ejecutando dentro del contenedor en el puerto 80, pero a
través del puerto 8000 en la máquina host.

En otras palabras, el puerto 8000 es el puerto de la máquina local que se asocia con el
puerto 80 del contenedor de Nginx. Por lo tanto, si accedes a http://localhost:8000, estarás
viendo la respuesta del servidor Nginx que se está ejecutando en el contenedor.
docker run -d --rm -p 8000:80 --name mi-nginx nginx

Imágenes.
Listado de images que hay en la computadora local.
docker image ls

Descargar imagen de python version3


docker pull python:3

Redes, Comunicar dos contenedores en la misma red.


Visualizó las redes y creó dos contenedores.
docker network ls
docker run -d --rm --name mi-nginx nginx
docker run -d --rm --name mi-nginx2 nginx

Reviso la red bridge y la parte que me importa es la parte de contenedores y miro sus ip
docker network inspect bridge

Usamos el comando ping, para revisar si dos redes se pueden comunicar.


# ping
Para probarlo le envié un ping al otro contenedor y a mi mismo.
# ping 172.17.0.3
# ping 172.17.0.2
Comunicar dos contenedores en distintas redes.
Creamos una red
docker network create -d bridge mi-red

Vemos las redes disponibles


docker network ls

Creamos un contenedor, con la bandera mi-red


docker run -d --rm -net= mi-red -name mi-nginx3 nginx

revisamos contenedores
docker ps

revisamos las red mi-red, y encontramos el contenedor nginx3


docker network inspect bridge

iniciamos sesión dentro de un contenedor


docker exec -it mi-nginx bash

Hacemos un ping desde la red en que se encuentra nginx al contenedor que se encuentra
en la red mi-red nginx3
ping 172.19.0.2

00:12:00

No puedo porque está en otro espacio de dominio de red. Dos contenedores en dos redes
distintas no se pueden comunicar directamente por el rango de ip entonces se agrega a la
otra red un contenedor quedando un contenedor con una ip nueva para esa red, quedando
con dos ip ese contenedor, ahora con el mismo rango y se pueden comunicar

También podría gustarte