Introducción a Dockerfile

Introducción

Docker puede construir imágenes automáticamente a través de un Dockerfile

EJEMPLO:

mkdir /home/user/Docker/ #Directorio donde se almacenarán los "contexts"
mkdir /home/user/Docker/helloworld #"context" correspondiente a "helloworld"
gedit Dockerfile #Creacion de dockerfile

FROM ubuntu

RUN /bin/echo "Hello World" > /root/helloworld.txt
CMD cat /root/helloworld.txt

cd /home/user/Docker/helloworld  #acceso a "context" "helloworld"
docker build . #Crear imagen, retornara un container_id
docker run container_id #Correr contenedor
FROM

La Primer instrucción del dockerfile debe ser “FROM” para especificar la imagen base

FROM ubuntu #imagen ubuntu (al no especificar el "tag" se baja el "tag" marcado como "latest"
FROM mi.registro.privado/apache-php #imagen de registro privado
RUN Ejecutar comandos
RUN apt-get update && apt-get install -y \
  php7.0-xml #actualizar repositorios e instalar, se incluye el -y para que el docker no espere la respuesta

RUN ln -s /var/www/sistema/rol1/upload/datos/ /var/www/sistema/rol2/upload/ #crear enlace simbólico en /var/www/sistema/rol2/upload será un enlace simbólico a /var/www/sistema/rol1/upload/datos/
CMD

Ejecutar instrucción.

Solo puede haber una instrucción CMD en un Dockerfile.
No confundir con RUN. RUN ejecuta comando y realiza un commit del resultado, se realiza al hacer un “build” de la imagen. CMD no ejecuta nada en “build time”, especifica la intención del comando para la imagen

CMD echo "This is a test." | wc -
CMD ["/usr/bin/wc","--help"]
CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"] #ejecutar servicio apache
VOLUME

Crear un punto de montaje y almacenarla en el host. Es particularmente útil por ejemplo si se corta la imagen, se salvaran los archivos!

Ejemplo:

FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol #crear un nuevo punto de montaje con el nombre indicado (en /myvol) y copiar el archivo "greeting" en el nuevo volumen creado

Los volumenes creados son almacenados en /var/lib/docker/volumes/

Para acceder al volumen de un “running container”:
docker inspect container_id #podemos buscar la opcion “Mounts” -> “Source” para ver el subdirectorio de /var/lib/docker/volumes/, visualizaremos algo como si indica a continuacion:

"Mounts": [
            {
                "Name": "d23c59b8079ad01fba79cb05597edd0b38049f996b8e1a2b85da80749fff5a4f",
                "Source": "/var/lib/docker/volumes/d23c59b8079ad01fba79cb05597edd0b38049f996b8e1a2b85da80749fff5a4f/_data",
                "Destination": "/var/www",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

Luego en /var/lib/docker/volumes/d23c59b8079ad01fba79cb05597edd0b38049f996b8e1a2b85da80749fff5a4f/_data estarán almacenados los archivos.

En general todos los volumenes terminan en “_data” podemos acceder facilmente al directorio con el siguiente comando:

docker inspect container_id | grep “_data

Si necesitamos modificar rápidamente el proyecto, no hace falta correr la imagen nuevamente, podemos acceder directamente al volumen y cambiar los archivos.

Acceso a registro privado docker

Habilitar
  1. Descargar certificado desde por ejemplo la 100 (servidor donde se corren los docker) /etc/docker/certs.d/mi.registro.privado/ca.crt
  2. Agregarlo al directorio /etc/docker/certs.d/mi.registro.privado/ca.crt
  3. sudo service docker restart #reiniciar docker
  4. docker login mi.registro.privado #loguearse a registro privado, usuario soporte
Subir imagen
docker build -t mi.registro.privado/miimagen:1.0 . #Construir una imagen asociandola al registro privado (ojo, no se si va el tag en esta instancia, creo que sí)
docker push mi.registro.privado/miimagen:1.0  #Subir la imagen al registro privado y asignarle un determinado tag
Correr imagen
docker run -d -p 8585:80 mi.registro.privado/miimagen:1.0 #el tag es opcional, si no se especifica se descarga el "latest"

docker run -d -p --restart=always 8585:80 mi.registro.privado/miimagen:1.0 #restaurar automaticamente

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *