4 minute read

En el primer post hablamos de Docker y sus diferencias con Vagrant. Nos creamos un repositorio de DockerHub y montamos nuestro primer webserver con un fichero de prueba para ver cómo se publicaba nuestro código dentro del contenedor.

¡A por la base de datos!

Ahora que tenemos webserver, necesitamos alguna capa de persistencia que nos aguante nuestro desarrollo. Vamos a ello…

Mirando el DockerHub, encontramos una imagen de mariadb usando este enlace (https://hub.docker.com/_/mariadb/). Si hacemos click en la versión que queremos (en nuestro caso la 10.1.29), nos llevará a un fichero DockerFile con la definición y características de ese contenedor. Podemos ver que viene de un debian:jessie un montón de configuraciones y personalizaciones que nos harán la vida más fácil a la hora de usar el “docker run”.

Pero no nos despistemos del tema principal… En la página de descripción de este contenedor están las instrucciones necesarias para poder ejecutar este contenedor con garantías. Entre otras cosas, encontramos el usuario y password que tendrá la base de datos, y cómo persistir los datos cuando el contenedor se termine.

En este caso vamos a ejecutar un comando un poco más largo por los parámetros que le vamos a pasar.

  • Puerto mapeado: 3306
  • Directorio de datos: En este caso seguimos con la estrategia de guardarlo en el host como directorio
  • Password de root: Se podría usar fichero de credenciales, pero para la demo ya es funcional.
  • Base de datos que queremos que nos cree al principio
  • La codificación de la base de datos

    docker run -p 3306:3306 -v "$(pwd)"/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=1234 -e MYSQL_DATABASE=test -d mariadb:10.1.29 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    

Con este comando, Docker se bajará las imágenes que necesita…

Unable to find image 'mariadb:10.1.29' locally
10.1.29: Pulling from library/mariadb
85b1f47fba49: Pull complete 
5671503d4f93: Pull complete 
62466fedcc9d: Pull complete 
b4ef8399f3aa: Pull complete 
e34b2cf62e1d: Pull complete 
7291500bf826: Pull complete 
a77c97e1ff71: Pull complete 
9537bbd6ea5e: Pull complete 
34947a95f4ee: Pull complete 
28abab99627a: Pull complete 
04fff38afc71: Pull complete 
Digest: sha256:7c9371d5f3dfa472fe6f7b211e4ab3a9ddf22fb654659ec3eea247a053eb36e3
Status: Downloaded newer image for mariadb:10.1.29
a70453aac9f1dc233027f5cfe415db47951a65525f82bde93bc5ff2d12205137

Y pondrá en marcha la máquina.

docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
a70453aac9f1        mariadb:10.1.29     "docker-entrypoint..."   11 seconds ago      Up 10 seconds       0.0.0.0:3306->3306/tcp   practical_khorana

De acuerdo… ya tenemos un webserver y un dbserver…y ahora… ¿cómo se juntan?

Hay varias respuestas a esa pregunta, pero vamos a aprovechar y vamos a agregar una herramienta nueva. El docker-compose.

Para ello necesitaremos:

  • Instalar el docker-compose tal y como se describe en las instrucciones de la web de Docker
  • Crear un fichero llamado docker-compose.yml con el siguiente contenido:

    version: "3"
    services:
    web:
    image: faparicior/devel:debian9-webserver
    volumes:
      - ./html:/var/www/html
    ports:
      - "80:80"
    networks:
      - webnet
    depends_on:
      - db
    db:
    image: mariadb:10.1.29
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
      - ./datadir:/var/lib/mysql environment:
      - MYSQL_ROOT_PASSWORD=1234
      - MYSQL_DATABASE=test
    ports:
      - "3306:3306"
    networks: 
      - webnet
    networks: 
    webnet:
    

Si te fijas, hemos acomodado lo que poníamos originalmente en los scripts cuando hacíamos docker run a un fichero que entiende docker-compose… y puede que te hayas percatado que en ese caso, docker-compose acepta rutas relativas.

También cabe destacar la configuración depends_on: db. Esto hace que al ejecutar el docker-compose, la base de datos siempre arranque antes que el webserver y las IPs no cambien de orden.

Con esto ya podemos lanzar la instrucción docker-compose up… “e voilà”… Ya tenemos un webserver con una base de datos.

web_1  | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.19.0.2. Set the 'ServerName' directive globally to suppress this message
db_1   | 2017-12-01 17:21:38 140682086258624 [Note] mysqld (mysqld 10.1.29-MariaDB-1~jessie) starting as process 1 ...
db_1   | 2017-12-01 17:21:39 140682086258624 [Note] InnoDB: Using mutexes to ref count buffer pool pages
db_1   | 2017-12-01 17:21:39 140682086258624 [Note] InnoDB: The InnoDB memory heap is disabled
db_1   | 2017-12-01 17:21:39 140682086258624 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
db_1   | 2017-12-01 17:21:39 140682086258624 [Note] InnoDB: GCC builtin __atomic_thread_fence() is used for memory barrier
db_1   | 2017-12-01 17:21:39 140682086258624 [Note] InnoDB: Compressed tables use zlib 1.2.8
db_1   | 2017-12-01 17:21:39 140682086258624 [Note] InnoDB: Using Linux native AIO
db_1   | 2017-12-01 17:21:39 140682086258624 [Note] InnoDB: Using SSE crc32 instructions
db_1   | 2017-12-01 17:21:39 140682086258624 [Note] InnoDB: Initializing buffer pool, size = 256.0M
db_1   | 2017-12-01 17:21:39 140682086258624 [Note] InnoDB: Completed initialization of buffer pool
db_1   | 2017-12-01 17:21:39 140682086258624 [Note] InnoDB: Highest supported file format is Barracuda.
db_1   | 2017-12-01 17:21:39 140682086258624 [Note] InnoDB: 128 rollback segment(s) are active.
db_1   | 2017-12-01 17:21:39 140682086258624 [Note] InnoDB: Waiting for purge to start
db_1   | 2017-12-01 17:21:39 140682086258624 [Note] InnoDB:  Percona XtraDB (http://www.percona.com) 5.6.36-82.2 started; log sequence number 1616767
db_1   | 2017-12-01 17:21:39 140682086258624 [Note] Plugin 'FEEDBACK' is disabled.
db_1   | 2017-12-01 17:21:39 140681267902208 [Note] InnoDB: Dumping buffer pool(s) not yet started
db_1   | 2017-12-01 17:21:39 140682086258624 [Note] Server socket created on IP: '::'.
db_1   | 2017-12-01 17:21:39 140682086258624 [Warning] 'proxies_priv' entry '@% root@a70453aac9f1' ignored in --skip-name-resolve mode.
db_1   | 2017-12-01 17:21:39 140682086258624 [Note] mysqld: ready for connections.
db_1   | Version: '10.1.29-MariaDB-1~jessie'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  mariadb.org binary distribution

En el siguente post resolveremos el problema de los mapeos de permisos que se producen al usar rutas en el host para guardar archivos en lugar de usar contenedores.

comments powered by Disqus