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.
- 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.