Apuntes de BD para DAW, DAM y ASIR
José Juan Sánchez Hernández
Curso 2023/2024
docker-compose.yml
con MySQL y phpMyAdminPara poder ejecutar contenedores Docker es necesario tener instalado Docker Community Edition (CE) en nuestro equipo.
En la web oficial encontrará la información necesaria para realizar la instalación de Docker CE sobre Windows, macOS, Ubuntu, Debian, Fedora y CentOS.
Para este ejemplo usaremos la imagen oficial de phpmyadmin.
Para conectar dos contenedores podemos hacerlo de dos formas:
legacy container links
con el flag
--link
, en la bridge network
.user-defined bridge network
.Legacy container links
con el flag --link
, en
la bridge network
Los enlaces permiten que los contenedores se descubran entre sí y transfieran de manera segura información sobre un contenedor a otro contenedor. Para crear un enlace se utiliza el flag –link.
En primer lugar debe existir un contenedor con MySQL Server.
docker run -d \
--rm \
--name mysqlc \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root \
-v mysql_data:/var/lib/mysql \
mysql:8.0
Una vez que la instancia de MySQL está en ejecución podemos crear el contenedor con phpMyAdmin.
docker run -d \
--rm \
--name phpmyadminc \
--link mysqlc \
-e PMA_HOST=mysqlc \
-p 8080:80 \
phpmyadmin
La variable de entorno PMA_HOST
nos permite indicar el
nombre del contenedor con el que quiero conectarme desde phpMyAdmin.
En lugar de la variable de entorno PMA_HOST
podía haber
utilizado la variable PMA_ARBITRARY=1
.
La única diferencia es que con PMA_ARBITRARY=1
nos
aparece un campo de texto en la página de login de phpMyAdmin donde tenemos que
indicar el nombre del contenedor al que queremos conectarme y con
PMA_HOST
no hay que escribir nada porque se configura
automáticamente.
Con el flag --link mysqlc
hemos creado
un enlace entre los contenedores mysql
y
phpmyadminc
.
En el archivo /etc/hosts del contenedor
phpmyadminc
se ha añadido una nueva línea que permite
resolver la dirección IP del contenedor de MySQL a partir de su nombre
(mysqlc
) o su ID.
Por ejemplo si el ID del contenedor de MySQL
(mysqlc
) fuese 8411f6064e44
el archivo
/etc/hosts
tendría un contenido similar a este:
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 mysqlc 8411f6064e44
172.17.0.4 c25ca9a48fb3
Podemos comprobar que el contendedor phpmyadminc
puede
conectar con el contenedor mysqlc
abriendo un navegador web
y accediendo a la URL: http://localhost:8080.
user-defined bridge network
En primer lugar creamos una
user-defined bridge network
.
docker network create my-net
Creamos un contenedor con MySQL indicando que queremos que esté en la
red --network my-net
.
docker run -d \
--rm \
--name mysqlc \
--network my-net \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root \
-v mysql_data:/var/lib/mysql \
mysql:8.0
Creamos un contenedor con phpMyAdmin indicando que queremos
que esté en la red --network my-net
.
docker run -d \
--rm \
--name phpmyadminc \
--network my-net \
-e PMA_HOST=mysqlc \
-p 8080:80 \
phpmyadmin
Comprobamos que el contendedor phpmyadminc
puede
conectar con el contenedor mysql
abriendo un navegador web
y accediendo a la URL: http://localhost:8080[http://localhost:8080].
Para eliminar la red que hemos creado ejecutamos lo siguiente.
docker network rm my-net
Creamos un contenedor con MySQL con persistencia de datos.
docker run -d \
--rm \
--name mysqlc \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root \
-v mysql_data:/var/lib/mysql \
mysql:8.0
Creamos un contenedor con phpMyAdmin que esté enlazado con el contenedor anterior.
docker run -d \
--rm \
--name phpmyadminc \
--link mysqlc \
-e PMA_HOST=mysqlc \
-p 8080:80 \
phpmyadmin
Creamos un contenedor con MariaDB con persistencia de datos.
docker run -d \
--rm \
--name mariadbc \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root \
-v mariadb_data:/var/lib/mysql \
mariadb:10
Creamos un contenedor con phpMyAdmin que esté enlazado con el contenedor anterior.
docker run -d \
--rm \
--name phpmyadminc \
--link mariadbc \
-e PMA_HOST=mariadbc \
-p 8080:80 \
phpmyadmin
Una vez que hemos iniciado los contenedores podemos comprobar que se están ejecutando con el siguiente comando:
docker ps
Deberíamos obtener una salida similar a esta.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
19a928aac23c phpmyadmin/phpmyadmin "/run.sh supervisord…" 3 seconds ago Up 3 seconds 9000/tcp, 0.0.0.0:8080->80/tcp phpmyadminc
acd81669c572 mariadb "docker-entrypoint.s…" 19 seconds ago Up 18 seconds 0.0.0.0:3306->3306/tcp mariadbc
Para detener un contenedor en primer lugar tenemos que conocer cuál
es su ID. Para obtenerlo podemos hacer uso del comando
docker ps
.
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
19a928aac23c phpmyadmin/phpmyadmin "/run.sh supervisord…" 3 seconds ago Up 3 seconds 9000/tcp, 0.0.0.0:8080->80/tcp phpmyadminc
acd81669c572 mariadb "docker-entrypoint.s…" 19 seconds ago Up 18 seconds 0.0.0.0:3306->3306/tcp mariadbc
En la primera columna podemos ver cuál es el
CONTAINER ID
. Una vez localizado el identificador
ejecutamos el comando docker stop
y le pasamos como
parámetro el identificador del contenedor que queremos detener.
Para el caso anterior deberíamos ejecutar:
docker stop 19a928aac23c
docker stop acd81669c572
docker-compose.yml
con MySQL y phpMyAdminDocker Compose es una utilidad que nos permite gestionar varios contenedores Docker de una forma sencilla. Para ello, utiliza un archivo YAML donde se definen y configuran los servicios, los volúmenes y las redes que queremos crear.
En este caso vamos a crear un archivo docker-compose.yml
para definir dos servicios: mysql
y
phpmyadmin
.
version: '3'
services:
mysql:
image: mysql:8.0
ports:
- 3306:3306
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=database
- MYSQL_USER=user
- MYSQL_PASSWORD=password
volumes:
- mysql_data:/var/lib/mysql
phpmyadmin:
image: phpmyadmin
ports:
- 8080:80
environment:
- PMA_HOST=mysql
depends_on:
- mysql
volumes:
mysql_data:
Puede
descargar el archivo docker-compose.yml
de GitHub.
Con la opción depends_on
indicamos que el servicio
phpmyadmin
depende del servicio mysql
y que no
podrá iniciarse hasta que el servicio de mysql
se haya
iniciado.
Para iniciar los servicios en segundo plano con la utilidad
docker-compose
tenemos que ejecutar el siguiente
comando.
Para detener los servicios y mantener el volumen que hemos creado podemos ejecutar:
Si además de detener los servicios queremos eliminar el volumen que
hemos creado tenemos que añadir el parámetro -v
.
Para comprobar el estado de los servicios podemos ejecutar:
Esta
página forma parte del curso
Bases de Datos de
José Juan Sánchez Hernández y
su contenido se distribuye bajo una
licencia
Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0
Internacional.