Browse Source

образ для mysql

Евгений Колесников 5 months ago
parent
commit
5539ab8945
7 changed files with 180 additions and 0 deletions
  1. 94 0
      articles/docker_mysql.md
  2. 1 0
      docker_mysql/.gitignore
  3. 4 0
      docker_mysql/Dockerfile
  4. 80 0
      docker_mysql/dump.sql
  5. BIN
      img/docker03.png
  6. BIN
      img/docker05.png
  7. 1 0
      readme.md

+ 94 - 0
articles/docker_mysql.md

@@ -0,0 +1,94 @@
+# Создание первого образа (база данных)
+
+>У вас уже должен быть установлен Docker Desktop
+
+Что мы хотим от базы данных?
+
+1. Развернуть конкретную верию
+1. Задать логин и пароль доступа администратора (в контейнере такие данные обычно не хранят, а задаются в переменных окружения при запуске)
+1. Включить в образ дамп базы данных
+
+Процесс будет выполняться в несколько этапов:
+
+* создание `Dockerfile`, в котором мы опишем какой базовый образ взять и какой дамп использовать
+* сборка образа
+* запуск контейнера на основе созданного образа с указанием тома и переменных среды окружения
+
+## Создание Dockerfile
+
+```Dockerfile
+# Используем официальный образ MySQL из Docker Hub конкретной версии
+FROM mysql:8.0.37
+
+# Копируем ваш дамп (SQL-файл) в директорию, откуда MySQL будет его выполнять при первом запуске
+# Замените `dump.sql` на имя вашего файла дампа
+COPY dump.sql /docker-entrypoint-initdb.d/
+
+# задаем переменные окружения, которые используются для настройки MySQL
+# Не рекомендуется хранить пароль в образе, лучше использовать переменные окружения при запуске контейнера
+# ENV MYSQL_ROOT_PASSWORD=your-root-password
+
+# таймзона
+ENV TZ="Europe/Moscow"
+
+# по-умолчанию вход рутом разрешет только с localhost, этой командой мы разрешаем вход откуда угодно (на проде так далать конечно нельзя, и вообще ходить рутом тоже)
+ENV MYSQL_ROOT_HOST="%" 
+```
+
+Рассмотрим подробнее ключевые команды, которые мы использовали в `Dockerfile`.
+
+* `FROM` — указывает исходный образ, на котором будет строиться контейнер. **Docker** загружает его из реестра (Docker Hub). Я тут указал конкретную версию, но можно использовать теги `latest` и `stable`
+* `COPY` — копирование файлов из директории проекта в контейнер. Пример файла `dump.sql` приведен ниже, вам, естественно, нужно положить дамп своей БД с данными
+* `ENV` — устанавливает переменные среды, которые будут доступны внутри контейнера (не рекомендуется сюда писать логин/пароль).
+
+Файлы для образа (`Dockerfile` и `dump.sql`) лежат в каталоге [docker_mysql](../docker_mysql/) этого репозитория
+
+## Сборка образа
+
+>В текущем каталоге должен быть `Dockerfile` и дамп базы данных
+
+```
+docker build -t test-mysql .
+```
+
+* `docker build`: Консольная команда для сборки образа. 
+* `-t test-mysql`: Присваивает вашему образу тег `test-mysql`. 
+* `.`: Указывает, что `Dockerfile` находится в текущем каталоге. 
+
+Пока в текущем каталоге никаких изменений вы не увидите - докер хранит все образы в отдельном каталоге
+
+## Запуск образа с указанием тома (volume)
+
+```
+docker run --name test_mysql -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=toor -v ./db_volume:/var/lib/mysql test-mysql
+```
+
+* `docker run`: Консольная команда для запуска контейнера. 
+* `--name test_mysql`: человекопонятное название контейнера, которое мотом можно использовать в командах `docker start` и `docker stop` (если имя не указать, то докер присвоит какое-то свое)
+* `-d`: Запускает контейнер в фоновом режиме. 
+* `-p 3308:3306`: Пробрасывает порт MySQL контейнера на ваш локальный хост (локальный слева, контейнер справа). Можно писать одинаковые, но у меня порты `3306` и `3307` уже заняты другими экземплярами. По-умолчанию порт открывается на внешнем сетевом интерфейсе, т.е. будет доступен во внешней сети. Если вам этого не нужно, то можно указать сеть явно, например только локально: `-p 127.0.0.1:3308:3306`
+* `-e MYSQL_ROOT_PASSWORD=toor`: Устанавливает переменную окружения для пароля рута для MySQL.
+* `-v ./db_volume:/var/lib/mysql`: создает каталог `db_volume` в текущем каталоге, который будет служить томом (volume) для файлов базы данных (напоминаю, что если не создать внешний том, то после остановки контейнера все данные потеряются)
+* `test-mysql`: тег нашего образа (заданный на предыдущем шаге)
+
+После выполнения этой команды можете либо запустить Docker Desktop и убедиться что контейнер запущен:
+
+![](../img/docker03.png)
+
+Либо в консоли выполнить команду `docker ps`, которая выведет список работающих контейнеров
+
+Можем подключиться к контейнеру из менеджера баз данных и убедиться, что дамп накатился правильно
+
+![](../img/docker05.png)
+
+Итак, мы создали первый свой образ и запустили контейнер на его основе. Можно его использовать в локальной разработке, не устанавливая MySQL в основную операционную систему.
+
+На следующих занятиях мы создадим образ для АПИ и объединим его в одну сеть с базой данных
+
+---
+
+## Задание на дом
+
+Создать свой образ для базы данных (можете поиграться с версиями) и запустить контейнер
+
+В репозитории опубликовать Dockerfile и дамп базы данных

+ 1 - 0
docker_mysql/.gitignore

@@ -0,0 +1 @@
+db_volume

+ 4 - 0
docker_mysql/Dockerfile

@@ -0,0 +1,4 @@
+FROM mysql:8.0.37
+COPY dump.sql /docker-entrypoint-initdb.d/
+ENV TZ="Europe/Moscow"
+ENV MYSQL_ROOT_HOST="%" 

+ 80 - 0
docker_mysql/dump.sql

@@ -0,0 +1,80 @@
+-- MySQL Script generated by MySQL Workbench
+-- Fri Sep  5 09:18:27 2025
+-- Model: New Model    Version: 1.0
+-- MySQL Workbench Forward Engineering
+
+SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
+SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
+SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
+
+CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 ;
+USE `mydb` ;
+
+-- -----------------------------------------------------
+-- Table `Member`
+-- -----------------------------------------------------
+CREATE TABLE IF NOT EXISTS `Member` (
+  `id` INT NOT NULL AUTO_INCREMENT,
+  `memberNumber` INT NOT NULL,
+  `fullName` VARCHAR(128) NOT NULL,
+  `gender` CHAR(1) NOT NULL,
+  `birthDate` DATE NOT NULL,
+  `realAdress` VARCHAR(128) NOT NULL,
+  `postAddress` VARCHAR(128) NOT NULL,
+  PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `Genre`
+-- -----------------------------------------------------
+CREATE TABLE IF NOT EXISTS `Genre` (
+  `id` INT NOT NULL AUTO_INCREMENT,
+  `title` VARCHAR(45) NOT NULL,
+  PRIMARY KEY (`id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `Movie`
+-- -----------------------------------------------------
+CREATE TABLE IF NOT EXISTS `Movie` (
+  `id` INT NOT NULL AUTO_INCREMENT,
+  `cost` INT NOT NULL,
+  `diration` INT NOT NULL,
+  `genreId` INT NOT NULL,
+  PRIMARY KEY (`id`),
+  INDEX `fk_Movie_Genre_idx` (`genreId` ASC) VISIBLE,
+  CONSTRAINT `fk_Movie_Genre`
+    FOREIGN KEY (`genreId`)
+    REFERENCES `Genre` (`id`)
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION)
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `MemberMovie`
+-- -----------------------------------------------------
+CREATE TABLE IF NOT EXISTS `MemberMovie` (
+  `MemberId` INT NOT NULL,
+  `MovieId` INT NOT NULL,
+  PRIMARY KEY (`MemberId`, `MovieId`),
+  INDEX `fk_MemberMovie_Movie1_idx` (`MovieId` ASC) VISIBLE,
+  INDEX `fk_MemberMovie_Member1_idx` (`MemberId` ASC) VISIBLE,
+  CONSTRAINT `fk_MemberMovie_Member1`
+    FOREIGN KEY (`MemberId`)
+    REFERENCES `Member` (`id`)
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION,
+  CONSTRAINT `fk_MemberMovie_Movie1`
+    FOREIGN KEY (`MovieId`)
+    REFERENCES `Movie` (`id`)
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION)
+ENGINE = InnoDB;
+
+
+SET SQL_MODE=@OLD_SQL_MODE;
+SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
+SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

BIN
img/docker03.png


BIN
img/docker05.png


+ 1 - 0
readme.md

@@ -3,6 +3,7 @@
 ## Docker
 
 1. [Основы](./articles/docker01.md)
+1. [Создание первого образа (база данных)](./articles/docker_mysql.md)
 
 <!--