Cet article correspond à la ** partie 3 ** des articles relatifs à Apprenez à utiliser Docker en construisant l'environnement de Django + MySQL.
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 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
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.
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.
pip install pour synchroniser automatiquement les packages utilisés dans l'hôte et le conteneur **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.
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é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é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 **.
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
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.