Saltar navegación

Apps de varios contedores

Análise de situación

Chegados a este punto, e despois de traballar coa nosa aplicación nun só contedor, imos engadir MySQL ao noso stack de traballo. E cabe a seguinte pregunta; onde executamos o noso servizo MySQL? no mesmo contedor ou noutro diferente?

Como norma xeral, cada contedor debe encargarse dunha soa tarefa e facela correctamente.

  • Hai moitas posibilidades de que teñas que escalar as API e front-ends dun xeito diferente ás bases de datos
  • Os contedores separados permíten actualizar as versións de forma separada
  • Aínda que podes usar un contedor para a base de datos local, é posible que usemos un servizo externo para a base de datos en produción.
  • A execución de varios procesos engade complexidade ao inicio/apagamento do contenedor

Entón, actualizaremos a nosa aplicación para que funcione co seguinte esquema:

+----------+      +-------+
| Todo App | ---- | MySQL |
+----------+      +-------+

Redes en contedores

Recorda que os contedores están illados e non saben nada uns de outros. Entón, como facemos para que se poidan comunicar? Pois a través da rede que xestiona Docker Engine. Se dous contedores están na mesma rede, entón poden comunicarse entre eles.

Iniciando MySQL

Hai dous xeitos de conectar un contedor a unha rede; cando se crea, ou conectar un contedor en execución. Neste momento, imos crear primeiro a rede e conectar o contedor MySQL cando se inicie.

  1. Crea a rede
    $ docker network create todo-app
  2. Crea un contedor MySQL e conéctao á rede anterior.

    $ docker run -d \
      --network todo-app --network-alias mysql \
      -v todo-mysql-data:/var/lib/mysql \
      -e MYSQL_ROOT_PASSWORD=secret \
      -e MYSQL_DATABASE=todos \
      mysql:5.7

  3. Para comprobar que a base de datos está operativa, imos conectarnos a través do seguinte comando:
    $ docker exec -it <-mysql-container-id> mysql -p
    [...]
    mysql> SHOW DATABASES;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    | todos              |
    +--------------------+
    5 rows in set (0.00 sec)

Conectando a MySQL

Agora que temos o noso xestor de base de datos en execución, como nos conectamos a MySQL? Se executamos outro contedor na mesma rede, como atopamos o contedor da base de datos?

  1. Crea un novo contedor a partir da imaxe nicolaka/netshoot. Asegúrate que se conecta á mesma rede que MySQL.
    $ docker run -it --network todo-app nicolaka/netshoot
  2. Unha vez dentro do contedor, imos executar o comando dig para localizar o enderezo IP do contedor mysql
    $ dig mysql

    ; <<>> DiG 9.14.1 <<>> mysql
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32162
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

    ;; QUESTION SECTION:
    ;mysql.             IN A

    ;; ANSWER SECTION:
    mysql.          600 IN A 172.23.0.2

    ;; Query time: 0 msec
    ;; SERVER: 127.0.0.11#53(127.0.0.11)
    ;; WHEN: Tue Oct 01 23:47:24 UTC 2019
    ;; MSG SIZE rcvd: 44

Executar a App con MySQL

A aplicación TODO soporta diferentes variables de entorno para axustar os parámetros de conexión ao servidor MySQL:

  • MYSQL_HOST - o hostname do servidor onde se atopa MySQL
  • MYSQL_USER - o nome de usuario para establecer a conexión
  • MYSQL_PASSWORD - o contrasinal do usuario
  • MYSQL_DB - o nome da base de datos á que conectarse

Con todo o explicado ata o momento, imos lanzar o contedor para Dev

  1. Engade as variables de entorno para conectar con MySQL, así como coa rede creada ao efecto
    docker run -dp 3000:3000 \
      -w /app -v $PWD:/app \
      --network todo-app \
      -e MYSQL_HOST=mysql \
      -e MYSQL_USER=root \
      -e MYSQL_PASSWORD=secret \
      -e MYSQL_DB=todos \
      node:10-alpine \
      sh -c "yarn install && yarn run dev"
  2. Comproba a través das mensaxes de rexistro (log) se a conexión á base de datos foi realizada con éxito
    # Previous log messages omitted
    $ nodemon src/index.js
    [nodemon] 1.19.2
    [nodemon] to restart at any time, enter `rs`
    [nodemon] watching dir(s): *.*
    [nodemon] starting `node src/index.js`
    Connected to mysql db at host mysql
    Listening on port 3000
  3. Accede á aplicación a través dun navegador web e introduce algúns elementos á lista de tarefas.
  4. Conecta co servidor MySQL e comproba que se gardaron correctamente os datos anteriores na base de datos
    $ docker exec -ti <mysql-container-id> mysql -p todos
    mysql> select * from todo_items;
    +--------------------------------------+--------------------+-----------+
    | id                                   | name               | completed |
    +--------------------------------------+--------------------+-----------+
    | c906ff08-60e6-44e6-8f49-ed56a0853e85 | Estudar Linux!     |         0 |
    | 2912a79e-8486-4bc3-a4c5-460793a575ab | Practicar Docker!  |         0 |
    +--------------------------------------+--------------------+-----------+

Feito con eXeLearning (Nova xanela)