Un Dockerfile es la receta para crear una imagen de Docker.
Este es el flujo de trabajo:primero creas un Dockerfile, luego creas una imagen de Docker a partir de él usando docker build
y, finalmente, ejecuta un contenedor desde la imagen.
Un Dockerfile es un archivo de texto con instrucciones sobre cómo crear una imagen.
Esas instrucciones son parte de un lenguaje de configuración, que incluye palabras clave como FROM
, LABEL
, RUN
, COPY
, ENTRYPOINT
, CMD
, EXPOSE
, ENV
y más.
Creemos nuestro primer Dockerfile:
Supongamos que tiene una carpeta con una aplicación Node.js simple compuesta por un app.js
, un package.json
archivo que enumera un par de dependencias que necesita instalar antes de ejecutar la aplicación, y package-lock.json
.
En su interior, cree un archivo de texto sin formato llamado Dockerfile
, sin extensión, con este contenido:
FROM node:14
WORKDIR /usr/src/app
COPY package*.json app.js ./
RUN npm install
EXPOSE 3000
CMD ["node", "app.js"]
NOTA:use comillas dobles en el CMD
línea. Las comillas simples darán como resultado un error.
En la primera línea decimos desde qué imagen queremos empezar. Esta será nuestra imagen base. En este caso, tomará la imagen oficial de Node.js, basada en Alpine Linux, utilizando Node 14. Al crear un contenedor desde Dockerfile, Docker obtendrá esa imagen de Docker Hub.
A continuación, establecemos el directorio de trabajo en /usr/src/app
, lo que significa que todos nuestros comandos se ejecutarán en esa carpeta hasta que la cambiemos nuevamente. Esa es una carpeta que sabemos que ya existe en la imagen del nodo.
Copiamos el package.json
, package-lock.json
(usando el *
comodín) y app.js
archivos que están presentes en la carpeta actual, en el directorio de trabajo.
Ejecutamos npm install
para instalar los paquetes enumerados en package.json
archivo.
Luego exponemos el puerto 3000 al exterior, ya que en eso se ejecuta nuestra aplicación. Un contenedor está 100 % aislado de la red a menos que exponga uno de sus puertos mediante EXPOSE
dominio. Más adelante veremos cómo podemos asignar puertos en nuestra computadora a puertos en un contenedor Docker.
Finalmente ejecutamos node app.js
para iniciar la aplicación.
Este es un Dockerfile, y pronto veremos cómo crear un contenedor a partir de él.