mythoslab
1/14/2020 - 12:32 PM

OK-Manual Docker

Manual Docker

Manual Docker

Nota: dockerd es el demonio de Docker. Debe estar funcionanado.

Gestionar el servicio:

systemctl [start|stop|status] docker

Habilitar el levantamiento del servicio con el incicio del sistema:

systemctl enable docker

docker run: Crea un contenedor a partir de una imagen (plantilla)

En primer lugar busca en su repositorio local y si no la encuentra busca en docker-hub

docker run hello-word

Muestra un listado con las imágenes que tenemos en local:

docker images

Muestra los contenedores arrancados, funcionando

docker ps

Muestra los contenedores parados

docker ps -a

Muestra ayuda del comando

docker ps --help

Muestra los últimos contenedores creados

docker ps -l

Muestra los últimos contenedores utilizados

docker ps -n 4

Muestra el tamaño de los contenedores

docker ps -s

Muestra sólo los IDs de los contenedores

docker ps -q

Muestra las imágenes disponibles en nuestro sistema, incluyendo las ocultas:

docker images -a

Muestra las sólo los IDs de las imágenes:

docker images -q

Una imagen de docker tiene varias capas independientes y cada una tiene su propio ID

Crear contenedor en modo interactivo (con shell). Nota con "--name <nombre" podemos establecer el nombre del contenedor

docker run -it <nombre_imagen>

Crar un contenedor y cuando nos salgamos lo elimina automáticamente

docker run -it --rm <nombre_imagen>

Crear un contenedor en segundo plano sin entorno interactivo (shell)

docker run -d <nombre_imagen>

Docker Hub = repositorio oficial de Docker

Descargar imagen, pero no crear contenedor:

docker pull <nombre_imagen>:

Borrar un contenedor

docker rm <nombre_contenedor>|<id_contenedor>

Eliminar una imagen

docker rmi <nombre_imagen>|<id_imagen>

Nota: si intentamos elminar una imagen que tiene un contenedor corriendo nos devolverá error.

No obstante podemos forzar la eliminacin de una imagen aun con un contenedor corriendo

docker rmi -f <nombre_imagen>|<id_imagen>

Lanzar comandos a un contenedor

docker exec <nombre_contendor>

Para logarnos en un contenedor en background (-b)

docker exec -it <nombre_contenedor> bash

Docker image, para la gestion las imágenes

Listar imágenes

docker image ls

Eliminar imágen

docker image rm -f <nombre_imagen>:

Docker container, para la gestion los contenedores

docker container

Listar containers

docker container ls

Eliminar contenedores

docker container rm <nombre_contenedor>

Mostrar stdout de un contenedor

docker log <nombre_contendor>|<id_contenedor> -tail <número_lineas>

Matar contendor:

docker kill <nombre_contenedor>

Info procesos > consumo en un contenedor

docker top <nombre_contenedor>

Info rendimiento contenedor

docker stats <nombre_contenedor>

Info sobre características de un contenedor o imagen (incluyendo tipo de red, puerto configurados, etc)

docker inspect <nombre_contenedor>|<nombre_imagen>

Los puertos predefinidamente son privados (no tienen visión desde el exterior)

Convertir puertos privados del contenedor en públicos (los puertos me los asignará aleatoreamente):

docker run -d -P <nombre_contendor>

Convertir determiandos puertos en públicos, especificando el número de puerto que se mapeará

docker run -d -p <puerto_publico>:<puerto_privado_contendor> nginx

Existen 3 tipos de redes: bridge, host y none. Predefinidamente los contenedores utilizan una red de tipo bridge.

Mostrar redes docker

docker network ls nmcli con

Inspeccionar red y entre otros datos saber a qué contenedores está asociada (sólo muestra las asociaciones existentes con los contenedores arrancados)

docker inspect <nombre_red>

Crear una red

docker network create --subnet=xxx.xxx.xxx.xxx/xx

Arrancar|parar contenedor:

docker start|stop <nombre_contenedor>

Crear un contenedor vinculándolo a un red existente

Nota: cuando se crean varios contendores y se les asigna la misma red, por detrás se crea un servicio de resolución de nombre que facilita la conectividad entre máquinas

docker run -it --name <nombre_nuevo_contenedor> --network <nombre_de_red_que_asignaremos> <nombre_imagen>

Mostrar información sobre un contenedor

docker inspect <nombre_contenedor>

Conectar un contenedor a un red

docker network connect <nombre_red> <nombre_contenedor>

Mostrar los contenedores locales arrancados

docker ps

Mostrar todos los contenedores locales

docker ps -a

Muestra sólo las IDs de todos los contenedores que están arrancados.

docker ps -aq

Eliminar todos los contendores

docker rm <id_contenedor>

Eliminar todos los contenedores

docker rm docker ps -aq

Crear un enlace entre contenedores mediante --link (esta opción está deprecated)

Nota: la opción alias_nombre_máquina crea una entrada en el archivo host para que nos resuelva por nombre de máquina

docker run -it --name <nombre_contenedor> --link <nombre_contendor_al_que_enlazaremos>[:alias_nombre_máquina] <nombre_imagen>

Pasar una variable de entorno a un contendor cuando lo creamos:

docker run -d --name <nombre_contenedor> --network <nombre_de_la_red> -e <NOMBRE_VARIABLE_ENTORNO>=<contenido_variable>

Eliminar una red

Nota: no se puede eliminar una red que tenga contenedores asociados. Primero hay que eliminar los contenedores o eliminar la asociación.

docker network rm <nombre_red>

Volúmenes

Pueden utilizarse para guardar datos de forma persistente y para compartir los datos con el host u otros contendores.

En el directorio /var/lib/docker Docker almacena toda su información (contendores, imágenes, volúmenes, ...)

Crear un volumen al crear un contenedor. El volumen aparecerá en la ruta que especifiquemos, en el ejemplo "/":

Tambien podemos especificar el volumen se monte como sólo lectura con la cláusula "ro"

docker run -it -v /<nombre_volumen>[:ro]

Gestiona volúmenes

docker volume

Mostrar volúmenes

docker volume ls

Mostrar detalla sobre un volumen

docker volume inspect <volume_id>|<nombre_volumen>

Compatir un directorio concreto del host con el contenedor al crear el contenedor

Nota: si cualquier de los dos ruta no existen, docker la crea

docker run -it -v <ruta_absoluta_host>:<ruta_absoluta_contendor> --name <nombre_contendor> <nombre_imagen>

Compartir volúmenes entre contenedores

docker run -it --name <nombre_contenedor> --volumes-from <nombre_contenedor_del_que_queremos_acceso_a_sus_contenedores>

Crear un volumen independiente:

docker volume create <nombre_volumen>

Eliminar volumen

Nota: no se puede eliminar un volumen que esté vinculado a algún contenedor

docker volumen rm <nombre_volumen>

Eliminar todos los volúmenes que están sin asignar

docker volume prune

Mostrar los cambios hechos en un contenedor

docker diff <nombre_contenedor>

Crear una imagen a partir de un contenedor

Con especificamos el nombre de la capa

docker commit <nombre_contenedor> <nombre_nueva_imagen>:

Construye la imagen con las capas que hemos especificado a patir de la información que tiene en el dockerfile

<ruta_contexto> especifica la ruta donde están los ficheros a los que hacemos referencia desde el dockerfile

docker build -t <nombre_imagen> <ruta_contexto> .

Mostrar los cambios por lo que ha pasado una imagen

docker image history <nombre_imagen>

Eliminar una imagen

docker rmi image:v1

DockerFile: es un fichero de configuración de la imagen. Por cada directiva (FROM, COPY, CMD, ...) que incluye se crea una capa

Comentarios: utilizaremos el símbolo # para hacer comentarios dentro del fichero dockerfile

Directiva 'FROM': indicamos la imagen base sobre la cuál basar nuestra nueva imagen

FROM <nombre_imagen_base>

Directiva 'RUN': ejecutará los comandos que le indiquemos en nuestra nueva imagen. Importante: los comandos no pueden ser interactivos.

RUN <comando_N>

Directiva 'CMD': especifica el comando que se ejecutará la primera vez que se encienda el contenedor.

Dentro de un dockerfile sólo puede haber un sólo CMD. En caso de haber varios, el único que se ejecutaría sería el último.

Es recomendable porner los comandos en forma JSON, ya que sino el comando lo ejecutará anteponiendo "/bin/sh -c" y en algunos casos estos nos puede dar problemas

CMD [""]

Directiva 'ENTRYPOINT': Especifica el comando que se ejecutará cada vez que se encienda el contenedor.

Al igual que el comando CMD, el comando se debe especificar en formato JSON.

Sólo puede haber un ENTRYPOINT, sólo se ejecuta el último

ENTRYPOINT [""]

Directiva 'WORKDIR': especifica el directorio donde se van a ejecutar los comandos que espefiquemos

WORKDIR

Directiva 'COPY': copia contenido del host dentro del contenedor

Nota: si utilizamos rutas relativas tomará como path actual el especificado con la directiva WORKDIR

Nota: admite metacaracteres: *,?,...

COPY

Directiva 'ADD': tiene la misma funcionalidad que COPY, con las siguientes excepciones:

1. Los archivos .tar los desempaqueta en destino

2. Nos permite referenciar a una ruta en internet para bajarnos un fichero por ejemplo.

Nota: admite metacaracteres: *,?,...

ADD

Directiva 'ENV': crea variables de entorno que estarán disponibles dentro del contenedor

Nota: se puede referenciar a la variable dentro del propio dockerfile

ENV <nombre_variable_1>= <nombre_variable_N>=

Directiva 'ARG':

La diferencia respecto a 'ENV' es que me permite establecer la variable sin inicializarla, es decir, sin establecer un valor.

Otra diferencia es que con 'ENV' definíamos la variable en el momento de crear el contenedor y con 'ARG' definiremos la variable

en el momento de construir la imagen, pudiendo así cambiar el comportamiento en la construcción de la imagen en base al valor de esa variable.

docker built -t image: --build-arg <nombre_variable>=<valor_variable> ARG <nombre_variable> # Dentro del DockerFile

Directiva 'VOLUME'

Nos permite crear volúmenes de forma automática desde nuestro dockerfile

El resultado es similiar a cuando utilizamos el parámetro "-v" al crear un contenedor

Los volúmenes son siempre externos al contendor.

VOLUME ["/ruta"]

Logarnos en nuestra cuenta de DockerHub, para así poder hacer push y pull de imágenes

docker login # tras lo cual deberemos introducir nuestro nombre de usuario y contraseña

Crear una imagen a patir de otra:

Nota para subir imágenes a DockerHub, el nombre de la imagen debe tener la siguiente estructura de nombre: nombre_usuario/nombre_imagen:tag

docker image tag <nombre_imagen_origen>: <nombre_nueva_imagen>:

Subir imagen a nuestro repositorio en DockerHub

docker push <nombre_usuario>/<nombre_imagen>:

Integración continua: conectar GitHub y DockerHub

Requerimientos previos:

1.Repositorio en GitHub

2.Fichero Dockerfile: en el repositorio donde tengo mi código debe existir un fichero dockerfile, el cual, nos permitirá construir la imagen de forma automática en DockerHub.

Pasos iniciales GitHub:

a.) Inicializar el repositorio

git init

b.) Añadir todos los fichero al repositorio, realizar commit y verificar que todo se haya subido

git add * git commit -m "First commit" git status

c.) Añadir repositorio remoto,

git remote add origin <URL_repositorio/image.git> git push -u origin master # Nos pedirá nuestras credenciales

Pasos iniciales DockerHub:

Dentro de nuestro perfil realizar las siguientes acciones:

Create - Created Automated Build - Link Accounts - Create Auto-build GitHub

(Faltan pasos: mirar documentación)

Docker compose

Su principal funcionalidad es la orquestación

Utiliza un fichero de configuración (docker-compose.yml) donde se configura la relación entre los contenedores

En resumen es un frontal contra Docker que nos permite gestionar este tipo de arquitecturas de una forma mucho más simple que si la hiciéramos de forma manual

Docker Compose, entiende los contenedores como servicios, esto es lógico, ya que Docker Compose está orientado a la gestión de microservicios.

Instalar Docker Compose:

Seguir las instrucciones de: https://docs.docker.com/compose/install/

Fichero docker-compose.yml

Este fichero está conformado mediante el formato de serialización YAML

Versión del fichero docker-compose.yml. Este punto es importante y deberemos verificar que la versión del fichero corresponde con la versión de Docker.

La correspondencia entre versiones la tenemos en el siguiente link:

https://docs.docker.com/compose/compose-file/

Docker compose se orienta a crear microservicios. En la definición del 'docker-compose.yml', definimos todos lo servicios.

Todo servicio bien debe tener el comando built o el comando image

Imagen1

Fin Imagen1