|
|
@@ -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 и убедиться что контейнер запущен:
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+Либо в консоли выполнить команду `docker ps`, которая выведет список работающих контейнеров
|
|
|
+
|
|
|
+Можем подключиться к контейнеру из менеджера баз данных и убедиться, что дамп накатился правильно
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+Итак, мы создали первый свой образ и запустили контейнер на его основе. Можно его использовать в локальной разработке, не устанавливая MySQL в основную операционную систему.
|
|
|
+
|
|
|
+На следующих занятиях мы создадим образ для АПИ и объединим его в одну сеть с базой данных
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## Задание на дом
|
|
|
+
|
|
|
+Создать свой образ для базы данных (можете поиграться с версиями) и запустить контейнер
|
|
|
+
|
|
|
+В репозитории опубликовать Dockerfile и дамп базы данных
|