Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Noviembre de 2020
1 Docker: prerrequisitos
2 Instalación de Docker
3 Ejecución de imágenes
4 Creación de imágenes
Networking
Algunos conceptos
Imágenes:
La imagen de un contenedor (o simplemente imagen) es un
fichero en el sistema de ficheros del host
Un contenedor se ejecuta a partir de una imagen
Esto es análogo a un proceso que se ejecuta a partir de un fichero
Nombres de imagen
El nombre de la imagen
Un nombre sin prefijo, por ejemplo debian indica una imagen
oficial aprobada por docker
Un nombre con prefijo, por ejemplo test/c01 es una imagen
no oficial. El prefijo puede ser una etiqueta que hayamos
definido o un nombre de usuario en un registro de imágenes
Instalación de docker
Otro holamundo
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Repositorio de imágenes
Docker run
docker ps
Muestra los contenedores
docker images
Muestra las imágenes
docker inspect <imagen>
Muestra un json con descripción detallada del contenedor
docker diff <imagen>
Muestra los cambios en el sistema de ficheros del contenedor
docker logs <imagen>
Muestra las instrucciones ejecutadas en el contenedor
Exited containers
Creación de imágenes
Ejemplo: banner
Vamos a crear una imagen llamada test/banner basada en la orden
banner que al ejecutarse mostrará los siguiente:
koji@mazinger:~/lagrs/banner$ docker run -h c01 --name c01 test/banner
##
# #
# #
######
# #
# #
### #
#### # # ##
# # # # # # #
# # # # #
# # # # #
# # # # #
#### ### #####
Bind mounts
Ejemplos
Un proceso que sea root en el contenedor, también puede
acceder como root al servidor. Por eso es tan delicado que un
usuario pueda lanzar un contenedor
Supongamos el home de un usuario del servidor configurado
para que solo él tenga acceso
Para que un usuario del contenedor pueda acceder a este
directorio con un montaje bind, el usuario dentro del docker
tiene que tener el mismo id que el usuario en el servidor (no
importa el nombre, solo el id)
Sucede lo mismo con el gid: el gid del usuario dentro del
docker será el gid que vea el servidor
Diferencia importante:
En las máquinas virtuales tradicionales (p.e. hipervisores y
contenedores es extremadamente difı́cil que un proceso del
guest consiga escaparse y acceder al host
En los contenedores, muy fácil
Volumen
tmpfs
Uso de sshfs
Como hemos visto, los bind mounts permiten montar dentro de un
contenedor directorios ubicados en el host docker
Para montar directorios en cualquier otro lugar de internet,
podemos usar por ejemplo sshfs
Para ello es necesario añadir a la orden docker run los
siguientes parámetros
En docker 17.10
--privileged
En versiones más modernas de docker
--cap-add SYS_ADMIN --device /dev/fuse
--security-opt apparmor:unconfined
docker hub
-rm
Cuenta de sistema, con directorio home
-d
Directorio home
-s
Especifica la shell
-u
Especifica uid
GSyC - 2020 Virtualización III 35
Creación de imágenes
Configuración de red
COPY entrypoint.sh /
EXPOSE 22
ENTRYPOINT ["/entrypoint.sh"]
entrypoint.sh
#!/bin/bash
/usr/sbin/sshd
/bin/bash
Configuración en español
Las imágenes base de las distribuciones son esqueletos mı́nimos,
normalmente tendremos que personalizarlas
Por ejemplo, para configurar el idioma. En nuestro caso, español.
Instalaremos en la imagen el paquete locales, invocaremos a
localedef con los parámetros adecuados y definiremos la variable de
entorno LANG
FROM ubuntu:20.04
RUN apt-get update && apt-get upgrade -y && \
apt-get install -y locales && \
localedef -i es_ES -c -f UTF-8 \
-A /usr/share/locale/locale.alias es_ES.UTF-8
ENV LANG es_ES.UTF-8
COPY entrypoint.sh /
ENTRYPOINT ["/entrypoint.sh"]
Observa que
El slash invertido al final de lı́nea (\) une dos lı́neas fı́sicas en
una misma lı́nea lógica
El doble ampersand (&&) separa sentencias dentro de la
misma instrucción RUN
GSyC - 2020 Virtualización III 43
Servidor docker remoto
IP
Dirección de la máquina donde estará el servidor de
contenedores
USUARIO
Usuario en el servidor para administrar Docker. Necesita
privilegios para ejecutar sudo, sin necesidad de teclear ninguna
contraseña
Para ello, añadir a la última lı́nea del fichero /etc/sudoers
del servidor
nombre_usuario ALL=NOPASSWD: ALL
PRIVATE KEY
Clave privada ssh del usuario administrador en el servidor
HOST NAME
Nombre del servidor
1.3 Comprobación
Ejecución de un contenedor
magarcia@alpha:~$ docker run ubuntu echo holamundo
holamundo
Sesiones gráficas