Docker Compose: simplifiez l'utilisation de Makefile

Toutes les quelques annĂ©es, un changement de paradigme se produit dans l'industrie du dĂ©veloppement logiciel. L'un de ces phĂ©nomĂšnes est l'intĂ©rĂȘt croissant pour le concept de microservices. Bien que les microservices ne soient pas la derniĂšre technologie, ce n'est que rĂ©cemment que sa popularitĂ© a littĂ©ralement explosĂ©.

Les grands services monolithiques sont aujourd'hui remplacĂ©s par des microservices autonomes indĂ©pendants. Un microservice peut ĂȘtre considĂ©rĂ© comme une application qui sert un objectif unique et trĂšs spĂ©cifique. Par exemple, il peut s'agir d'un SGBD relationnel, d'une application Express, d'un service Solr. De nos jours, il est difficile d'imaginer le dĂ©veloppement d'un nouveau systĂšme logiciel sans l'utilisation de microservices. Et cette situation, Ă  son tour, nous conduit Ă  la plate-forme Docker.





Docker


La plate - forme Docker , dans le dĂ©veloppement et le dĂ©ploiement de microservices, est devenue une norme presque industrielle. Sur le site Web du projet, vous pouvez dĂ©couvrir que Docker est la seule plate-forme de conteneurisation indĂ©pendante qui permet aux organisations de crĂ©er sans effort des applications, ainsi que de les distribuer et de les exĂ©cuter dans n'importe quel environnement - des nuages ​​hybrides aux systĂšmes frontaliers.

Docker compose


La technologie Docker Compose est conçue pour configurer des applications multi-conteneurs. Un projet Docker Compose peut inclure autant de conteneurs Docker que le créateur de ce projet en a besoin.

Lorsque vous travaillez avec Docker Compose, un fichier YAML est utilisé pour configurer les services d'application et organiser leur interaction les uns avec les autres. Docker Compose est donc un outil pour décrire et exécuter des applications multi-conteneurs Docker.


Deux conteneurs fonctionnant sur le systĂšme hĂŽte

GNU Make


Un programme makeest essentiellement un outil pour automatiser l'assemblage de programmes et de bibliothÚques à partir du code source. En général, nous pouvons dire qu'il est makeapplicable à tout processus qui comprend l'exécution de commandes arbitraires pour convertir certains matériaux source en une certaine forme résultante, dans un certain but. Dans notre cas, les équipes docker-composeseront converties en objectifs abstraits ( cibles bidon ).

Afin de dire au programme makece que nous en attendons, nous avons besoin d'un fichier Makefile.

La nĂŽtre Makefilecontiendra les commandes habituelles dockeretdocker-composequi sont conçus pour rĂ©soudre de nombreux problĂšmes. À savoir, nous parlons d'assembler le conteneur, de le dĂ©marrer, de l'arrĂȘter, de le redĂ©marrer, d'organiser la connexion de l'utilisateur au conteneur, de travailler avec les journaux du conteneur et de rĂ©soudre d'autres problĂšmes similaires.

Utilisations typiques de Docker Compose


Imaginez une application Web standard qui comprend les composants suivants:

  • Base de donnĂ©es TimescaleDB (Postgres).
  • Application Express.js.
  • Ping (juste un conteneur qui ne fait rien de spĂ©cial).

Cette application aura besoin de 3 conteneurs Docker et d'un fichier docker-composecontenant des instructions pour gĂ©rer ces conteneurs. Chacun des conteneurs aura diffĂ©rents points d'interaction. Par exemple, timescalevous pouvez travailler avec un conteneur de la mĂȘme maniĂšre que vous travaillez avec des bases de donnĂ©es. À savoir, il vous permet d'effectuer les actions suivantes:

  • Connectez-vous au shell Postgres.
  • Importer et exporter des tableaux.
  • CrĂ©ez une pg_dumptable ou une base de donnĂ©es.

Le conteneur d'une application Express.js ,, expressjspeut avoir les fonctionnalités suivantes:

  • La sortie de nouvelles donnĂ©es du journal systĂšme.
  • Entrez dans le shell pour exĂ©cuter certaines commandes.

Interaction avec les conteneurs


AprÚs avoir configuré la connexion entre les conteneurs à l'aide de Docker Compose, il est temps d'établir une interaction avec ces conteneurs. Dans le cadre du systÚme Docker Compose, une commande docker-composeprend en charge une option -fqui vous permet de transférer un fichier sur le systÚme docker-compose.yml.

En utilisant les capacités de cette option, vous pouvez limiter l'interaction avec le systÚme uniquement aux conteneurs mentionnés dans le fichier docker-compose.yml.

Jetez un Ɠil à l'apparence des interactions de conteneur lors de l'utilisation de commandes docker-compose. Si nous imaginons que nous devons entrer dans le shell psql, les commandes correspondantes peuvent ressembler à ceci:

docker-compose -f docker-compose.yml exec timescale psql -Upostgres

La mĂȘme commande pour laquelle non docker-compose, mais est utilisĂ©e docker, peut ressembler Ă  ceci:

docker exec -it  edp_timescale_1 psql -Upostgres

Veuillez noter que dans de tels cas, il est toujours préférable d'utiliser non pas une commande docker, mais une commande docker-compose, car cela élimine la nécessité de se souvenir des noms de conteneurs.

Les deux commandes ci-dessus ne sont pas si compliquĂ©es. Mais si nous utilisions un «wrapper» sous une forme Makefilequi nous donnerait une interface sous forme de commandes simples et appellerait nous-mĂȘmes de telles commandes, alors les mĂȘmes rĂ©sultats pourraient ĂȘtre obtenus comme ceci:

make db-shell

Il est Ă©vident que l'utilisation Makefilesimplifie grandement le travail avec des conteneurs!

Exemple de travail


Sur la base du diagramme de projet ci-dessus, créez le fichier suivant docker-compose.yml:

version: '3.3'
services:
    api:
        build: .
        image: mywebimage:0.0.1
        ports:
            - 8080:8080
        volumes:
            - /app/node_modules/
        depends_on:
            - timescale
        command: npm run dev
        networks:
            - webappnetwork
    timescale:
        image: timescale/timescaledb-postgis:latest-pg11
        environment:
          - POSTGRES_USER=postgres
          - POSTGRES_PASSWORD=postgres
        command: ["postgres", "-c", "log_statement=all", "-c", "log_destination=stderr"]
        volumes:
          - ./create_schema.sql:/docker-entrypoint-initdb.d/create_schema.sql
        networks:
           - webappnetwork
    ping:
       image: willfarrell/ping
       environment:
           HOSTNAME: "localhost"
           TIMEOUT: 300
networks:
   webappnetwork:
       driver: bridge

Pour gérer la configuration Docker Compose et interagir avec les conteneurs qu'elle décrit, créez le fichier suivant Makefile:

THIS_FILE := $(lastword $(MAKEFILE_LIST))
.PHONY: help build up start down destroy stop restart logs logs-api ps login-timescale login-api db-shell
help:
        make -pRrq  -f $(THIS_FILE) : 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | sort | egrep -v -e '^[^[:alnum:]]' -e '^$@$$'
build:
        docker-compose -f docker-compose.yml build $(c)
up:
        docker-compose -f docker-compose.yml up -d $(c)
start:
        docker-compose -f docker-compose.yml start $(c)
down:
        docker-compose -f docker-compose.yml down $(c)
destroy:
        docker-compose -f docker-compose.yml down -v $(c)
stop:
        docker-compose -f docker-compose.yml stop $(c)
restart:
        docker-compose -f docker-compose.yml stop $(c)
        docker-compose -f docker-compose.yml up -d $(c)
logs:
        docker-compose -f docker-compose.yml logs --tail=100 -f $(c)
logs-api:
        docker-compose -f docker-compose.yml logs --tail=100 -f api
ps:
        docker-compose -f docker-compose.yml ps
login-timescale:
        docker-compose -f docker-compose.yml exec timescale /bin/bash
login-api:
        docker-compose -f docker-compose.yml exec api /bin/bash
db-shell:
        docker-compose -f docker-compose.yml exec timescale psql -Upostgres

La plupart des commandes décrites ici s'appliquent à tous les conteneurs, mais l'utilisation de l'option c=vous permet de limiter la portée de la commande à un seul conteneur.

Une fois MakefileprĂȘt, vous pouvez l'utiliser comme ceci:

  • make help- Ă©mission d'une liste de toutes les commandes disponibles pour make.


Aide sur les commandes disponibles

  • make build- assemblage de l'image Ă  partir de Dockerfile. Dans notre exemple, nous avons utilisĂ© des images existantes timescaleet ping. Mais apinous voulons collecter l' image localement. C'est exactement ce qui sera fait aprĂšs l'exĂ©cution de cette commande.


Ensemble conteneur Docker

  • make start- lancement de tous les conteneurs. Pour dĂ©marrer un seul conteneur, vous pouvez utiliser la commande du formulaire make start c=timescale.


Lancer le conteneur de l'Ă©chelle de temps


Lancer le conteneur ping

  • make login-timescale- entrĂ©e dans la session bash du conteneur timescale.


Exécution de bash dans un conteneur d'échelle de temps

  • make db-shell- Connectez-vous psqlau conteneur timescalepour exĂ©cuter des requĂȘtes SQL dans la base de donnĂ©es.


Exécution de psql dans le conteneur timescaledb

  • make stop - arrĂȘt des conteneurs.


ArrĂȘt du conteneur de l'Ă©chelle de temps

  • make down- arrĂȘtez et retirez les conteneurs. Pour supprimer un conteneur spĂ©cifique, vous pouvez utiliser cette commande avec le conteneur spĂ©cifiĂ©. Par exemple - make down c=timescaleou make down c=api.


ArrĂȘtez et supprimez tous les conteneurs

Sommaire


MalgrĂ© le fait que le systĂšme Docker Compose nous donne un ensemble complet de commandes conçues pour gĂ©rer les conteneurs, parfois ces commandes deviennent longues et, par consĂ©quent, elles peuvent ĂȘtre difficiles Ă  retenir.

La mĂ©thodologie d'utilisation Makefilenous a permis d'Ă©tablir une interaction rapide et facile avec les conteneurs du fichier docker-compose.yml. À savoir, nous parlons de ce qui suit:

  • , docker-compose.yml, .
  • , , make help .
  • , . , docker-compose -f docker-compose.yml exec timescale psql -Upostgres make db-shell.
  • Makefile , , . , .
  • Makefile, .

PS Sur notre marché, il y a une image Docker , qui est installée en un clic. Vous pouvez vérifier le fonctionnement des conteneurs sur VPS . Tous les nouveaux clients bénéficient de 3 jours gratuits pour les tests.

Chers lecteurs! Comment automatisez-vous le travail avec Docker Compose?

Source: https://habr.com/ru/post/undefined/


All Articles