En este ejemplo vamos a crear una imagen Docker que tenga un servidor web que nos sirva una página web estática. Puedes encontrar los ficheros necesarios en el Repositorio con el código de los ejemplos.

Versión 1: Desde una imagen base

Tenemos un directorio, que en Docker se denomina contexto, donde tenemos el fichero Dockerfile y un directorio, llamado public_html con nuestra página web:

$ ls
Dockerfile  public_html

En este caso vamos a usar una imagen base de un sistema operativo sin ningún servicio. El fichero Dockerfile será el siguiente:

FROM debian:stable-slim
RUN apt-get update && apt-get install -y apache2 && apt-get clean && rm -rf /var/lib/apt/lists/*
WORKDIR /var/www/html/
COPY public_html .
EXPOSE 80
CMD apache2ctl -D FOREGROUND
  • Al usar una imagen base debian:stable-slim tenemos que instalar los paquetes necesarios para tener el servidor web, en este caso Apache.
  • Además de la instalación del servicio hemos borrado todos los paquetes que nos hemos bajado, con esto conseguimos que la capa que va a crear la instrucción RUN sea lo más pequeña posible.
  • A continuación añadiremos el contenido del directorio public_html al directorio /var/www/html/ del contenedor, donde nos hemos posicionado con la instrucción WORKDIR.
  • Declaramos el puerto donde se va a ofrecer el servicio. Esta definición es sólo informativa.
  • Finalmente indicamos el comando que se deberá ejecutar al crear un contenedor a partir de esta imagen: iniciamos el servidor web en segundo plano.

Para crear la imagen ejecutamos:

$ docker build -t josedom24/ejemplo1:v1 .

Comprobamos que la imagen se ha creado:

$ docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
josedom24/ejemplo1     v1                  8c3275799063        1 minute ago      226MB

Podemos ver cómo se ha creado cualquier imagen, usando el comando docker history:

$ docker history josedom24/ejemplo1:v1 
IMAGE          CREATED          CREATED BY                                      SIZE      COMMENT
c23cf3f2d251   11 seconds ago   CMD ["/bin/sh" "-c" "apache2ctl -D FOREGROUN…   0B        buildkit.dockerfile.v0
<missing>      11 seconds ago   EXPOSE map[80/tcp:{}]                           0B        buildkit.dockerfile.v0
<missing>      11 seconds ago   COPY public_html . # buildkit                   492kB     buildkit.dockerfile.v0
<missing>      13 seconds ago   WORKDIR /var/www/html/                          0B        buildkit.dockerfile.v0
<missing>      15 seconds ago   RUN /bin/sh -c apt-get update && apt-get ins…   112MB     buildkit.dockerfile.v0
<missing>      41 hours ago     /bin/sh -c #(nop)  CMD ["bash"]                 0B        
<missing>      41 hours ago     /bin/sh -c #(nop) ADD file:17e64d3a682fd256f…   74.8MB    

Y podemos crear un contenedor:

$ docker run -d -p 80:80 --name ejemplo1 josedom24/ejemplo1:v1

Y acceder con el navegador a nuestra página:

ejemplo1

Versión 2: Desde una imagen con Apache

En este caso el fichero Dockerfile sería el siguiente:

FROM httpd:2.4
COPY public_html /usr/local/apache2/htdocs/
EXPOSE 80
  • No necesitamos instalar nada, ya que la imagen tiene instalado el servidor web.
  • Siguiendo la documentación de la imagen en Docker Hub sabemos que el DocumentRoot del servidor web es el directorio /usr/local/apache2/htdocs/.
  • No es necesario indicar el CMD ya que por defecto el contenedor creado a partir de esta imagen ejecutará el mismo proceso que la imagen base, es decir, la ejecución del servidor web.

De forma similar, crearíamos una imagen y un contenedor:

$ docker build -t josedom24/ejemplo1:v2 .
$ docker run -d -p 80:80 --name ejemplo1 josedom24/ejemplo1:v2

Versión 3: Desde una imagen con nginx

En este caso el fichero Dockerfile sería:

FROM nginx:1.24
COPY public_html /usr/share/nginx/html
EXPOSE 80

De forma similar, crearíamos una imagen y un contenedor:

$ docker build -t josedom24/ejemplo1:v3 .
$ docker run -d -p 80:80 --name ejemplo1 josedom24/ejemplo1:v3

Actualizado: