├── capitulo-07 ├── secrets │ ├── db │ │ └── mysql_root_password.txt │ └── docker-compose.yml ├── lemp │ ├── php-fpm │ │ └── Dockerfile │ ├── .env │ ├── nginx │ │ └── default.conf │ ├── sql │ │ └── database.sql │ ├── src │ │ └── index.php │ └── docker-compose.yml ├── lamp │ ├── .env │ ├── sql │ │ └── database.sql │ ├── apache │ │ └── Dockerfile │ ├── src │ │ └── index.php │ └── docker-compose.yml ├── mysql │ ├── .env │ └── docker-compose.yml ├── mysql_phpmyadmin │ ├── .env │ └── docker-compose.yml ├── configs │ ├── nginx │ │ └── default.conf │ ├── src │ │ └── index.html │ └── docker-compose.yml ├── wordpress │ ├── .env │ └── docker-compose.yml └── httpd │ └── docker-compose.yml ├── capitulo-03 ├── hola-mundo-python │ ├── src │ │ └── main.py │ └── Dockerfile ├── nginx │ ├── Dockerfile │ └── default.conf ├── entrypoint-cmd │ └── Dockerfile ├── arg │ └── Dockerfile ├── entrypoint │ └── Dockerfile ├── hola-mundo-go │ ├── src │ │ └── holamundo.go │ └── Dockerfile └── apache │ └── Dockerfile └── README.md /capitulo-07/secrets/db/mysql_root_password.txt: -------------------------------------------------------------------------------- 1 | root -------------------------------------------------------------------------------- /capitulo-03/hola-mundo-python/src/main.py: -------------------------------------------------------------------------------- 1 | print("hello world!") -------------------------------------------------------------------------------- /capitulo-03/nginx/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM nginx:1.21 2 | COPY default.conf /etc/nginx/sites-available/ -------------------------------------------------------------------------------- /capitulo-07/lemp/php-fpm/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM php:8.0-fpm 2 | RUN docker-php-ext-install mysqli -------------------------------------------------------------------------------- /capitulo-03/entrypoint-cmd/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:21.04 2 | CMD ["/etc/os-release"] 3 | ENTRYPOINT ["cat"] -------------------------------------------------------------------------------- /capitulo-03/arg/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ALPINE_VERSION=3.13 2 | FROM alpine:${ALPINE_VERSION} 3 | CMD cat /etc/os-release -------------------------------------------------------------------------------- /capitulo-03/entrypoint/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.10-alpine 2 | ENTRYPOINT ["python", "-c", "print(\"¡Hola mundo!\")"] -------------------------------------------------------------------------------- /capitulo-07/lamp/.env: -------------------------------------------------------------------------------- 1 | MYSQL_ROOT_PASSWORD=root 2 | MYSQL_DATABASE=tienda 3 | MYSQL_USER=user 4 | MYSQL_PASSWORD=password -------------------------------------------------------------------------------- /capitulo-07/mysql/.env: -------------------------------------------------------------------------------- 1 | MYSQL_ROOT_PASSWORD=root 2 | MYSQL_DATABASE=database 3 | MYSQL_USER=user 4 | MYSQL_PASSWORD=password -------------------------------------------------------------------------------- /capitulo-07/lemp/.env: -------------------------------------------------------------------------------- 1 | MYSQL_ROOT_PASSWORD=root 2 | MYSQL_DATABASE=tienda 3 | MYSQL_USER=user 4 | MYSQL_PASSWORD=password 5 | -------------------------------------------------------------------------------- /capitulo-03/hola-mundo-python/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.8-slim-buster 2 | WORKDIR /app 3 | COPY src/ . 4 | CMD ["python", "main.py"] -------------------------------------------------------------------------------- /capitulo-07/mysql_phpmyadmin/.env: -------------------------------------------------------------------------------- 1 | MYSQL_ROOT_PASSWORD=root 2 | MYSQL_DATABASE=database 3 | MYSQL_USER=user 4 | MYSQL_PASSWORD=password -------------------------------------------------------------------------------- /capitulo-03/nginx/default.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80; 3 | root /var/www/html; 4 | index index.html index.htm; 5 | } -------------------------------------------------------------------------------- /capitulo-07/configs/nginx/default.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80; 3 | root /var/www/html; 4 | index index.html index.htm; 5 | } -------------------------------------------------------------------------------- /capitulo-07/wordpress/.env: -------------------------------------------------------------------------------- 1 | MYSQL_ROOT_PASSWORD=root 2 | MYSQL_DATABASE=wp_database 3 | MYSQL_USER=wp_user 4 | MYSQL_PASSWORD=wp_password -------------------------------------------------------------------------------- /capitulo-03/hola-mundo-go/src/holamundo.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "fmt" 4 | 5 | func main() { 6 | fmt.Println("¡Hola mundo!") 7 | } -------------------------------------------------------------------------------- /capitulo-07/httpd/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.8' 2 | 3 | services: 4 | httpd: 5 | image: httpd:2.4 6 | ports: 7 | - 80:80 8 | volumes: 9 | - ./:/usr/local/apache2/htdocs/ -------------------------------------------------------------------------------- /capitulo-03/apache/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:21.04 2 | 3 | RUN apt-get update \ 4 | && apt-get install -y --no-install-recommends apache2 \ 5 | && rm -rf /var/lib/apt/lists/* 6 | 7 | EXPOSE 80 8 | 9 | ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"] -------------------------------------------------------------------------------- /capitulo-07/configs/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ¡Hola mundo! 7 | 8 | 9 |

¡Hola mundo!

10 | 11 | 12 | -------------------------------------------------------------------------------- /capitulo-03/hola-mundo-go/Dockerfile: -------------------------------------------------------------------------------- 1 | # Paso 1. Compilamos la aplicación 2 | FROM golang:1.17.2-alpine AS builder 3 | WORKDIR /src 4 | COPY src . 5 | RUN go build holamundo.go -o holamundo 6 | 7 | # Paso 2. Copiamos la aplicación compilada a otra imagen 8 | FROM alpine:3.14.2 9 | COPY --from=builder /src/holamundo / 10 | ENTRYPOINT ["/holamundo"] -------------------------------------------------------------------------------- /capitulo-07/configs/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.8' 2 | 3 | services: 4 | nginx: 5 | image: nginx 6 | ports: 7 | - 80:80 8 | configs: 9 | - source: nginx_config 10 | target: /etc/nginx/conf.d/default.conf 11 | volumes: 12 | - ./src:/var/www/html 13 | 14 | configs: 15 | nginx_config: 16 | file: ./nginx/default.conf -------------------------------------------------------------------------------- /capitulo-07/lemp/nginx/default.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80; 3 | root /var/www/html; 4 | index index.php index.html index.htm; 5 | 6 | location ~ \.php$ { 7 | fastcgi_pass php-fpm:9000; 8 | fastcgi_index index.php; 9 | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 10 | include fastcgi_params; 11 | } 12 | } -------------------------------------------------------------------------------- /capitulo-07/mysql/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.8' 2 | 3 | services: 4 | mysql: 5 | image: mysql:8.0 6 | ports: 7 | - 3306:3306 8 | environment: 9 | - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} 10 | - MYSQL_DATABASE=${MYSQL_DATABASE} 11 | - MYSQL_USER=${MYSQL_USER} 12 | - MYSQL_PASSWORD=${MYSQL_PASSWORD} 13 | volumes: 14 | - mysql_data:/var/lib/mysql 15 | 16 | volumes: 17 | mysql_data: -------------------------------------------------------------------------------- /capitulo-07/secrets/docker-compose.yml: -------------------------------------------------------------------------------- 1 | services: 2 | mysql: 3 | image: mysql:8.0 4 | ports: 5 | - 3306:3306 6 | secrets: 7 | - mysql_root_password 8 | environment: 9 | - MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql_root_password 10 | volumes: 11 | - mysql_data:/var/lib/mysql 12 | 13 | volumes: 14 | mysql_data: 15 | 16 | secrets: 17 | mysql_root_password: 18 | file: db/mysql_root_password.txt -------------------------------------------------------------------------------- /capitulo-07/lamp/sql/database.sql: -------------------------------------------------------------------------------- 1 | DROP DATABASE IF EXISTS tienda; 2 | CREATE DATABASE tienda CHARSET utf8mb4; 3 | USE tienda; 4 | 5 | CREATE TABLE fabricante ( 6 | id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, 7 | nombre VARCHAR(100) NOT NULL 8 | ); 9 | 10 | INSERT INTO fabricante VALUES(1, 'Asus'); 11 | INSERT INTO fabricante VALUES(2, 'Lenovo'); 12 | INSERT INTO fabricante VALUES(3, 'Hewlett-Packard'); 13 | INSERT INTO fabricante VALUES(4, 'Samsung'); -------------------------------------------------------------------------------- /capitulo-07/lemp/sql/database.sql: -------------------------------------------------------------------------------- 1 | DROP DATABASE IF EXISTS tienda; 2 | CREATE DATABASE tienda CHARSET utf8mb4; 3 | USE tienda; 4 | 5 | CREATE TABLE fabricante ( 6 | id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, 7 | nombre VARCHAR(100) NOT NULL 8 | ); 9 | 10 | INSERT INTO fabricante VALUES(1, 'Asus'); 11 | INSERT INTO fabricante VALUES(2, 'Lenovo'); 12 | INSERT INTO fabricante VALUES(3, 'Hewlett-Packard'); 13 | INSERT INTO fabricante VALUES(4, 'Samsung'); -------------------------------------------------------------------------------- /capitulo-07/lamp/apache/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:21.04 2 | 3 | ENV DEBIAN_FRONTEND=noninteractive 4 | ENV TZ=Europe/Madrid 5 | 6 | RUN apt-get update \ 7 | && apt-get install -y apache2 \ 8 | && apt-get install -y php \ 9 | && apt-get install -y libapache2-mod-php \ 10 | && apt-get install -y php-mysql \ 11 | && apt-get clean && rm -rf /var/lib/apt/lists/* 12 | 13 | EXPOSE 80 14 | 15 | ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"] -------------------------------------------------------------------------------- /capitulo-07/lamp/src/index.php: -------------------------------------------------------------------------------- 1 | query("SELECT * FROM fabricante"); 11 | 12 | $mysqli->close(); 13 | 14 | foreach ($result as $row) { 15 | echo $row['nombre']."
"; 16 | } 17 | 18 | ?> -------------------------------------------------------------------------------- /capitulo-07/lemp/src/index.php: -------------------------------------------------------------------------------- 1 | query("SELECT * FROM fabricante"); 11 | 12 | $mysqli->close(); 13 | 14 | foreach ($result as $row) { 15 | echo $row['nombre']."
"; 16 | } 17 | 18 | ?> -------------------------------------------------------------------------------- /capitulo-07/lamp/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.8' 2 | 3 | services: 4 | apache: 5 | build: ./apache 6 | ports: 7 | - 80:80 8 | volumes: 9 | - ./src:/var/www/html 10 | depends_on: 11 | - mysql 12 | 13 | mysql: 14 | image: mysql:8.0 15 | environment: 16 | - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} 17 | - MYSQL_DATABASE=${MYSQL_DATABASE} 18 | - MYSQL_USER=${MYSQL_USER} 19 | - MYSQL_PASSWORD=${MYSQL_PASSWORD} 20 | volumes: 21 | - mysql_data:/var/lib/mysql 22 | - ./sql:/docker-entrypoint-initdb.d 23 | 24 | phpmyadmin: 25 | image: phpmyadmin:5.1 26 | ports: 27 | - 8080:80 28 | environment: 29 | - PMA_HOST=mysql 30 | depends_on: 31 | - mysql 32 | 33 | volumes: 34 | mysql_data: -------------------------------------------------------------------------------- /capitulo-07/mysql_phpmyadmin/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.8' 2 | 3 | services: 4 | mysql: 5 | image: mysql:8.0 6 | ports: 7 | - 3306:3306 8 | environment: 9 | - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} 10 | - MYSQL_DATABASE=${MYSQL_DATABASE} 11 | - MYSQL_USER=${MYSQL_USER} 12 | - MYSQL_PASSWORD=${MYSQL_PASSWORD} 13 | volumes: 14 | - mysql_data:/var/lib/mysql 15 | healthcheck: 16 | test: mysql --user=${MYSQL_USER} --password=${MYSQL_PASSWORD} -e "SHOW DATABASES;" 17 | interval: 1s 18 | timeout: 3s 19 | retries: 3 20 | restart: always 21 | 22 | phpmyadmin: 23 | image: phpmyadmin:5.1 24 | ports: 25 | - 80:80 26 | environment: 27 | - PMA_HOST=mysql 28 | depends_on: 29 | mysql: 30 | condition: service_healthy 31 | restart: always 32 | 33 | volumes: 34 | mysql_data: -------------------------------------------------------------------------------- /capitulo-07/lemp/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.8' 2 | 3 | services: 4 | nginx: 5 | image: nginx:1.21 6 | ports: 7 | - 80:80 8 | volumes: 9 | - ./nginx:/etc/nginx/conf.d 10 | - ./src:/var/www/html 11 | depends_on: 12 | - php-fpm 13 | 14 | php-fpm: 15 | build: ./php-fpm 16 | volumes: 17 | - ./src:/var/www/html 18 | depends_on: 19 | - mysql 20 | 21 | mysql: 22 | image: mysql:8.0 23 | ports: 24 | - 3306:3306 25 | environment: 26 | - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} 27 | - MYSQL_DATABASE=${MYSQL_DATABASE} 28 | - MYSQL_USER=${MYSQL_USER} 29 | - MYSQL_PASSWORD=${MYSQL_PASSWORD} 30 | volumes: 31 | - mysql_data:/var/lib/mysql 32 | - ./sql:/docker-entrypoint-initdb.d 33 | 34 | phpmyadmin: 35 | image: phpmyadmin:5.1 36 | ports: 37 | - 8080:80 38 | environment: 39 | - PMA_HOST=mysql 40 | depends_on: 41 | - mysql 42 | 43 | volumes: 44 | mysql_data: 45 | -------------------------------------------------------------------------------- /capitulo-07/wordpress/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.8' 2 | 3 | services: 4 | wordpress: 5 | image: wordpress:php8.0 6 | ports: 7 | - 80:80 8 | environment: 9 | - WORDPRESS_DB_HOST=mysql 10 | - WORDPRESS_DB_NAME=${MYSQL_DATABASE} 11 | - WORDPRESS_DB_USER=${MYSQL_USER} 12 | - WORDPRESS_DB_PASSWORD=${MYSQL_PASSWORD} 13 | volumes: 14 | - wordpress_data:/var/www/html 15 | depends_on: 16 | - mysql 17 | restart: always 18 | networks: 19 | - frontend-network 20 | - backend-network 21 | 22 | mysql: 23 | image: mysql:8.0 24 | ports: 25 | - 3306:3306 26 | environment: 27 | - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} 28 | - MYSQL_DATABASE=${MYSQL_DATABASE} 29 | - MYSQL_USER=${MYSQL_USER} 30 | - MYSQL_PASSWORD=${MYSQL_PASSWORD} 31 | volumes: 32 | - mysql_data:/var/lib/mysql 33 | restart: always 34 | networks: 35 | - backend-network 36 | 37 | phpmyadmin: 38 | image: phpmyadmin:5.1 39 | ports: 40 | - 8080:80 41 | environment: 42 | - PMA_HOST=mysql 43 | depends_on: 44 | - mysql 45 | restart: always 46 | networks: 47 | - frontend-network 48 | - backend-network 49 | 50 | volumes: 51 | wordpress_data: 52 | mysql_data: 53 | 54 | networks: 55 | frontend-network: 56 | backend-network: -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Aprender Docker, un enfoque práctico 2 | 3 | Este repositorio contiene los archivos `Dockerfile` y `docker-compose.yml` que se han utilizado en los ejemplos de los capítulos 3 y 7 del libro **«Aprender Docker, un enfoque práctico»**. 4 | 5 | ## Capítulo 3: Imágenes Docker 6 | 7 | - [Ejemplo de un archivo Dockerfile con múltiples etapas](capitulo-03/hola-mundo-go). 8 | - [Ejemplo de un archivo Dockerfile con una aplicación Python](capitulo-03/hola-mundo-python). 9 | - [Ejemplo de creación una imagen a partir de una imagen base](capitulo-03/apache). 10 | - [Ejemplo de uso de variables creadas con `ARG`](capitulo-03/arg). 11 | - [Ejemplo de uso de la instrucción `COPY`](capitulo-03/nginx). 12 | - [Ejemplo de uso de la instrucción `ENTRYPOINT`](capitulo-03/entrypoint). 13 | - [Ejemplo de uso de las instrucciones `ENTRYPOINT` y `CMD`](capitulo-03/entrypoint-cmd). 14 | 15 | ## Capítulo 7: Docker Compose 16 | 17 | - [Ejemplo de uso de la sección `configs`](capitulo-07/configs). 18 | - [Ejemplo de uso de la sección `secrets`](capitulo-07/secrets). 19 | - [Ejemplo de un servicio web Apache](capitulo-07/httpd). 20 | - [Ejemplo de un servicio de MySQL con variables de entorno y un volumen](capitulo-07/mysql). 21 | - [Ejemplo de una aplicación con dos servicios](capitulo-07/mysql_phpmyadmin). 22 | - [Creación de un entorno de desarrollo LAMP](capitulo-07/lamp). 23 | - [Creación de un entorno de desarrollo LEMP](capitulo-07/lemp). 24 | - [Ejemplo de una aplicación WordPress](capitulo-07/wordpress). --------------------------------------------------------------------------------