Mientras trabaja en proyectos Docker, la mayoría de las veces, las imágenes Docker existentes no cumplirán sus requisitos, por lo que es útil saber qué es Dockerfile y cómo crear una imagen Docker.

Con Dockerfile puede crear imágenes Docker personalizadas. Por lo tanto, conocer Dockerfile es esencial.

¿Qué es Dockerfile?

Es un simple archivo de texto con un conjunto de comandos o instrucciones. Estos comandos/instrucciones se ejecutan sucesivamente para realizar acciones sobre la imagen base para crear una nueva imagen Docker.

loscomentarios y los argumentos de los comandos son dos tipos de bloques de línea principal en la sintaxis de Dockerfile

Sintaxis de comentarios

#Bloques de línea utilizados para comentar

comando argumento argumento1 .....

Comandos Argumentos Ejemplo

#Bloques de líneas utilizados para comentar

comando argumento argumento1 .....

A continuación se muestra cómo será su flujo de trabajo.

dockerfile workflow
  • Cree un Dockerfile y mencione las instrucciones para crear su imagen docker
  • Ejecute el comando docker build que creará una imagen docker
  • Ahora la imagen docker está lista para ser utilizada, utilice el comando docker run para crear contenedores

Ahora veamos los comandos básicos.

Comandos básicos

Cuando he utilizado Dockerfile he encontrado útiles estos comandos básicos:

  • FROM – Define la imagen base a utilizar e inicia el proceso de construcción.
  • RUN – Toma el comando y sus argumentos para ejecutarlo desde la imagen.
  • CMD – Función similar al comando RUN, pero se ejecuta sólo después de instanciar el contenedor.
  • ENTRYPOINT – Se dirige a su aplicación por defecto en la imagen cuando se crea el contenedor.
  • ADD Copia los archivos del origen al destino (dentro del contenedor).
  • ENV – Establece variables de entorno.

Copie y pegue estos en un archivo para que pueda buscarlos cuando lo requiera o mejor aún, ¡marque mi post!

¿Cómo crear una imagen Docker con un Dockerfile?

En primer lugar, vamos a crear un Dockerfile.

geekflare@geekflare:~$ gedit Dockerfile

Ponga en él los siguientes comandos/instrucciones y guárdelo.

# Establezca la imagen base en Ubuntu
FROM ubuntu

# Actualice la lista de fuentes del repositorio e instale gnupg2
EJECUTE apt-get update && apt-get install -y gnupg2

# Añada la clave de verificación del paquete
EJECUTE apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10

# Añada MongoDB a la lista de fuentes del repositorio
RUN echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' > tee /etc/apt/sources.list.d/mongodb.list

# Actualice la lista de fuentes del repositorio
EJECUTE apt-get update

# Instale el paquete MongoDB (.deb)
EJECUTE apt-get install -y mongodb

# Cree el directorio de datos por defecto
EJECUTE mkdir -p /data/db

# Exponga el puerto por defecto
EXPONGA 27017

# Puerto por defecto para ejecutar el punto de entrada (MongoDB)
CMD ["--port 27017"]

# Establecer comando contenedor por defecto
ENTRYPOINT usr/bin/mongodb

En este Dockerfile, ubuntu se establece como imagen base. Luego se mencionan los comandos y argumentos necesarios para instalar MongoDB. El puerto 27017 se expone a MongoDB con el comando contenedor por defecto como usr/bin/mongodb

A continuación, lo ejecutaré para crear una imagen Docker.

Ejecutando un Dockerfile

El siguiente comando creará una imagen docker llamada geekflare_mongodb después de ejecutarse correctamente.

geekflare@geekflare:~$ docker build -t geekflare_mongodb .

Envío del contexto de compilación al demonio Docker 667.2MB

Paso 1/9 : DESDE ubuntu

último: Extrayendo de library/ubuntu

7413c47ba209: Pull completo

0fe7e7cbb2e8: Pull completo

1d425c982345: Pull completo

344da5c95cec: Pull completo

Digest: sha256:c303f19cfe9ee92badbbbd7567bc1ca47789f79303ddcef56f77687d4744cd7a

Estado: Descargada imagen más nueva para ubuntu:latest

--->
 3556258649b2

Paso 2/10 : EJECUTE apt-get update && apt-get install -y gnupg2

--->
 Ejecutando en de3706328761

Obtener:1 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]

Get:2 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]

Obtenido 16,9 MB en 38s (445 kB/s)

Leyendo listas de paquetes...

Lectura de las listas de paquetes...

Construir árbol de dependencias...

Lectura de la información de estado...

Necesidad de obtener 5187 kB de archivos.

Tras esta operación, se utilizarán 15,8 MB de espacio adicional en disco.

Obtener:1 http://archive.ubuntu.com/ubuntu bionic/main amd64 readline-common all 7.0-3 [52.9 kB]

Get:2 http://archive.ubuntu.com/ubuntu bionic/main amd64 libreadline7 amd64 7.0-3 [124 kB]

Get:3 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libsqlite3-0 amd64 3.22.0-1ubuntu0.1 [497 kB]

Get:4 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libssl1.1 amd64 1.1.1-1ubuntu2.1~18.04.4 [1300 kB]

debconf: retrasando la configuración de paquetes, ya que apt-utils no está instalado

Obtenido 5187 kB en 12s (416 kB/s)

Seleccionando paquete readline-common previamente no seleccionado.

(Leyendo base de datos ... 4040 archivos y directorios instalados actualmente)

Preparando para desempaquetar .../00-readline-common_7.0-3_all.deb ...

Desempaquetando readline-common (7.0-3) ...

Seleccionando paquete no seleccionado previamente libreadline7:amd64.

Preparándose para desempaquetar .../01-libreadline7_7.0-3_amd64.deb ...

Seleccionando paquete dirmngr previamente no seleccionado.

Configurando libnpth0:amd64 (1.5-3) ...

Instalando libksba8:amd64 (1.3.5-2) ...

Instalando gnupg-l10n (2.2.4-1ubuntu1.2) ...

Procesando disparadores para libc-bin (2.27-3ubuntu1) ...

Eliminando el contenedor intermedio de3706328761

--->
 a32533894ed1

Paso 3/10 : EJECUTE apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10

--->
 Ejecutando en 69c4dba38983

Advertencia: la salida de apt-key no debe ser analizada (stdout no es un terminal)

Ejecutando: /tmp/apt-key-gpghome.MuT5BDWwKZ/gpg.1.sh --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10

gpg: clave 5F8F93707F0CEB10: clave pública "Totally Legit Signing Key <mallory@example.org>" importada

gpg: clave 9ECBEC467F0CEB10: 1 firma no comprobada debido a que falta una clave

gpg: clave 9ECBEC467F0CEB10: clave pública "Richard Kreuter <richard@10gen.com>" importada

gpg: Número total procesado: 2

gpg: importado 2

Eliminación del contenedor intermedio 69c4dba38983

--->
 cffbe06c1b50

Paso 4/10 : RUN echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' > tee /etc/apt/sources.list.d/mongodb.list

--->
 Ejecutando en 40630fd7b0a9

Eliminando el contenedor intermedio 40630fd7b0a9

--->
 a1bd9d8d7e51

Paso 5/10 : EJECUTE apt-get update

--->
 Ejecutando en 750717d9c0ea

Acierto:1 http://archive.ubuntu.com/ubuntu bionic InRelease

Acierto:2 http://archive.ubuntu.com/ubuntu bionic-updates InRelease

Hit:3 http://security.ubuntu.com/ubuntu bionic-security InRelease

Hit:4 http://archive.ubuntu.com/ubuntu bionic-backports InRelease

Lectura de las listas de paquetes...

Eliminando contenedor intermedio 750717d9c0ea

--->
 397d6501db58

Paso 6/10 : EJECUTE apt-get install -y mongodb

--->
 Ejecutando en 88609c005e73

Leyendo las listas de paquetes...

Construyendo árbol de dependencias...

Lectura de la información de estado...

Se instalarán los siguientes paquetes NUEVOS:

libboost-filesystem1.65.1 libboost-iostreams1.65.1

libboost-program-options1.65.1 libboost-system1.65.1 libgoogle-perftools4

libpcap0.8 libpcrecpp0v5 libsnappy1v5 libstemmer0d libtcmalloc-minimal4

libunwind8 libyaml-cpp0.5v5 mongo-tools mongodb mongodb-clients

mongodb-server mongodb-server-core

0 actualizados, 17 recién instalados, 0 para eliminar y 0 no actualizados.

Se necesitan 53,7 MB de archivos.

Tras esta operación, se utilizarán 218 MB de espacio adicional en disco.

Obtener:1 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 mongodb-clients amd64 1:3.6.3-0ubuntu1.1 [20,2 MB]

Get:2 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 mongodb-server-core amd64 1:3.6.3-0ubuntu1.1 [20.3 MB]

Get:3 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 mongodb-server all 1:3.6.3-0ubuntu1.1 [12.6 kB]

Get:4 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 mongodb amd64 1:3.6.3-0ubuntu1.1 [9968 B]

Obtenido 53,7 MB en 10s (5485 kB/s)

Seleccionando paquete libpcap0.8:amd64 previamente no seleccionado.

(Leyendo base de datos ... 4390 archivos y directorios instalados actualmente)

Seleccionando paquete mongodb-clients previamente no seleccionado.

Preparándose para desempaquetar .../13-mongodb-clients_1:3.6.3-0ubuntu1.1_amd64.deb ...

Desempaquetando mongodb-clients (1:3.6.3-0ubuntu1.1) ...

Seleccionando el paquete mongodb-server-core previamente no seleccionado.

Preparándose para desempaquetar .../14-mongodb-server-core_1:3.6.3-0ubuntu1.1_amd64.deb ...

Desempaquetando mongodb-server-core (1:3.6.3-0ubuntu1.1) ...

Seleccionando paquete mongodb-server no seleccionado previamente.

Preparando para desempaquetar .../15-mongodb-server_1:3.6.3-0ubuntu1.1_all.deb ...

Desempaquetando mongodb-server (1:3.6.3-0ubuntu1.1) ...

Seleccionando paquete mongodb previamente no seleccionado.

Preparándose para desempaquetar .../16-mongodb_1:3.6.3-0ubuntu1.1_amd64.deb ...

Desempaquetando mongodb (1:3.6.3-0ubuntu1.1) ...

Instalando mongodb-server-core (1:3.6.3-0ubuntu1.1) ...

Instalando mongo-tools (3.6.3-0ubuntu1) ...

Instalando mongodb-clients (1:3.6.3-0ubuntu1.1) ...

Instalando mongodb-server (1:3.6.3-0ubuntu1.1) ...

invoke-rc.d: no se ha podido determinar el nivel de ejecución actual

invoke-rc.d: policy-rc.d denegó la ejecución de start.

Configurando mongodb (1:3.6.3-0ubuntu1.1) ...

Procesando triggers para libc-bin (2.27-3ubuntu1) ...

Eliminando contenedor intermedio 88609c005e73

--->
 d9c072cb1f84

Paso 7/10 : EJECUTE mkdir -p /data/db

--->
 Ejecutar en f817778f69ab

Eliminando el contenedor intermedio f817778f69ab

--->
 a3fbdb3def5c

Etapa 8/10 : EXPONER 27017

--->
 Ejecutando en 8d070e2a1e07

Eliminando el contenedor intermedio 8d070e2a1e07

--->
 f770776a538c

Paso 9/10 : CMD ["--port 27017"]

--->
 Ejecutando en ab612410df77

Eliminación del contenedor intermedio ab612410df77

--->
 e5830b80934f

Paso 10/10 : ENTRYPOINT usr/bin/mongod

--->
 Ejecutando en 95f574727aab

Eliminando el contenedor intermedio 95f574727aab

--->
 095d17727ca0

Construido con éxito 095d17727ca0

Etiquetado con éxito geekflare_mongodb:latest

Comprobemos si la imagen docker se ha creado con el nombre geekflare_mongodb.

geekflare@geekflare:~$ docker images

REPOSITORIO ETIQUETA IMAGEN ID CREADO TAMAÑO

geekflare_mongodb latest 095d17727ca0 hace 3 minutos 325MB

ubuntu latest 3556258649b2 hace 4 días 64.2MB

mean_express latest 35dcb3df9806 hace 6 días 923MB

mean_angular latest 9f8d61db600c hace 6 días 1.29GB

Ejecute la imagen docker geekflare_mongodb dentro de un contenedor mongo_container.

geekflare@geekflare:~$ docker run --name mongo_container -i -t geekflare_mongodb

2019-07-27T19:38:23.734 0000 I CONTROL [initandlisten] MongoDB iniciándose : pid=6 port=27017 dbpath=/data/db 64-bit host=b0095c1e5536

2019-07-27T19:38:23.735 0000 I CONTROL [initandlisten] db version v3.6.3

2019-07-27T19:38:23.735 0000 I CONTROL [initandlisten] versión git: 9586e557d54ef70f9ca4b43c26892cd55257e1a5

2019-07-27T19:38:23.736 0000 I CONTROL [initandlisten] Versión de OpenSSL: OpenSSL 1.1.1 11 Sep 2018

2019-07-27T19:38:23.739 0000 I CONTROL [initandlisten] asignador: tcmalloc

2019-07-27T19:38:23.739 0000 I CONTROL [initandlisten] módulos: ninguno

2019-07-27T19:38:23.739 0000 I CONTROL [initandlisten] entorno de compilación:

2019-07-27T19:38:23.739 0000 I CONTROL [initandlisten] distarch: x86_64

2019-07-27T19:38:23.739 0000 I CONTROL [initandlisten] target_arch: x86_64

2019-07-27T19:38:23.739 0000 I CONTROL [initandlisten] options: {}

2019-07-27T19:38:23.745 0000 I ALMACENAMIENTO [initandlisten] wiredtiger_open config: create,cache_size=2038M,session_max=20000,eviction=(threads_min=4,threads_max=4),config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000),statistics_log=(wait=0),verbose=(recovery_progress),

2019-07-27T19:38:24.733 0000 I CONTROL [initandlisten]

2019-07-27T19:38:24.734 0000 I CONTROL [initandlisten] ** ADVERTENCIA: El control de acceso no está habilitado para la base de datos.

2019-07-27T19:38:24.735 0000 I CONTROL [initandlisten] ** El acceso de lectura y escritura a los datos y a la configuración no tiene restricciones.

2019-07-27T19:38:24.736 0000 I CONTROL [initandlisten] ** ADVERTENCIA: Está ejecutando este proceso como usuario root, lo cual no es recomendable.

2019-07-27T19:38:24.736 0000 I CONTROL [initandlisten]

2019-07-27T19:38:24.736 0000 I CONTROL [initandlisten] ** ADVERTENCIA: Este servidor está vinculado a localhost.

2019-07-27T19:38:24.737 0000 I CONTROL [initandlisten] ** Los sistemas remotos no podrán conectarse a este servidor.

2019-07-27T19:38:24.737 0000 I CONTROL [initandlisten] ** Inicie el servidor con --bind_ip <address> para especificar qué IP

2019-07-27T19:38:24.737 0000 I CONTROL [initandlisten] ** direcciones desde las que debe servir respuestas, o con --bind_ip_all para

2019-07-27T19:38:24.737 0000 I CONTROL [initandlisten] ** enlazar a todas las interfaces. Si se desea este comportamiento, inicie el

2019-07-27T19:38:24.738 0000 I CONTROL [initandlisten] ** servidor con --bind_ip 127.0.0.1 para desactivar esta advertencia.

2019-07-27T19:38:24.738 0000 I CONTROL [initandlisten]

2019-07-27T19:38:24.739 0000 I ALMACENAMIENTO [initandlisten] createCollection: admin.system.version con UUID proporcionado: 4b8b509d-633a-46c1-a302-cb8c82b0d5d3

2019-07-27T19:38:24.788 0000 I COMMAND [initandlisten] estableciendo featureCompatibilityVersion a 3.6

2019-07-27T19:38:24.818 0000 I ALMACENAMIENTO [initandlisten] createCollection: local.startup_log con UUID generado: 6c1c0366-4b1b-4b92-9fcd-d18acc126072

2019-07-27T19:38:24.862 0000 I FTDC [initandlisten] Inicializando la captura de datos de diagnóstico a tiempo completo con el directorio '/data/db/diagnostic.data'

2019-07-27T19:38:24.866 0000 I RED [initandlisten] esperando conexiones en el puerto 27017

Abra un nuevo terminal y compruebe si mongo_container se está ejecutando.

geekflare@geekflare:~$ docker ps

CONTENEDOR ID IMAGEN COMANDO CREADO ESTADO PUERTOS NOMBRES

b0095c1e5536 geekflare_mongodb "/bin/sh -c usr/bin/..." hace 35 segundos Arriba 33 segundos 27017/tcp mongo_container

Como puede ver, el contenedor creado a partir de la imagen geekflare_mongodb está funcionando.

Espero que esto le de una idea sobre Dockerfile y sus beneficios. También puede consultar esta documentación sobre las mejores prácticas de Dockerfile para aprender más.

Related Articles