Primero de todo crear un archivo llamado dockerfile dónde más rabia te dé en alguna ruta de tu ordenador.

En el archivo vamos a poner unos comandos básicos como son el SO Centos, apache y la ejecución de apache. Recalcar que el flag -y indica que vas a decir sí a todo lo que te pida la instalación de apache. Como eso no lo podemos controlar ya que se está creando la imagen, hacemos con el -y que siempre diga yes.

FROM centos
RUN yum install httpd -y
CMD apachectl -DFOREGROUND

Ahora creamos la imagen indicando el nombre con --t y con un punto el cual indica que aquí está el fichero que se necesita.

docker build --t apache .

¿Qué pasa si el nombre del fichero no es dockerfile y es por ejemplo apache-imagen?. Entonces tienes que utilizar el flag -f para indicar el nombre del fichero a construir, eso sustituye al punto.

docker build -t apache-imagen -f apache-imagen

¿Quiere ver si has creado la imagen?

docker images

¿Quieres borrar la imagen?

docker rmi miimagen

¿Te sale esto error al intentar borrar la imagen? Error response from daemon: conflict: unable to remove repository reference "miimagen" (must force) - container caaf65d14424 is using its referenced image 263937798010

Eso es que tienes un contenedor con esa imagen, antes lista los contenedores que tienes y borra el que quieras.

docker ps -a
docker rm -f "el id del contenedor"

Si ya tienes la imagen, solo tienes que meterla en un contenedor con los puertos que quieras. El primer 80 indica el de mi máquina y el segundo el del contenedor. Ten en cuenta que el puerto 80 suele estar cogido por apache o nginx, por lo que tendrás que parar esos servicios o utilizar otros puertos. El -d indica que el contenedor corre en segundo plano.

docker run -d -p 80:80 micontenedor

Por último poner localhost o indicar el puerto si pusistes uno distinto al 80.

Si quieres copiar una carpeta con un proyecto con html/js/css, tendrás que modificar el dockerfile y agregar el comando COPY, de tal manera que mirando el ejemplo anterior quedaría asi.

FROM centos
RUN yum install httpd -y
COPY /home/usuario/miproyecto /var/www/html
CMD apachectl -DFOREGROUND

También se puede usar ADD, pero la diferencia se encuenrta en que ADD te permite traer archivos desde una URL.

Podemos utilizar dentro de nuestro dockerfile el comando WORKDIR para definir nuestra ruta predeterminada de trabajo y también podemos hacer uso de la variable ENV, la cual es una variable de entorno en linux.

FROM centos
RUN yum install httpd -y
WORKDIR /var/www/html
COPY proyecto-html .
CMD apachectl -DFOREGROUND

¿Con qué usuario se genera todo lo que va dentro de la imagen?. Pues por defecto es el root pero podemos agregar un usuario con la sintaxis de linux y todo aquello que vaya después de ese usuario agregado se creara con ese usuario.

RUN useradd davidcm
USER davidcm

Y si tienes algún problema con los permisos del usuario creado para copiar un proyecto en /var/www/html o similar, tendrás que darle permiso a esa ruta para ese usuario.

RUN chown  davidcm /var/www/html -R

Ahora quiero ejecutar un shellscript, ¿qué hago?. Utilizar el comando CMD, antes copiar el sh al contenedor.

CMD sh miscript.sh

¿Y si quiero instalar php en la imagen?. Para ello tienes que utilizar los comandos que sirven para instalar php en una máquina con apache, como si lo instalaras en tu ordenador.

FROM centos
RUN \
yum install httpd -y \
yum install php
WORKDIR /var/www/html
COPY info.php info.php
CMD apachectl -DFOREGROUND

Para comprobar que funciona hemos creado un archivo info.php que contiene la sentencia <?php echo infophp(); ?>

A veces te puedes encontrar con imagenes que no están referenciadas debido a que creartes dos o más imágenes con el mismo nombre. Para ello filtramos por el tag -f y dangling a true, para ver las imágenes y luego poder borrarlas

docker images -f dangling=true | xargs docker rmi

Si ya tengo corriendo mi contenedor y quiero entrar en él para mover unos ficheros, ¿cómo lo hago?

docker exec -ti nombre-contenedor bash

El parámetro t indica una terminal y el -i para que sea interactivo.

¿Y si quiero entrar con un usuario distinto al que tengo en el dockerfile?

docker exec -u root -ti nombre-contenedor bash

¿Puedo ver algún log en los contenedores de docker?

docker logs -f nombre-contenedor-o-id

Para ver los recursos que ocupa un contenedor de docker.

docker stats nombre-contenedor

Si queremos limitar la memoria ram de nuestro contenedor en docker, al correr el comando docker run, le tenemos que pasar  la opción -m para indicar los mb que queremos que coja el contenedor.

-m "500mb"

Y para dejar que docker coja solo los núcleos del procesador que queramos, cuando ejecutamos el run utilizamos el siguiente tag.

--cpuset-cpus 0

Eso indica que coja solo el núcleo 0, podemos poner el 1, 2 o el 0-1 que sería el núcleo 1 y 2.

Si necesita copiar un archivo de tu pc al contenedor y no lo has hecho antes en el dockerfile, solo necesitas hacer un copy de un archivo desde tu máquina hacia el nombre del contenedor y a la ruta que necesitas.

docker cp mi-archivo nombre-contenedor:/ruta

Y si justo queremos lo contrario, es decir, copiar un archivo de mi contenedor en docker hacia mi pc.

docker cp nombre-contenedor:/ruta /ruta-mi-pc

Quizás necesites alguna vez cambiar algún archivo dentro del contenedor por alguna razón. La problemática de esto es que los contenedores en docker son temporales por lo que si lo borras, eso que has creado desaparecerá. Para resolver eso (hay otras maneras más elegantes y coherentes) utilizaremos docker commit, que nos crea una imagen a partir de un contenedor docker.

docker commit mi-contenedor nombre-imagen-resultante

Aclarar que si utilizamos el comando VOLUMEN y una ruta en nuestro dockerfile, todo lo que este bajo esa ruta, no será guardado cuando creemos la nueva imagen a partir del contenedor.