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 comandosRUN 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
- Descargar certificado desde por ejemplo la 100 (servidor donde se corren los docker) /etc/docker/certs.d/mi.registro.privado/ca.crt
- Agregarlo al directorio /etc/docker/certs.d/mi.registro.privado/ca.crt
- sudo service docker restart #reiniciar docker
- 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