Восстановление базы данных sql server в контейнере docker на базе linux

Введение

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

Для самого 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?

  1. Скопируйте фалы дампа в каталог mongo/dump.

  2. Войдите в контейнер 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.

  1. Запустите sqlcmd внутри контейнера, чтобы вывести список логических имен файлов и путей внутри резервной копии. Для этого используется инструкция RESTORE FILELISTONLY Transact-SQL.

    Выходные данные должны иметь следующий вид.

  2. Вызовите команду 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
2

4
5

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
2
3
4
5
6

docker stop mysqlserver

docker rmmysqlserver

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

Теперь мы можем запустить новый 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
2
3
4
5
6
7
8
9
10
11

docker inspect mysqlserver

#    …
#    «Mounts»: [
#            {
#                «Source»: «/home/docker/mysql-data»,
#                «Destination»: «/var/lib/mysql»,
#                «RW»: true,
#                …
#            }
#        ],
#    …

Заключение

Вот так современные технологии упрощают и ускоряют разработку и обслуживание. Сравните с тем, что надо сделать, чтобы настроить типовой веб сервер вручную — настройка веб сервера 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 месяцев, после чего успешные выпускники курса смогут пройти собеседования у партнеров.

Проверьте себя на вступительном тесте и смотрите программу детальнее по .

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Техноарена
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: