Меню Рубрики

Docker toolbox mysql windows

MySQL в контейнере Docker — часть I

Тема MySQL казалось бы, уже сто раз обсосана, но все-таки она является одной из важных, поскольку MySQL хранит все наши данные уже не один десяток лет, она одна
из ведущих систем управления базами данных, и я думаю что вам понравится тема, которую я хочу предложить.

На первый взгляд, создание контейнера MySQL для Docker довольно легко, но если вы хотите подключиться (не уверены, что сервер mysql, который не позволил бы этого, был бы хорош) и отделить ваши базы данных от вашего контейнера (я предполагаю, что Вы не хотите, чтобы они уходили с вашим контейнером), тогда есть несколько проблем.

Я начинаю эту статью с упрощенного примера (с эфемерным хранилищем базы данных и без возможности подключения). Вы можете перейти на gist (в котором есть файлы для сборки контейнера, а также некоторые скрипты для его сборки и запуска), если все станет слишком скучным или запутанным.

1. Делаем основу

Сейчас мы наметим Dockerfile на основе Ubuntu.

FROM ubuntu
RUN dpkg-divert —local —rename —add /sbin/initctl
RUN ln -s /bin/true /sbin/initctl
RUN echo «deb http://archive.ubuntu.com/ubuntu precise main universe» > /etc/apt/sources.list
RUN apt-get update
RUN apt-get -y install mysql-server
EXPOSE 3306
CMD [ «/usr/bin/mysqld_safe» ]

затем создадим и пометим его:

Теперь у нас есть полностью функционирующий контейнер, который мы можем запустить так:

docker run -d -p 3306:3306 mysql-ubu

Он будет работать, но такой подход не полезен, потому что:

  • mysql слушает на адресе 127.0.0.1, таким образом, мы можем только соединиться изнутри контейнера;
  • у нас есть только пользователь root, и ему разрешено входить только из контейнера;
  • поскольку наши данные записываются внутри контейнера, если мы теряем контейнер или нам нужно что-то изменить (например, применить Обновление безопасности), мы теряем наши данные.

2. Обновим адресную привязку

Первый шаг должен заставить наш сервер mysql слушать больше, чем localhost так, чтобы мы могли соединиться извне с нашим контейнером.

Для этого нам нужно обновить bind-адрес в /etc/mysql/my.cnf от 127.0.0.1 до 0.0.0.0 (то есть сделаем привязку mysqld к каждой доступной сети вместо просто localhost.)

Мы могли бы просто добавить поддержку файлика /etc/mysql/my.cnf и добавить его в наш контейнер. а именно в Dockerfile:

Или мы можем обновить это свойство. Я предпочитаю этот способ, потому что я получаю самую последнюю конфигурацию из своей установки и просто обновляю то, что мне нужно. Мы можем добавить соответствующую команду sed в наш Dockerfile после установки mysql-server.

RUN sed -i -e»s/^bind-address\s*=\s*127.0.0.1/bind-address = 0.0.0.0/» /etc/mysql/my.cnf

Даже при том, что mysqld сейчас слушает все, мы все еще не можем войти, потому что пользователь root только имеет доступ от localhost.

Нам нужно добавить учетную запись администратора для администрирования баз из-за пределов контейнера. Для того, чтобы добавить учетную запись, нам нужно, чтобы сервер mysql работал. Так как отдельные строки в Dockerfile создают различные коммиты, и коммиты сохраняют только состояние файловой системы (не состояние памяти), нам нужно втиснуть обе команды в один коммит:

А теперь давайте все соберем и запустим.

docker build -t mysql-ubu .
docker run -d -p 3306:3306 mysql-ubu

Теперь попробуем подключиться. Для того, чтобы сделать это, нам нужно выяснить ip контейнера, и чтобы найти это, нам нужен идентификатор нашего контейнера. Это достаточно легко сделать вручную с помощью docker ps и docker inspect, но вы также можете написать сценарий:

CONTAINER_ID =$( docker ps | grep mysql | awk ‘)
IP =$( docker inspect $CONTAINER_ID | python -c ‘import json,sys;obj=json.load(sys.stdin);print obj[0][«NetworkSettings»][«IPAddress»]’ )
mysql -u admin -p -h $IP

Теперь у нас есть полнофункциональный контейнер mysql! Это здорово, но мы вкладываем много доверия в этот контейнер, полагаясь на него, чтобы отслеживать наши базы данных, не говоря уже о том, что мы бы облажались, если мы когда-нибудь захотели обновить что-нибудь. Почему? Да потому, что данные непостоянны. Как их сделать постоянными — читайте далее.

3. Делаем данные постоянными

Нам нужно удалить нашу зависимость от этого конкретного контейнера, и для этого нам нужно экстернализировать (попросту говоря, сделать внешним) наш каталог данных. Это легко, но вызывает проблемы. При запуске нашего контейнера мы просто посылаем в контейнер команду -v /host/path:/container/path , и поставляемый каталог на вашем хост-компьютере используется в контейнере везде, где мы указываем.

Таким образом, чтобы сохранить базы данных из нашего контейнера в /data/mysql на вашем хост-компьютере, мы обновляем нашу команду run:

docker run -d -p 3306:3306 -v /data/mysql:/var/lib/mysql mysql-ubu

Проблема в том, что мы просто уничтожим наши системные таблицы, когда мы заменим /var/lib/mysql нашим пустым каталогом. Это также означает, что мы потеряли нашего администратора. Это сложно объяснить, потому что мы не можем инициализировать каталог (или добавить нашего администратора), пока каталог данных не будет виден контейнеру (во время выполнения), но мы не хотим инициализировать каталог каждый раз, когда мы запускаем либо. Весь смысл экстернализации каталога данных заключается в том, чтобы контейнер мог «приходить» и «уходить» без потери данных.

Чтобы решить эту проблему, давайте создадим скрипт, который для замены просто вызывает /usr/bin/mysqld_safe.

Во-первых, давайте напишем наш сценарий ( startup.sh) для инициализации только в том случае, если каталог данных еще не заполнен.

Это будет искать файл «ibdata1» в наших данных как способ определить, нужно ли нам инициализировать каталог или нет. После того, как каталог данных был инициализирован (или определен уже инициализирован), мы можем продолжить запуск сервера.

И теперь мы обновим Dockerfile, чтобы добавить startup.sh к контейнеру и вызвать его вместо mysqld_safe:

Мы также можем добавить в нашего admin пользователя со скриптом следующее:

И, конечно, мы должны также удалить строку запуска из Dockerfile, который делал то же самое, но получал отмену как только мы расширили каталог данных.

Источник

Setting Up a MySQL Database in Docker

Learn to set up and run Docker containers for databases

Docker offers many advantages for deploying and testing applications and databases that are an integral part of your application, so it’s worth learning to set up and run Docker containers for databases.

In this article, we will focus on the following topics:

  1. Create a Docker Compose YAML file for a MySQL Docker container.
  2. Connect to the MySQL database, running on a container, using various methods.
  3. Create and run multiple versions of MySQL in Docker containers.

Let’s go through these one-by-one.

1. Create a Docker Compose YAML File for a MySQL Docker Container

Let’s create a directory, db-docker , and then create a docker-compose.yml file in that directory:

Basically, here, we will specify the services we are going to use and set up the environment variables related to those.

We will change this file multiple times throughout this article.

Add the following in the docker-compose.yml file we just created:

We specified the name of our MySQL container as mysql-development and the Docker image to be used is mysql:8.0.17 . Where if don’t specify the tag as 8.0.17 , it will take the latest one.

The next thing we need to specify is the environment variables, i.e. the user, password, and database. If you don’t specify the user, by default it will be root .

We will use helloworld as password and testapp as database.

Another important thing is port mapping. 3308:3306 means that the MySQL running in the container at port 3306 is mapped to the localhost of the host machine at port 3308 . You can use a different port as well.

Now, after creating the .yml file, we need to run the following command in the same directory where the .yml file is located:

This will pull the Docker image (if the image is not available locally, it will pull from Docker Hub) and then run the container.

We can check the status with:

This will show the name of the container, command, and state of the container, which shows, for example, that the container is running. It also shows port mapping.

In the next step, we will connect to this MySQL container and run some commands.

2. Connect to the MySQL Database Running in a Container

We will discuss two methods to connect and run SQL commands on the MySQL running in a Docker container.

The first method is to use tools like MySQL Workbench (DataGrip also can be used).

As we now have a MySQL container running at our local machine’s port 3308 , we can connect using the following configuration parameters:

The connection through the local machine’s port 3308 was only possible due to port mapping.

If we want to connect to containerized MySQL, without mapping ports, i.e. from another application running on the same Docker network, we have to use tools like Adminer, which is our other method.

Adminer is a PHP-based web application for accessing databases.

Now, we will add another service for Adminer in our docker-compose.yml file. But, before we make changes here, we need to stop running the container and remove it with the following command:

Let’s add the following in our docker-compose.yml file:

Now, let’s start the Docker containers again:

After running this, the image for Adminer will be pulled and the container for both MySQL and Adminer will be started.

We can check this using docker-compose ps .

Now, we can go to our browser and go to localhost:8080 for Adminer. As Adminer runs on the same Docker network as MySQL, it can access the MySQL container via port 3306 (or simply, by the container’s name).

Note: We can’t access the MySQL container through port 3308 in Adminer, as this will try to access port 3308 of the Docker Compose network, not our local machine’s 3308 port.

Источник

Среда разработки PHP на базе Docker

Решение, которое позволит создать на локальном компьютере универсальную среду разработки на PHP за 30 — 40 минут.

Почему Docker?

Docker не является VM-системой, он не моделирует аппаратное обеспечение компьютера. Используя Docker вы получите минимальное потребление ресурсов. Docker-контейнеры взаимодействуют напрямую с ядром вашего компьютера (или ядром хоста), но при этом изолируют программу на уровне процесса.

Высокая скорость развертывания. Вы можете использовать готовые docker-образы, которые устанавливаются и запускаются за секунды.

Приложения, находящееся внутри docker-контейнеров, можно запустить на любом компьютере с установленным Docker, при этом окружение будет одинаковым.

Возможность простой сегрегации пользовательских данных и контейнеров-сервисов. Если вы сломаете или удалите docker-контейнер, то данные не потеряются, так как они не будут принадлежать контейнеру. Контейнер выполняет лишь функцию сервиса, и не хранит данные, которые нельзя потерять между запусками.

Вы можете очень быстро добавлять новые контейнеры, изменять их конфигурацию, запускать различные версии баз данных на одной машине.

Требования

Docker engine 19.x и выше.

Возможности и особенности среды разработки

Несколько версий PHP — 7.3 и 7.1 с набором наиболее востребованных расширений.

Возможность использовать для web-проектов разные версии PHP.

Готовый к работе монитор процессов Supervisor.

Предварительно сконфигурированный веб-сервер Nginx.

Базы данных: MySQL 5.7, MySQL 8, PostgreSQL (latest), MongoDB 4.2, Redis (latest).

Настройка основных параметров окружения через файл .env.

Возможность модификации сервисов через docker-compose.yml.

Последняя версия docker-compose.yml.

Все docker-контейнеры базируются на официальных образах.

Структурированный Dockerfile для создания образов PHP.

Каталоги большинства docker-контейнеров, в которых хранятся пользовательские данные и параметры конфигурации смонтированы на локальную машину.

В целом, среда разработки удовлетворяет требованию — при использовании Docker каждый контейнер должен содержать в себе только один сервис.

Репозиторий проекта

Структура проекта

Рассмотрим структуру проекта.

Примечание

В некоторых каталогах можно встретить пустой файл .gitkeep. Он нужен лишь для того, чтобы была возможность добавить каталог под наблюдение Git.

.gitkeep — является заполнением каталога, это фиктивный файл, на который не следует обращать внимание.

.env-example

Пример файла с основными настройками среды разработки.

.gitignore

Каталоги и файлы, в которых хранятся пользовательские данные, код ваших проектов и ssh-ключи внесены в. gitignore.

Этот каталог предназначен для хранения ssh-ключей.

readme.md

docker-compose.yml

Документ в формате YML, в котором определены правила создания и запуска многоконтейнерных приложений Docker. В этом файле описана структура среды разработки и некоторые параметры необходимые для корректной работы web-приложений.

mongo

Каталог базы данных MongoDB.

mongo.conf — Файл конфигурации MongoDB. В этот файл можно добавлять параметры, которые при перезапуске MongoDB будут применены.

db — эта папка предназначена для хранения пользовательских данных MongoDB.

dump — каталог для хранения дампов.

mysql-5.7

Каталог базы данных MySQL 5.7.

config-file.cnf — файл конфигурации. В этот файл можно добавлять параметры, которые при перезапуске MySQL 5.7 будут применены.

data — эта папка предназначена для хранения пользовательских данных MySQL 5.7.

dump — каталог для хранения дампов.

logs — каталог для хранения логов.

mysql-8

Каталог базы данных MySQL 8.

config-file.cnf — файл конфигурации. В этот файл можно добавлять параметры, которые при перезапуске MySQL 8 будут применены.

data — эта папка предназначена для хранения пользовательских данных MySQL 8.

dump — каталог для хранения дампов.

logs — каталог для хранения логов.

nginx

Эта папка предназначена для хранения файлов конфигурации Nginx и логов.

default.conf — файл конфигурации, который будет применён ко всем виртуальным хостам.

vhost.conf — здесь хранятся настройки виртуальных хостов web-проектов.

Рассмотрим vhost.conf подробнее:

В файле конфигурации описаны настройки для двух web-проектов — project-1.localhost и project-2.localhost.

Здесь следует обратить внимание на то, как производится перенаправление запросов к нужному docker-контейнеру.

Например, для проекта project-1.localhost указано:

php-7.3 — название docker-контейнера, а 9000 — порт внутренней сети. Контейнеры между собой связаны через внутреннюю сеть, которая определена в файле docker-compose.yml.

php-ini

В этом каталоге находятся файлы конфигурации PHP.

Для каждой версии PHP — свой файл конфигурации.

php-workers

Место для хранения файлов конфигурации Supervisor.

Для каждой версии PHP — могут быть добавлены свои файлы с настройками.

php-workspace

Здесь хранится файл, в котором описаны действия, выполняемые при создании образов docker-контейнеров PHP.

Dockerfile — это текстовый документ, содержащий все команды, которые следует выполнить для сборки образов PHP.

postgres

Каталог для системы управления базами данных PostgreSQL.

data — эта папка предназначена для хранения пользовательских данных PostgreSQL.

dump — каталог для хранения дампов.

projects

Каталог предназначен для хранения web-проектов.

Вы можете создать в это каталоге папки, и поместить в них ваши web-проекты.

Содержимое каталога projects доступно из контейнеров php-7.1 и php-7.3.

Если зайти в контейнер php-7.1 или php-7.3, то в каталоге /var/www будут доступны проекты, которые расположены в projects на локальной машине.

redis

Каталог key-value хранилища Redis.

conf — папка для хранения специфических параметров конфигурации.

data — если настройки конфигурации предполагают сохранения данных на диске, то Redis будет использовать именно этот каталог.

Программы в docker-контейнерах PHP

Полный перечень приложений, которые установлены в контейнерах php-7.xможно посмотреть в php-workspace/Dockerfile.

Здесь перечислим лишь некоторые, наиболее важные:

Начало работы

1. Выполните клонирование данного репозитория в любое место на вашем компьютере.

Перейдите в директорию, в которую вы клонировали репозиторий. Все дальнейшие команды следует выполнять именно в этой директории.

2. Скопируйте файл .env-example в .env

Если это необходимо, то внесите изменения в файл .env. Измените настройки среды разработки в соответствии с вашими требованиями.

3. Выполните клонирование web-проектов в каталог projects.

Для примера, далее мы будем исходить из предположения, что у вас есть 2 проекта:

project-1.ru — будет работать на версии PHP 7.3, а project-2.ru — на PHP 7.1.

4. Отредактируйте настройки виртуальных хостов Nginx.

Файл конфигурации виртуальных хостов находится в каталоге ./nginx/conf.d/.

5. Настройте хосты (доменные имена) web-проектов на локальной машине.

Необходимо добавить названия хостов web-проектов в файл hosts на вашем компьютере.

В файле hosts следует описать связь доменных имён ваших web-проектов в среде разработки на локальном компьютере и IP docker-контейнера Nginx.

На Mac и Linux этот файл расположен в /etc/hosts. На Windows он находится в C:\Windows\System32\drivers\etc\hosts.

Строки, которые вы добавляете в этот файл, будут выглядеть так:

В данном случае, мы исходим из того, что Nginx, запущенный в docker-контейнере, доступен по адресу 127.0.0.1 и web-сервер слушает порт 80.

Не рекомендуем использовать имя хоста с .dev на конце в среде разработки. Лучшей практикой является применение других названий — .localhost или .test.

6. [опционально, если это необходимо] Настройте маршрутизацию внутри контейнеров web-проектов.

Web-проекты должны иметь возможность отправлять http-запросы друг другу и использовать для этого название хостов.

Из одного запущенного docker-контейнера php-7.1 web-приложение № X должно иметь возможность отправить запрос к другому web-приложению № Y, которое работает внутри docker-контейнера php-7.3. При этом адресом запроса может быть название хоста, которое указано в файле /etc/hosts локального компьютера.

Чтобы это стало возможным нужно внутри контейнеров так же внести соответствующие записи в файл /etc/hosts.

Самый простой способ решить данную задачу — добавить секцию extra_hostsв описание сервисов php-7.1 и php-7.3 в docker-compose.yml.

IP_HOST_machine — IP адрес, по которому из docker-контейнера доступен ваш локальный компьютер.

Если вы разворачиваете среду разработки на Mac, то внутри docker-контейнера вам доступен хост docker.for.mac.localhost.

Узнать IP адрес вашего Mac можно при помощи команды, который нужно выполнить на локальной машине:

В результате вы получите, что-то подобное:

После того, как вам станет известен IP-адрес, укажите его в секции extra_hostsв описание сервисов php-7.1 и php-7.3 в docker-compose.yml.

8. Настройте параметры соединения с системами хранения данных.

Хосты и порты сервисов

Для того, чтобы настроить соединения с базами данных из docker-контейнеров php-7.1 и php-7.3 следует использовать следующие названия хостов и порты:

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

  • Docker for windows что это
  • Docker config file windows
  • Docker compose volumes windows
  • Docker bash windows 10
  • Docker application port windows