Comprender el Dockerfile

Comprender el Dockerfile
Estarás de acuerdo conmigo en que el impacto que Docker está teniendo en el mundo de la tecnología es masivo. Está guardando desarrolladores de software y administradores de sistemas por igual mucho dolor de cabeza.

En este artículo, aprenderá sobre una parte muy crucial de toda la configuración de Docker, el Dockerfile. El Dockerfile usa una estructura simple. Si bien esta simplicidad es algo bueno, da espacio para que las personas simplemente piratean los comandos, sin comprender completamente el impacto.

Al final de este artículo, tendrá una mejor comprensión del Dockerfile. Entonces, podrás escribir dockerfiles que entiendas.

Dentro del Dockerfile

Dockerfile es básicamente un archivo de texto. Pero, a diferencia de los archivos de texto regulares, verá que no tiene un .TXT extensión de archivo. El DockerFile es un archivo que guardará como Dockfile, sin extensiones de archivo.

En este Dockerfile existe todos los comandos utilizados para ensamblar una imagen Docker. Si bien puede pasar estos comandos al Docker CLI al construir una imagen, estará de acuerdo en que es una mejor práctica tener un archivo para ello, para que las cosas puedan organizarse mejor.

Los comandos en Dockerfile son vitales para construir una imagen de Docker.

Este es el por qué:

Cada línea de comando en Dockerfile crea las capas que componen la imagen de Docker. Siempre que el Dockerfile siga siendo el mismo, cada vez que construye una imagen, es seguro que obtendrá los mismos resultados. Sin embargo, cuando agrega una nueva línea de comando, Docker simplemente construye esa capa y la agrega a las capas existentes.

Al igual que el compilador o el intérprete lo hace con los lenguajes de programación, Docker lee el Dockerfile de arriba a abajo. Por lo tanto, la colocación de los comandos es importante.

A diferencia de la mayoría de los lenguajes de programación, los comandos en Dockerfile no son sensibles. Pero, verá en la muestra DockerFiles que los comandos están escritos en mayúsculas. Esta no es más que una convención, que también debes seguir.

Al igual que los lenguajes de programación, puede escribir comentarios en sus Dockerfiles. Los comentarios en Dockerfiles se denotan utilizando el símbolo hash o libra # Al comienzo de la línea. Debe tener en cuenta que solo admite comentarios de una línea, por lo tanto, para escribir comentarios de varias líneas, usará el símbolo hash en cada línea.

Sin embargo, no todos, no todos los símbolos hash que ves en un Dockerfile son comentarios. Los símbolos hash también podrían indicar directivas de analizador. Las directivas de Parser son comandos en DockerFile que indican la forma en que se debe leer el Dockerfile.

Solo hay dos directivas analizadoras disponibles en Docker al momento de escribir este artículo. Ellos son las escapar y sintaxis directivas de analizador. El sintaxis La directiva solo está disponible en Docker cuando se ejecuta en un backlit buildkit.

El escapar La directiva funciona en todas partes. El escapar La directiva le permite decidir qué usa Symbol Docker como carácter de escape.

Puede tener en su Dockerfile, una línea similar a la de abajo:

Copiar índice.html c: \\ documentos

Aún no debería preocuparse por lo que hace el comando, concéntrese en la ubicación del archivo. El uso del comando anterior en una imagen de Docker basada en Windows es válido. Pero, recordarás que Docker está basado en Linux, por lo que usa la barra insegura \ Como personaje de escape debido a las convenciones de Linux. Por lo tanto, cuando Docker lee a través del DockerFile, escapará de la barra insegura en lugar de leerla como una ruta de archivo.

Para cambiar este comportamiento, usará el escapar Directiva de analizador como se ve a continuación:

# Escape = '

Esta directiva hace que Docker use el backtick como personaje de escape, en lugar de la barra insegura. Para usar la Directiva Parser, tendrá que ponerlo en la parte superior del DockerFile, de lo contrario, solo contará como un comentario, debe colocarlo incluso por encima de los comentarios, si tiene los comentarios en la parte superior del archivo.

Instrucciones de Dockerfile

Docker se basa en cada línea de comando en Dockerfile y los ejecuta, construyendo una capa para cada línea en el proceso.

Necesitará una comprensión de los comandos para escribir DockerFiles. Sin embargo, un punto de precaución: muchos de los comandos de Dockerfile hacen cosas similares. No tienes que preocuparte, también entenderás esos comandos.

Aquí hay una lista de los comandos sobre los que aprenderá:

  • DE
  • ETIQUETA
  • Envidia
  • EXPONER
  • CORRER
  • COPIAR
  • Huella de trabajo
  • CMD

DE

Recuerde que el objetivo principal de Docker es virtualizar las cosas en el nivel del sistema operativo (OS), mediante la creación de contenedores. Por lo tanto, cualquier imagen que el Docker cree de su Dockerfile debe basarse en un sistema operativo existente, está construyendo una imagen base.

El comando de FOM se usa para indicar qué sistema operativo pretende usar como imagen base. Si tiene la intención de construir en una imagen base, el comando desde debe ser el primer comando en las directivas y comentarios de los avisos de Dockerfile.

ETIQUETA

El DockerFile necesita metadatos, y el comando de etiqueta es lo que usaría para crearlos. Después de construir una imagen y ejecutar un contenedor, puede usar el Docker inspeccionar comandar para encontrar información en el contenedor.

Envidia

Variables de entorno. Palabras familiares? Bueno, el comando ENV se usa para establecer variables de entorno mientras construye la imagen de Docker. También podrá ver que esas variables de entorno establecidas también se pueden acceder después de lanzar el contenedor.

Dockerfile tiene un comando similar a Env, conocido como Arg. Sin embargo, cualquier variable de entorno que esté establecida utilizando Arg solo está disponible mientras construye la imagen, pero no después de lanzar el contenedor.

EXPONER

De la misma manera que su host de Docker es el host de Docker en este caso, los puertos para la comunicación como 8080, 5000, etc. es de la misma manera que los contenedores Docker tienen puertos.

Utilizará el comando Exponer para elegir qué puertos deben estar disponibles para comunicarse con un contenedor.

Al ejecutar contenedores Docker, puede pasar en el -pag Argumento conocido como Publish, que es similar al comando Exponer.

Aquí está la diferencia sutil: utiliza el comando Exponer para abrir puertos a otros contenedores de Docker, mientras que el -pag El argumento se utiliza para abrir puertos al entorno externo i.mi. Fuera del contenedor Docker.

Si no utiliza la exposición o -pag En absoluto, el contenedor Docker no se puede acceder a través de ningún puerto desde fuera del contenedor u otros contenedores Docker.

CORRER

Al construir una imagen de Docker, es posible que deba ejecutar comandos por razones como la instalación de aplicaciones y paquetes para formar parte de la imagen.

Usando el comando ejecutar, puede hacer todo eso. Pero recuerde: los comandos se ejecutan solo cuando estás construyendo la imagen de Docker.

COPIAR

Hay diferentes razones para copiar archivos de su host de Docker a su imagen Docker. Algunos archivos que le gustaría copiar podría ser archivos de configuración, o el código fuente, si lo ejecutaría en su contenedor Docker.

Para copiar archivos de su host de Docker a una imagen de Docker, puede usar el comando COPY.

Existe el comando Agregar que es similar a la copia y es un poco diferente. Si bien la copia solo puede copiar archivos de su host de Docker a la imagen Docker, agregar puede copiar archivos de una URL y también extraer archivos comprimidos a la imagen de Docker.

¿Por qué usar copia en lugar de agregar?? Bueno, descubrirá que copiar archivos de una URL es una tarea que puede ejecutar con Curl usando el comando Ejecutar. También puede extraer archivos en la imagen Docker usando el comando Ejecutar también.

Sin embargo, no hay nada de malo en usar Agregar para extraer directamente archivos comprimidos en la imagen de Docker.

Huella de trabajo

Recuerda el comando ejecutar? Puede usar el comando Ejecutar para ejecutar comandos en su imagen Docker. Sin embargo, a veces tendrá una razón para ejecutar un comando en ciertos directorios. Como ejemplo, para descomponer un archivo, debe estar en el directorio del archivo zip o señalarlo.

Ahí es donde Workdir es útil. WorkDir le permite cambiar el directorio mientras Docker construye la imagen, y el nuevo directorio sigue siendo el directorio actual para el resto de las instrucciones de compilación.

CMD

Su contenedor Docker generalmente está configurado para ejecutar un proceso. Pero, ¿cómo sabe qué proceso ejecutar? Es a través del comando CMD. El comando CMD se usa para ejecutar comandos a medida que Docker inicia el contenedor Docker desde la imagen.

Mientras puede especificar el comando que se ejecutará al iniciar desde la línea de comandos, los comandos establecidos en la instrucción CMD siguen siendo el valor predeterminado.

Docker puede ejecutar solo un comando CMD. Por lo tanto, si inserta dos o más instrucciones de CMD, Docker solo ejecutaría el último I.mi. el más reciente.

EntryPoint es similar a CMD, sin embargo, puede ejecutar comandos mientras se inicia y no anularía las instrucciones que ha definido en EntryPoint.

Ejemplo

En este ejemplo, verá una implementación de casi todos los comandos discutidos anteriormente. Verá cómo se ejecutaría una aplicación de frasco en un contenedor Docker. Si no sabe qué es Flask, Flask es un marco web escrito en Python para crear aplicaciones web.

Es bastante simple, por lo que no necesita tener ningún conocimiento del idioma para ejecutar el ejemplo.

Para comenzar, deberá instalar git en su máquina. Después de instalar GIT, clonará el código fuente del repositorio de GitHub aquí.

Primero, cree un nuevo directorio. Tendrá el código fuente y el DockerFile en este directorio. Puedes crear un directorio-puedes llamarlo sample de acopolador-y el DockerFile usando los comandos a continuación:

Mkdir Docker-Sample && CD Docker-Sample
Toque Dockerfile

Recuerde que Dockerfile es solo un archivo de texto sin formato? También recuerdas que no debería tener el .TXT extensión? Encontrarás esa discusión al comienzo de la sección "Inside the Dockerfile", si te lo perdiste.

A continuación, descargará el código fuente de GitHub usando el clon git Comando como se ve a continuación:

Git clon https: // github.com/craigkerstiens/fraskorld.git

Puedes verificar el contenido del frasco directorio:

LS Flaskorld

Verá los siguientes archivos:

  • Reducción.primero: Contiene los detalles del proyecto, pero no es importante para este ejemplo. No deberías preocuparte por eso.
  • Procfile: Contiene comandos para ejecutar los proyectos en un servidor. Tampoco deberías preocuparte.
  • aplicación.py: Contiene el código que ejecutará en el contenedor Docker.
  • Requisitos.TXT: Contiene las dependencias de aplicación.py El archivo debe ejecutarse correctamente.

Escribiendo el Dockerfile

Este Dockerfile tiene todas las instrucciones de Docker discutidas anteriormente. También tiene comentarios para ayudarlo a comprender lo que hace cada línea.

# De la instrucción elige la imagen principal de Docker.
# Este ejemplo usa alpine.
# Alpine es una imagen mínima de Docker muy pequeña en tamaño
De Alpine: 3.3
# La instrucción de la etiqueta crea etiquetas.
# La primera etiqueta es el mantenedor con el valor de Linux Sugerencia.
# La segunda etiqueta es el nombre de la aplicación con el value frasco hola. Mundo
# Puedes tener tantos pares de clave a valor como quieras.
# También puede elegir cualquier nombre para las teclas.
# La elección del mantenedor y el nombre de la aplicación en este ejemplo
# es una elección personal.
Etiqueta "mantenedor" = "linux pisa" "appname" = "frask hello world"
# La instrucción envía asigna variables de entorno.
# El directorio /usr /src contiene programas descargados,
# ¿Sea fuente o binario antes de instalarlos.
Envocalte /USR /SRC
# Copiar instrucciones Copias de copias o directorios,
# Del anfitrión de Docker a la imagen de Docker.
# Copiará el código fuente a la imagen de Docker.
# El siguiente comando usa la variable de entorno establecida.
Copiar frascos-amarillo-$ aplicaciones/frascos-amarillo
# Uso de la instrucción Env Volviendo a.
Env FlaskApp $ Aplicación/Flask-Jo-Eles
# La instrucción WorkDir cambia el directorio actual en Docker Image.
# El siguiente comando cambia el directorio a/usr/src/frask-howelloLord.
# El directorio de destino utiliza la variable de entorno.
Workdir $ fraskapp/
# Ejecutar instrucción Ejecutar comandos,
# como lo haces en la terminal,
# Pero en la imagen de Docker.
# El siguiente comando instala Python, PIP y las dependencias de la aplicación.
# Las dependencias están en los requisitos.archivo txt.
Ejecutar apk add-update python py-pip
Ejecutar PIP Install -Upgrade PIP
Ejecutar requisitos de PIP Install -R.La instrucción de exposición de txt # abre el puerto para comunicarse con el contenedor Docker.
# La aplicación Flask usa el puerto 5000, por lo que expondrá el puerto 5000.
Exponer 5000 # La instrucción CMD ejecuta comandos como ejecutar,
# pero los comandos se ejecutan cuando se inicia el contenedor Docker.
# Solo se puede utilizar una instrucción CMD.
CMD ["Python", "Aplicación.py "]

Construyendo la imagen Docker

Después de escribir DockerFile, puede construir la imagen Docker con el comando a continuación:

sudo Docker Build -t sample_image .

Aquí, Imagen de muestra es el nombre de la imagen de Docker. Puedes darle otro nombre. El punto (.) Al final del comando indica que los archivos con los que está trabajando están en el directorio actual.

Ejecutando el contenedor Docker

Para ejecutar el contenedor Docker, puede usar el Docker Run Comando a continuación:

Sudo Docker Run -IP 5000: 5000 Sample_image: Último

El parámetro -i asegura que el contenedor Docker se ejecute en modo interactivo y el parámetro -p une el puerto del host Docker al puerto del contenedor Docker. Piense en ello como: Docker-Host: Docker-Container.

Después de lanzar el contenedor Docker, puede visitar Localhost: 5000 en su navegador para ver los resultados de la aplicación Flask.

Conclusión

El Dockerfile es el plan para una imagen de Docker. Comprender cómo funcionan Dockerfiles y poder escribirlos cómodamente haría que su Docker experimente sea agradable.

Trabajando hacia esto a través de este artículo, has visto cómo funcionan Dockerfiles. Con suerte, también comprende lo que significan las principales instrucciones de Docker y pueden usarlas para construir sus propias imágenes Docker.

Cualquier pregunta que tenga en relación con DockerFiles sería bienvenida. Gracias por leer.