Введение
Сразу скажу, что мной двигала лень самостоятельной настройки всего этого хозяйства. В связи с этим я искал готовые контейнеры, которым можно было бы доверять и не заботиться об их обновлении и поддержке. На долю секунды у меня возникла мысль собрать контейнеры самостоятельно, но я ее быстро отбросил Тогда мне было бы проще и быстрее настраивать все без докера банальным башем или ансиблом.
Для самого web сервера под wordpress нет проблем, так как docker контейнер предоставляет сама wordpress. А вот с let’s encrypt возникли некоторые затруднения. Чего-то простого и легковесного не попадалось. В итоге остановился вот на этом проекте — https://docs.linuxserver.io/general/swag. Это многофункциональный web сервер, который больше заточен на проксирование запросов. Я сначала хотел использовать только его в том числе и в качестве веб сервера, но в итоге решил все же остаться на стандартном контейнере от wordpress.
Проект linuxserver достаточно известный. У них много готовых контейнеров на все случаи жизни, так что решил остановиться на нем. Немного поковырялся внутри, посмотрел, как все устроено. Когда разобрался, начал реализацию изначальной идеи — автоматизировать установку wordpress через docker сразу по https с бесплатными сертификатами от let’s encrypt. Запускать все буду через docker-compose. Если у вас еще не установлен докер и композ к нему, используйте мою статью — установка docker на centos.
для macOS и Windows
Docker v 18.03 и выше (с 21 марта 2018 года)
используйте свой внутренний IP-адрес или подключитесь к специальному DNS-имени который разрешится на внутренний IP-адрес, используемый хостом.
поддержка Linux в ожидании https://github.com/docker/for-linux/issues/264
MacOS с более ранними версиями Docker
Докер для Mac v 17.12-v 18.02
то же, что и выше, но используйте вместо.
Докер для Mac v 17.06 — V 17.11
то же, что и выше, но используйте вместо.
Docker для Mac 17.05 и ниже
чтобы получить доступ к хост-машине из контейнера docker, необходимо подключить псевдоним IP к сетевому интерфейсу. Вы можете привязать любой IP вы хотите, просто убедитесь, что вы не используете его ни к чему еще.
затем убедитесь, что ваш сервер прослушивает IP-адрес, упомянутый выше, или . Если он слушает localhost он не будет принимать соединения.
затем просто укажите контейнер docker на этот IP-адрес, и вы можете получить доступ к хост-машине!
для проверки вы можете запустить что-то вроде внутри контейнера.
псевдоним будет сброшен при каждой перезагрузке, поэтому создайте сценарий запуска, если необходимый.
решение и дополнительная документация здесь:
Настройка бэкапа
Некоторые оговорки:
- Название баз одинаковое во всех MySQL контейнерах. Один контейнер — одна база.
- Бэкап делается раз в сутки. Если надо чаще, то следует изменить переменную DATE на что-то типа
- Бэкап производится из родительской системы на которой крутятся контейнеры
Для удобства сделал все в одном скрипте, который надо будет самостоятельно внести в крон. Скрипт бэкапа :
#!/bin/sh DATE=`date +%Y-%m-%d` ### Бэкап сайтов # Объявить сайты, которые надо бэкапить for SITE in example.ru site.com do # Путь в родительской системе до каталога, который смонтирован в mysql контейнерах в /var/lib/mysql DBPATH=/docker/volumes/mysql/$SITE # Путь в родительской системе до каталога, в котором располагаются файлы сайта FILESPATH=/docker/volumes/sites/$SITE # Путь в родительской системе до каталога, в которой класть бэкап BACKUPPATH=/root/backup/$SITE # Путь в родительской системе до каталога, в которой смонтирован ядиск COPYTO=/mnt/yadisk/backup/$SITE # Создать каталоги mkdir -p $BACKUPPATH mkdir -p $COPYTO # Дамп Mysql внутри контейнера docker exec mysql-$SITE sh -c "mysqldump site > /var/lib/mysql/$DATE-site.sql" # Переместить созданный дамп в $BACKUPPATH mv $DBPATH/$DATE-site.sql $BACKUPPATH # Сжать файлы сайта и положить в $BACKUPPATH tar -cpzf $BACKUPPATH/$DATE.tgz $FILESPATH # Проверить смонтирован ли ядиск и если да, то скопировать туда бэкапы df -h | grep webdav.yandex.ru > /dev/null if then cp $BACKUPPATH/$DATE-site.sql $COPYTO cp $BACKUPPATH/$DATE.tgz $COPYTO else exit fi # Удалить файлы на сервере старше двух дней find $BACKUPPATH -mtime +1 -exec rm '{}' \; # Удалить файлы на ядиске старше десяти дней find $COPYTO -mtime +9 -exec rm '{}' \; done ### Бэкап конфигов докера DOCKERPATH=/docker COPYTO=/mnt/yadisk/backup/docker BACKUPPATH=/root/backup/docker mkdir -p $BACKUPPATH mkdir -p $COPYTO cp $DOCKERPATH/backup.sh $COPYTO/$DATE-backup.sh cp $DOCKERPATH/docker-compose.yml $COPYTO/$DATE-docker-compose.yml tar -cpzf $BACKUPPATH/$DATE-docker.tgz $DOCKERPATH/images cp $BACKUPPATH/$DATE-docker.tgz $COPYTO find $BACKUPPATH -mtime +1 -exec rm '{}' \; find $COPYTO -mtime +9 -exec rm '{}' \;
Подготовка конфигов
В начале подготовим конфиг nginx для проксирования запросов из контейнера с swag в wordpress. Назовем его nginx-default, так как он будет заменять дефолтный конфиг nginx.
server { listen 80; listen :80; server_name 253197.simplecloud.ru; return 301 https://$host$request_uri; } server { listen 443 ssl http2 default_server; listen :443 ssl http2 default_server; root /var/www/html/example; index index.html index.htm index.php; server_name 253197.simplecloud.ru; include /config/nginx/proxy-confs/*.subfolder.conf; include /config/nginx/ssl.conf; client_max_body_size 64M; location / { try_files $uri $uri/ /index.php?$args @app; } location @app { proxy_pass http://wordpress; proxy_set_header Host $host; proxy_redirect off; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; proxy_set_header X-Real-IP $remote_addr; } }
Вам нужно будет в нем заменить только имя сервера — 253197.simplecloud.ru. Это dns запись vds на simplecloud, которые я обычно использую для теста. Мало того, что есть возможность почасовой аренды, так сразу же с виртуалкой идет прописанное dns имя. В итоге такие vds очень удобно использовать для тестов и временного размещения чего-либо. Рекомендую.
Далее я подготовил конфиг configure-wp.sh для установки и первоначальной настройки wordpress с помощью инструмента wp-cli, который запускается в отдельном контейнере. После того, как он все выполнит, завершает свою работу.
retries=0 while : do if wp core install --url="253197.simplecloud.ru" --title="test blog" --admin_user="admin" --admin_password="pass" --admin_email="[email protected]" then break else retries=$((retries+1)) echo "Couldn't connect to DB. Try - ${retries}. Sleeping 5 seconds and will retry ..." sleep 5 fi if then echo "Couldn't connect to DB 30 times. Exiting." exit 1 fi done wp theme install donovan --activate wp theme uninstall twentynineteen wp theme uninstall twentyseventeen wp theme uninstall twentytwenty wp plugin install wordpress-importer --activate #wp plugin install classic-editor --activate #wp plugin install wp-mail-smtp --activate #wp plugin install cyr3lat --activate #wp plugin install wordpress-seo --activate wp plugin uninstall akismet wp plugin uninstall hello wp language core install ru_RU --activate
Так же я отдельно подготовил файл .htaccess с конфигурацией веб сервера apache, который используется в контейнере wordpress.
# BEGIN WordPress RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php # END WordPress php_value memory_limit 256M php_value upload_max_filesize 64M php_value post_max_size 64M php_value max_execution_time 300 php_value max_input_time 1000
Подготовка окончена, можно переходить к непосредственно установке wordpress через docker.
Извлечение и запуск образа контейнера
Откройте терминал bash в Linux или Mac либо сеанс PowerShell с повышенными привилегиями в Windows.
Извлеките образ контейнера Linux с SQL Server 2017 из центра Docker.
Совет
В рамках этого руководства примеры команд Docker приводятся как для оболочки bash (Linux/Mac), так и для PowerShell (Windows).
Чтобы запустить образ контейнера с помощью Docker, выполните следующую команду:
Важно!
Сопоставление томов узла для Docker в Windows в настоящее время не поддерживает сопоставление полного каталога. Однако можно сопоставить подкаталог, например , с хост-компьютером.
На данный момент не поддерживается сопоставление томов узла для Docker на Mac с образом SQL Server на Linux
Вместо этого следует использовать контейнеры томов данных. Это ограничение относится только к каталогу . Операции чтения из подключенного каталога осуществляются в нормальном режиме. Например, вы можете подключить каталог узла с помощью команды -v на Mac и восстановить резервную копию из файла с расширением BAK, который находится на узле.
Эта команда создает контейнер SQL Server 2017 с выпуском Developer (по умолчанию). Порт SQL Server 1433 доступен на узле как порт 1401. Необязательный параметр создает контейнер томов данных с именем sql1ddata. Он используется для сохранения данных, созданных SQL Server.
Важно!
В этом примере используется контейнер томов данных в DOCKER
Если вместо этого вы решили сопоставлять каталог узлов, обратите внимание на то, что в Docker для Mac и Windows существуют ограничения для этого подхода. Дополнительные сведения см
в статье .
Для просмотра ваших контейнеров Docker используйте команду .
Если в столбце STATUS (состояние) отображается состояние Up (запущен), то SQL Server выполняется в контейнере и прослушивает порт, указанный в столбце PORTS (порты). Если в столбце STATUS контейнера с SQL Server отображается Exited (завершен), см.руководство Устранение неполадок конфигурации.
Откройте терминал bash в Linux или Mac либо сеанс PowerShell с повышенными привилегиями в Windows.
Извлеките образ контейнера Linux с SQL Server 2019 из центра Docker.
Совет
В рамках этого руководства примеры команд Docker приводятся как для оболочки bash (Linux/Mac), так и для PowerShell (Windows).
Чтобы запустить образ контейнера с помощью Docker, выполните следующую команду:
Важно!
Сопоставление томов узла для Docker в Windows в настоящее время не поддерживает сопоставление полного каталога. Однако можно сопоставить подкаталог, например , с хост-компьютером.
На данный момент не поддерживается сопоставление томов узла для Docker на Mac с образом SQL Server на Linux
Вместо этого следует использовать контейнеры томов данных. Это ограничение относится только к каталогу . Операции чтения из подключенного каталога осуществляются в нормальном режиме. Например, вы можете подключить каталог узла с помощью команды -v на Mac и восстановить резервную копию из файла с расширением BAK, который находится на узле.
Эта команда создает контейнер SQL Server 2019 с выпуском Developer (по умолчанию). Порт SQL Server 1433 доступен на узле как порт 1401. Необязательный параметр создает контейнер томов данных с именем sql1ddata. Он используется для сохранения данных, созданных SQL Server.
Для просмотра ваших контейнеров Docker используйте команду .
Если в столбце STATUS (состояние) отображается состояние Up (запущен), то SQL Server выполняется в контейнере и прослушивает порт, указанный в столбце PORTS (порты). Если в столбце STATUS контейнера с SQL Server отображается Exited (завершен), см.руководство Устранение неполадок конфигурации.
Бэкап wordpress в docker
Отдельно расскажу, как такой сайт бэкапить или куда-то переносить. Первым делом надо сделать дамп базы данных, которая живет в docker. У меня была отдельная заметка на этот счет — Backup mysql базы в docker контейнере. В нашем случае получается такая команда:
# docker exec mysql /usr/bin/mysqldump -u root --password=root wordpress | gzip -c > ~/`date +%Y-%m-%d`_wordpress.sql.gz
Исходники сайта будут лежать в директории html. Таким образом, для бэкапа всего сайта вам достаточно куда-то скопировать исходники и дамп с базой. Я рекомендую для этого использовать rsync. У меня есть отдельная статья по этой теме — настройка бэкапа с помощью rsync.
Почему Docker?
-
Docker не является VM-системой, он не моделирует аппаратное обеспечение компьютера. Используя Docker вы получите минимальное потребление ресурсов. Docker-контейнеры взаимодействуют напрямую с ядром вашего компьютера (или ядром хоста), но при этом изолируют программу на уровне процесса.
-
Высокая скорость развертывания. Вы можете использовать готовые docker-образы, которые устанавливаются и запускаются за секунды.
-
Приложения, находящееся внутри docker-контейнеров, можно запустить на любом компьютере с установленным Docker, при этом окружение будет одинаковым.
-
Возможность простой сегрегации пользовательских данных и контейнеров-сервисов. Если вы сломаете или удалите docker-контейнер, то данные не потеряются, так как они не будут принадлежать контейнеру. Контейнер выполняет лишь функцию сервиса, и не хранит данные, которые нельзя потерять между запусками.
-
Вы можете очень быстро добавлять новые контейнеры, изменять их конфигурацию, запускать различные версии баз данных на одной машине.
Тома-контейнеры
Был ещё такой старый паттерн — «контейнеры только с данными». И он делал именно то, как назывался: просто существовал, как правило, выключенный, и единственной целью его жизни было делиться своими томами с другими контейнерами.
Чтобы получить к ним доступ, нужно было указать параметр , и магия получалась сама собой:
Shell
docker run -d —volumes-from mydatacontainer mysql
1 | docker run-d—volumes-from mydatacontainer mysql |
Если честно, то я не вижу никакой выгоды от использования этого подхода, по сравнению с обычными томами данных. Может, до версии 1.8, когда появился нормальный АПИ для томов, том-контейнер был единственным вменяемым решением, то сейчас даже Гугл не уверен, почему они всё ещё существуют.
Запуск wordpress в docker с https
Теперь самое главное — готовим конфиг docker-compose для нашей магии, с помощью которой wordpress будет автоматически установлен одной командой. И не придется заморачиваться с сертификатами и всем остальным. Это все отлично подойдет для разработчиков. Самые отважные так запускают сайты в прод заказчикам. В целом, криминала в этом нет, но мне кажется на мелких проектах и одиночных vps лучше все это без докера в прод выпускать.
Вот мой финальный docker-compose.yaml.
version: '3' services: swag: image: linuxserver/swag container_name: swag cap_add: - NET_ADMIN environment: - TZ=Europe/Moscow - URL=253197.simplecloud.ru # - SUBDOMAINS=www, - VALIDATION=http volumes: - "./nginx-default:/config/nginx/site-confs/default" ports: - 443:443 - 80:80 restart: unless-stopped mysql: image: mysql:8 container_name: mysql command: --default-authentication-plugin=mysql_native_password restart: always environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: wordpress volumes: - "./mysql:/var/lib/mysql" wordpress: image: wordpress:php7.4-apache container_name: wordpress depends_on: - mysql environment: WORDPRESS_DB_HOST: mysql WORDPRESS_DB_USER: root WORDPRESS_DB_PASSWORD: root WORDPRESS_DB_NAME: wordpress volumes: - "./html:/var/www/html/" - "./.htaccess:/var/www/html/.htaccess" wp-cli: image: wordpress:cli container_name: wp-cli user: "33:33" environment: WORDPRESS_DB_HOST: mysql WORDPRESS_DB_USER: root WORDPRESS_DB_PASSWORD: root WORDPRESS_DB_NAME: wordpress volumes: - "./html:/var/www/html/" - "./configure-wp.sh:/opt/configure-wp.sh" command: "bash /opt/configure-wp.sh"
Жирным я выделил то, что вам нужно заменить на свои значения. Сохраняем конфиг и запускаем docker-compose:
# docker-compose up
Наблюдаем в консоли запуск нашего проекта на wordpress с помощью docker контейнеров. Если все в порядке, то последним вы должны у видеть примерно следующее.
Успешный выпуск tls сертификата lert’s encrypt будет выглядеть в логах вот так.
Можно сходить по адресу сайта и убедиться, что все работает.
Ваша рабочая директория со скриптами и исходниками будет выглядеть следующим образом.
- html — исходники сайта
- mysql — бинарные файлы базы данных
Можете все это забэкапить или положить в git, настроив исключение для директории с базой. Ее можно дампить отдельно и как-то сохранять. При желании можно в тот же git класть, если она не очень большая.
Развёртывание дампов MySQL, PostgreSQL и MongoDB
Если для работы web-проектов требуются перенести данные в хранилища, то следуйте описанным ниже инструкциям.
Как развернуть дамп PostgreSQL?
Выполните следующую команду на локальной машине:
docker exec -i postgres psql --username user_name database_name < /path/to/dump/pgsql-backup.sql
или зайдите в контейнер postgres и выполните:
psql --username user_name database_name < /path/to/dump/pgsql-backup.sql
user_name — имя пользователя. Значение POSTGRES_USER.
database_name — название базы данных. Значение POSTGRES_DB.
Как развернуть дамп MySQL?
Вариант 1
Если требуется создать дополнительных пользователей, то следует это сделать перед началом процедуры загрузки дампа.
В файле mysql/conf.d/config-file.cnf отключите лог медленных запросов slow_query_log=0 или установите большое значение long_query_time, например 1000.
Если дамп сжат утилитой gzip, сначала следует распаковать архив:
gunzip databases-dump.sql.gz
Затем можно развернуть дамп, выполнив на локальном компьютере команду:
docker exec -i mysql mysql --user=root --password=secret --force < databases-dump.sql
Указывать пароль в командной строке — плохая практика, не делайте так в производственной среде.
MySQL выдаст справедливое предупреждение:
Ключ —force говорит MySQL, что ошибки следует проигнорировать и продолжить развёртывание дампа. Этот ключ иногда может пригодится, но лучше его без необходимости не применять.
Вариант 2
Воспользоваться утилитой Percona XtraBackup.
Percona XtraBackup — это утилита для горячего резервного копирования баз данных MySQL.
Как развернуть дамп MongoDB?
-
Скопируйте фалы дампа в каталог mongo/dump.
-
Войдите в контейнер mongo:
docker exec -it mongo sh
Выполните следующую команду, чтобы развернуть дамп базы database_name:
mongorestore -d database_name /dump/databases/database_name
Возможности и особенности среды разработки
-
Несколько версий 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 каждый контейнер должен содержать в себе только один сервис.
Репозиторий проекта
Вопросы и ответы
Несколько важных вопросов и ответов.
Как зайти в работающий docker-контейнер?
Выполните команду:
container_name — имя контейнера.
Как останавливать и удалить контейнеры и другие ресурсы среды разработки, которые были созданы?
Как получить список всех контейнеров?
Как получить подробную информацию о docker-контейнере?
containername — имя контейнера.
Как получить полный список расширений PHP, которые установлены в контейнере php-7.3?
Если контейнер php-7.3 запущен, то выполните команду:
Как удалить все контейнеры?
Удаление всех контейнеров:
Удаление всех активных контейнеров:
Удаление всех неактивных контейнеров:
Восстановление
Файлы Распаковать и скопировать в нужный каталог.
Базы
# Скопировать файл бэкапа в примапленный каталог нужного контейнера cp /mnt/yadisk/backup/$SITE/$TIME-site.sql /docker/volumes/mysql/$SITE/$TIME-site.sql # Залить дамп в базу для нужного контейнера docker exec mysql-$SITE sh -c "mysql -f site < /var/lib/mysql/$TIME-site.sql"
Если будут какие-то косяки с восстановлением — остановить нужный контейнер, тупо удалить все данные MySQL для нужного сайта и снова запустить его:
docker-compose stop mysql-$SITE rm -rf /docker/volumes/mysql/$SITE/* docker-compose start mysql-$SITE
Затем создать базу по-новой и залить дамп:
docker exec -it mysql-$SITE mysql -e 'CREATE DATABASE `site` CHARACTER SET utf8 COLLATE utf8_general_ci;' docker exec mysql-$SITE sh -c "mysql -f site < /var/lib/mysql/$TIME-site.sql"
Или поднять контейнер phpMyAdmin и сделать руками.
Настройка Яндекс.Диск
Можно пойти двумя путями — это поставить клиент или использовать протокол WebDAV. Поскольку мне лень разбираться с работой клиента, то далее будет описан второй вариант.
Установка:
apt install davfs2
В ходе установки спросит разрешать ли обычным пользователям монтировать WebDAV ресурсы. Если надо дать права пользователям — да, если планируется монтировать только от рута — нет. В заметке приведены варианты настроек для обоих случаев.
Монтирование для рута
Авторизация:
mkdir /mnt/yadisk # Внести логин и пароль в файл echo '/mnt/yadisk/ login password' >> /etc/davfs2/secrets
Если пароль содержит спецсимволы, то их надо отбить или заключить пароль в кавычки. Примеры есть в файле .
Монтирование и автомонтирование при ребуте:
echo 'https://webdav.yandex.ru /mnt/yadisk davfs rw,_netdev,uid=root 0 0' >> /etc/fstab # Смонтировать руками без перезагрузки mount -a # Проверить df -h | grep yandex
Монтирование для пользователя
Авторизация:
mkdir /home/user/yadisk # Внести логин и пароль в файл echo '/home/user/yadisk login password' >> /home/user/.davfs2/secrets # Назначить секьюрные права на файл chown user:user /home/user/.davfs2/secrets chmod 400 /home/user/.davfs2/secrets # Добавить юзера в группу для предоставления права использовать davfs # Необходимо перелогиниться для применения прав доступа, если это текущий пользователь usermod -a -G davfs2 user
С монтированием можно пойти несколькими путями
1. Монтировать только руками:
echo 'https://webdav.yandex.ru /home/user/yadisk davfs rw,user,noauto 0 0' >> /etc/fstab
Команда для монтирования пользователем:
mount ~/yadisk
2. Автомонтирование: Тут снова можно пойти двумя путями, в зависимости от задачи: 2.1. При логине пользователя:
echo 'mount ~/yadisk' >> /home/user/.profile
2.2. При старте системы. Быть может другой способ и существует, но я его не искал, поскольку не вижу смысла в этом варианте. Как и у рута придется положить логин\пароль в :
echo '/home/user/yadisk login password' >> /etc/davfs2/secrets
И монтировать с другими опциями:
echo 'https://webdav.yandex.ru /home/user/yadisk davfs rw,user,_netdev 0 0' >> /etc/fstab
Восстановление базы данных
Теперь файл резервной копии находится в контейнере
Перед восстановлением резервной копии важно узнать логические имена и типы файлов в резервной копии. Следующие команды Transact-SQL проверяют резервную копию и выполняют восстановление с помощью sqlcmd в контейнере
Совет
В этом руководстве средство sqlcmd используется в контейнере, так как оно предустановлено в этом контейнере. Однако вы также можете запустить инструкции Transact-SQL с помощью других клиентских сред извне контейнера, таких как Visual Studio Code или SQL Server Management Studio. Для подключения используйте порт узла, сопоставленный с портом 1433 в контейнере. В нашем примере это localhost,1401 на хост-компьютере и удаленный Host_IP_Address,1401.
-
Запустите sqlcmd внутри контейнера, чтобы вывести список логических имен файлов и путей внутри резервной копии. Для этого используется инструкция RESTORE FILELISTONLY Transact-SQL.
Выходные данные должны иметь следующий вид.
-
Вызовите команду RESTORE DATABASE, чтобы восстановить базу данных внутри контейнера. Укажите новые пути для каждого из файлов в предыдущем шаге.
Выходные данные должны иметь следующий вид.
Простое монтирование папки
Shell
docker run -d \
-e MYSQL_ROOT_PASSWORD=my-secret-pw \
-v /home/docker/mysql-data:/var/lib/mysql \
—name mysqlserver \
mysql
1 4 |
docker run-d\ -eMYSQL_ROOT_PASSWORD=my-secret-pw\ —name mysqlserver\ mysql |
Если такой контейнер удалить, то его данными вообще ничего не случится.
Shell
docker stop mysqlserver
docker rm mysqlserver
ls /home/docker/mysql-data
#auto.cnf client-cert.pem ib_logfile0 mysql/ public_key.pem sys/
#ca-key.pem client-key.pem ib_logfile1 performance_schema/ server-cert.pem
#ca.pem ib_buffer_pool ibdata1 private_key.pem server-key.pem
1 |
docker stop mysqlserver docker rmmysqlserver ls/home/docker/mysql-data #auto.cnf client-cert.pem ib_logfile0 mysql/ public_key.pem sys/ |
Теперь мы можем запустить новый mysql, подключить папку к тому же пути, и новый контейнер продолжит с того же места, где остановился старый.
Монтирование только для чтения
Иногда такие папки имеет смысл давать только на чтение. Например, для веб-сервера. Это очень легко сделать, добавив в конце пути:
Shell
docker run
-v /home/docker/www:/usr/share/nginx/html:ro
…
1 3 |
docker run … |
Просмотр уже подключённых папок
Запомнить, что же именно сейчас подключено к тому или иному контейнеру — нереально. Но это и не нужно. Есть команда , которая кроме настроек сети, хоста и, собственно, контейнера, выведет и все volumes, которые к нему подключены:
Shell
docker inspect mysqlserver
# …
# «Mounts»: [
# {
# «Source»: «/home/docker/mysql-data»,
# «Destination»: «/var/lib/mysql»,
# «RW»: true,
# …
# }
# ],
# …
1 |
docker inspect mysqlserver # … |
Заключение
Вот так современные технологии упрощают и ускоряют разработку и обслуживание. Сравните с тем, что надо сделать, чтобы настроить типовой веб сервер вручную — настройка веб сервера apache. А тут раз, два и все готово. И потом переносится на любую ОС с докером за минуту. Другое дело, что чтобы во всем этом разбираться, надо сначала научиться вручную все это настраивать, а потом переходить к контейнерам. Иначе они будут как черный ящик. Когда что-то сломается, останется только потыкать в него, но это не приведет к решению проблемы.
Другой вариант решения вопроса — автоматизировать все это с помощью ansible. Я пробовал что-то делать в этом направлении, но реально написать хороший плейбук занимает много времени. Если работаешь не на однотипном потоке, это не оправдывает затраты времени. С докером быстрее и проще получается.
Онлайн курс Infrastructure as a code
Если у вас есть желание научиться автоматизировать свою работу, избавить себя и команду от рутины, рекомендую пройти онлайн курс Infrastructure as a code. в OTUS. Обучение длится 4 месяца.
Что даст вам этот курс:
- Познакомитесь с Terraform.
- Изучите систему управления конфигурацией Ansible.
- Познакомитесь с другими системами управления конфигурацией — Chef, Puppet, SaltStack.
- Узнаете, чем отличается изменяемая инфраструктура от неизменяемой, а также научитесь выбирать и управлять ей.
- В заключительном модуле изучите инструменты CI/CD: это GitLab и Jenkins
Смотрите подробнее программу по .
Онлайн курс «DevOps практики и инструменты»
Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, научиться непрерывной поставке ПО, мониторингу и логированию web приложений, рекомендую познакомиться с онлайн-курсом «DevOps практики и инструменты» в OTUS. Курс не для новичков, для поступления нужны базовые знания по сетям и установке Linux на виртуалку. Обучение длится 5 месяцев, после чего успешные выпускники курса смогут пройти собеседования у партнеров.
Проверьте себя на вступительном тесте и смотрите программу детальнее по .