├── 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).
--------------------------------------------------------------------------------