[PYTHON] Prenons la description de docker-compose.yml (Django + MySQL ③)

À propos de cet article

Cet article correspond à la ** partie 3 ** des articles relatifs à Apprenez à utiliser Docker en construisant l'environnement de Django + MySQL.

  1. Créer un environnement virtuel Python à l'aide de venv
  2. Examinez la description de Dockerfile
  3. ** Considérez la description de docker-compose.yml (cet article) **
  4. Modifiez le fichier de configuration et exécutez docker-compose up
  5. Ajuster le moment du démarrage du conteneur entre les services dépendants

introduction

Dans cet article, ** afin que vous puissiez créer un conteneur Docker comme vous le souhaitez ** autant que possible à l'avenir ** tout en minimisant l'effort de construction de l'environnement et les commandes à exécuter **, ** Pensons à la description de docker-compose.yml **.

Quant au conteneur Docker, je le vois comme une réalisation de la ** image Docker ** que j'ai apprise jusqu'à présent, et l'état actuel de la ** "petite machine pour le projet" qui a été déplacée.

Pour le conteneur Django, nous allons procéder au travail basé sur le Dockerfile créé la dernière fois, tandis que pour le conteneur MySQL, nous utiliserons l'image officielle telle quelle.

Cette fois, ** docker-compose.yml est également créé dans la même hiérarchie que Dockerfile **.

La description

La description générale de «docker-compose.yml» est la suivante.

docker-compose.yml


version: "3"
services:
    web:
        container_name: djst_django
        build: .
        restart: always
        command: >
            bash -c "
                pip install -r requirements.txt &&
                python manage.py runserver 0.0.0.0:8000
            "
        working_dir: /code
        ports: 
            - 172.0.0.1:8000:8000
        volumes:
            - .:/code
        depends_on:
            - db
    db:
        container_name: djst_mysql
        image: mysql:5.7
        restart: always
        environment: 
            MYSQL_DATABASE: $DB_NAME
            MYSQL_USER: $DB_USER
            MYSQL_PASSWORD: $DB_PASSWORD
            MYSQL_ROOT_PASSWORD: $DB_ROOT_PASSWORD
            MYSQL_TCP_PORT: 3306
            TZ: 'Asia/Tokyo'
        volumes: 
            - ./mysql/data:/var/lib/mysql/
            - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf
        ports: 
            - 3306:3306

Pensez à la signification de la description

version: "3"

La première ligne est la version au format de fichier de docker-compose. Si la version affichée en exécutant $ docker-compose version est 1.13.0 ou ultérieure,"3", si elle est 1.10.0 ou ultérieure, " 2 ", si aucune de ces options n'est disponible, `" 1 " "Ce sera".

services:

A partir de la deuxième ligne, nous commencerons à décrire les services gérés par ce fichier.

Côté Django

web:

La ligne 3 commence par le service qui exécute l'application Django. Ici, le nom de l'image (à la fin de) est nommé.

container_name: djst_django

Ligne 4, ** le nom du conteneur généré **. Je vais le nommer ici.

build: .

Sur la 5ème ligne, vu depuis ce docker-compose.yml, ** spécifiez où générer l'image en fonction du Dockerfile **. Puisqu'il est placé dans la même couche cette fois, il est décrit comme «.».

La sixième ligne sera considérée plus tard dans la section MySQL.

command: >
    bash -c "
        pip install -r requirements.txt &&
        python manage.py runserver 0.0.0.0:8000
    "

Les lignes 7 à 12 décrivent la commande que vous souhaitez exécuter à partir du conteneur lorsque vous exécutez la commande $ docker-compose up plus tard. Avec $ bash -c" ", la commande décrite dans " " sera exécutée.

  1. ** Exécutez pip install pour synchroniser automatiquement les packages utilisés dans l'hôte et le conteneur **
  2. ** Démarrez le serveur Django sans restrictions d'hôte ( 0.0.0.0) **

Ils sont séparés par «&&» afin qu'ils soient exécutés dans l'ordre.

La limitation de host se fera plus tard à partir du fichier de configuration de django.

working_dir: /code

À la ligne 13, ** spécifiez le répertoire de travail **. Spécifie le répertoire code à l'intérieur du conteneur. Ce répertoire est créé sur la base de la description de Dockerfile décrite dans Dernière fois.

ports: 
    - 172.0.0.1:8000:8000

Lignes 14-15, ** spécifiez le port à utiliser **. Le côté gauche «172.0.0.1: 8000» est la description de l'hôte et du port côté machine hôte, et le côté droit est la description du port côté conteneur pris en sandwich entre «:». Si vous vous connectez à «127.0.0.1: 8000» du côté de la machine hôte, vous serez connecté au «8000» numéro de «hôte» attribué automatiquement par le côté du conteneur. Concernant le port spécifié, il correspond au port spécifié par runserver dans la commande ci-dessus.

volumes:
    - .:/code

Lignes 16-17, ** Spécifiez pour le montage des données **. Comme dans la section précédente, le côté gauche avec ** : est le chemin de l'hôte, et le côté droit est le chemin du côté du conteneur **. Les changements sont synchronisés et les côtés gauche et droit gardent la même gestion. Cet élément semble être Il existe diverses autres façons de le décrire (document officiel), et il semble difficile de l'utiliser librement. ..

depends_on:
    - db

Lignes 18-19, ** spécifiez les dépendances de service **. ** Il semble que lorsque vous démarrez web, db soit également lancé **. Problème peut se produire dans l'ordre de démarrage, mais pour le moment, MySQL peut être utilisé comme base de données de l'application Django.

Côté MySQL

Ensuite, considérons la description du service MySQL.

db:

La ligne 20 commence la description des services exécutés par MySQL. Comme précédemment, ce sera (à la fin de) le nom de l'image.

container_name: djst_mysql

La 21e ligne nomme le conteneur.

image: mysql:5.7

La 22e ligne spécifie ** l'image à créer en fonction de **. Contrairement à l'élément web mentionné ci-dessus, si vous souhaitez utiliser l'image officiellement préparée telle quelle sans la personnaliser avec le Dockerfile, elle sera décrite comme ceci. Bien sûr, si vous créez un autre Dockerfile dans un répertoire séparé, vous pouvez le spécifier et l'utiliser.

restart: always

Ligne 23, ** Paramètres de redémarrage lorsque le conteneur est arrêté **. Ici, il est réglé sur «toujours» pour qu'il redémarre toujours sauf pour une opération manuelle. La valeur par défaut est «non», et il semble que vous puissiez sélectionner «sans arrêt» et «en cas d'échec» en plus de «toujours».

environment: 
    MYSQL_DATABASE: $DB_NAME
    MYSQL_USER: $DB_USER
    MYSQL_PASSWORD: $DB_PASSWORD
    MYSQL_ROOT_PASSWORD: $DB_ROOT_PASSWORD
    MYSQL_TCP_PORT: 3306
    TZ: 'Asia/Tokyo'

Les lignes 24-30 sont ** définissant les variables d'environnement **. Ceux avec «$» seront décrits dans le fichier «.env» qui sera créé plus tard, au cas où vous voudriez le publier sur «GitHub» etc. Ce sont les informations de base de données pour se connecter à partir de Django.

MYSQL_TCP_PORT devrait être cohérent avec l'option ports que nous verrons plus tard. Ici, j'ai spécifié le numéro par défaut «3306» pour MySQL. «TZ» est un paramètre régional.

volumes: 
    - ./mysql/data:/var/lib/mysql/
    - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf

Les lignes 31 à 33 sont des ** paramètres de montage de données **. Comme précédemment, l'hôte est à gauche de ** : et le chemin à l'intérieur du conteneur est à droite. ** **

La ligne ascendante est ** les paramètres de montage pour la persistance **. Les informations stockées dans la base de données sont synchronisées avec le répertoire . / Mysql / data sur l'hôte lorsque l'application est utilisée. La ligne du bas est ** Paramètres de montage dans le fichier de paramètres **. Si vous préparez un fichier . / Mysql / my.cnf qui décrit les paramètres de langue, etc., il sera reflété dans les paramètres MySQL du côté du conteneur.

De plus, si vous préparez un fichier SQL etc. sous la forme d'un montage dans le répertoire / docker-entrypoint.init.d dans le conteneur, il semble que vous puissiez également saisir les données initiales dans la base de données.

ports: 
    - 3306:3306

Enfin, ** Définissez le port à utiliser **. C'est OK si elle est cohérente avec la variable d'environnement MYSQL_TCP_PORT décrite précédemment.

Créer un fichier .env

Créez un fichier ** .env ** pour décrire les variables d'environnement. Ceci est également placé dans la même hiérarchie.

.env


DB_NAME=********
DB_USER=********
DB_PASSWORD=********
DB_ROOT_PASSWORD=********

La description est la ** définition de variable d'environnement ** correspondant à l'option ʻenvironment décrite plus haut dans docker-compose.yml. Veuillez décrire comme vous le souhaitez à la place de «*********». Si vous souhaitez le publier sur GitHub` etc., ** supprimez ce fichier de la gestion **.

Création de fichiers liés à la configuration MySQL

Créez un répertoire de montage MySQL . / Mysql et placez-y le fichier de configuration my.cnf.

mysql/my.cnf


[mysqld]
character-set-server=utf8mb4

[client]
default-character-set=utf8mb4

Saisissez ici à l'avance les variables que vous souhaitez modifier depuis le début.

Le . / Mysql / data / spécifié comme destination de montage des données de base de données est automatiquement généré lorsque $ docker-compose up est exécuté. Si vous souhaitez publier ceci sur GitHub etc. **, supprimez-le de la cible de gestion à l'avance **.

Structure de répertoire actuelle

django_starter
    ├── .venv
    │   └── (Abréviation)
    ├── config
    │     ├── __init__.py
    │     ├── asgi.py
    │     ├── settings.py
    │     ├── urls.py
    │     └── wsgi.py
    ├── mysql                 <- New!
    │     └── my.cnf
    ├── .env                  <- New!
    ├── docker-compose.yml    <- New!
    ├── Dockerfile
    ├── manage.py
    └── requirements.txt

À la fin

Vous avez maintenant créé un docker-compose.yml pour construire un environnement Django + MySQL.

Cette fois, j'ai essayé différentes choses pour comprendre la signification de chaque option, et plus j'approfondissais mes connaissances de Docker, bien sûr, **" la technologie que je veux gérer "comme" MySQL "et" Django ", plus. J'ai senti une fois de plus que je pouvais faire diverses choses librement **, alors je voulais continuer à apprendre, y compris celles-là.

La prochaine fois, j'envisagerai de ** éditer le fichier de configuration Django ** et d'exécuter la commande ** $ docker-compose up **. Cliquez ici pour le prochain article ↓ "4. Modifiez le fichier de configuration et exécutez docker-compose up"

Merci pour votre visite.

Recommended Posts

Prenons la description de docker-compose.yml (Django + MySQL ③)
Considérez la description de Dockerfile (Django + MySQL②)
J'ai essayé le serveur asynchrone de Django 3.0
Comprendre la commodité de Django Rest Framework
Script pour changer la description de fasta
Comment vérifier la version de Django
Signification de {numéro de version} dans le package mysql rpm
J'ai essayé de résumer les paramètres des différentes bases de données de Django (MySQL, PostgreSQL)
Sortie exclusive de l'application Django utilisant ngrok
J'ai vérifié la période de rétention de session de django
Envisagez d'améliorer la précision de la détection des anomalies VAE
L'histoire de l'affichage des fichiers multimédias dans Django
Paramètres Django + MySQL
Le mur lors du passage du service Django de Python 2.7 à la série Python 3
[Django] Changer l'adresse IP par défaut de la commande runserver
[Python] Changeons l'URL du site administrateur de Django
Le sens de soi
Impressions de toucher Django
le zen de Python
L'histoire de sys.path.append ()
[Django] Renommer le projet
Utiliser MySQL avec Django
La vengeance des types: la vengeance des types
Modifiez le fichier de paramètres et exécutez docker-compose up (Django + MySQL ④)
J'ai participé à l'activité de traduction du document officiel Django
Django renvoie le contenu du fichier sous forme de réponse HTTP
Maintenance de l'environnement de développement Django + MongoDB (en cours d'écriture)
L'histoire du champ de modèle Django disparaissant de la classe
Résumé des points d'achoppement à Django pour la première fois
Jusqu'au début du tutoriel django avec pycharm sous Windows
[Django] Mémo pour créer un environnement de Django + MySQL + Vue.js [Python]