Запуск простых сервисов в Docker контейнерах
Nginx
Создаём каталог nginx с необходимыми подкаталогами внутри:
mkdir -p ./nginx/{html,conf,conf.d}
Копируем основные конфиги из контейнера на хост:
docker run --rm nginx cat /etc/nginx/nginx.conf > ./nginx/conf/nginx.conf
docker run --rm nginx cat /etc/nginx/conf.d/default.conf > ./nginx/conf.d/default.conf
docker run --rm nginx cat /usr/share/nginx/html/index.html > ./nginx/html/index.html
Запускаем контейнер:
docker run -d \
-p 8080:80 \
--name my-nginx \
-v ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro \
-v ./nginx/conf.d/:/etc/nginx/conf.d:ro \
-v ./nginx/html:/usr/share/nginx/html:ro \
nginx
Следующие файлы можно редактировать на хосте:
nginx/conf/nginx.conf- основной конфигnginx/conf.d/default.conf- конфиг сайта по умолчаниюnginx/html/index.html- индексная страничка
Для проверки можете открыть в браузере: http://<ip-host>:8080.
Apache 2
Начинаем с того же, то есть создаём каталог apache с необходимыми подкаталогами внутри:
mkdir -p ./apache/{html,conf}
Копируем основные конфиги из контейнера на хост:
docker run --rm httpd cat /usr/local/apache2/conf/httpd.conf > ./apache/conf/httpd.conf
docker run --rm httpd cat /usr/local/apache2/htdocs/index.html > ./apache/html/index.html
Запускаем контейнер:
docker run -d \
--name my-apache \
-p 8081:80 \
-v ./apache/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf:ro \
-v ./apache/html:/usr/local/apache2/htdocs/:ro \
httpd
Для проверки откройте в браузере: http://<ip-host>:8081.
Postgres
Для начала создаём раздел для хранения данных:
docker volume create postgres_data
И запускаем контейнер:
docker run -d \
--name my-postgres \
-e POSTGRES_USER=myuser \
-e POSTGRES_PASSWORD=mypassword \
-e POSTGRES_DB=mydb \
-p 5432:5432 \
-v postgres_data:/var/lib/postgresql/data \
postgres:15
Обратите внимание на используемые переменные. С их помощью настраиваются основные параметры PostgreSQL.
Пример подключения к базе данных с помощью psql:
docker exec -it my-postgres psql -U myuser -d mydb
- Для выхода из консоли psql выполните
\q.
Пример выгрузки базы данных в дамп и восстановление базы из дампа:
# создаём дамп
docker exec -i my-postgres pg_dump -U myuser -d mydb | gzip > "./backup_mydb.dump.gz"
# удаляем базу
docker exec -it my-postgres psql -U myuser -d postgres -c "DROP DATABASE IF EXISTS mydb;"
# создаём новую базу
docker exec -it my-postgres psql -U myuser -d postgres -c "CREATE DATABASE mydb;"
# загружаем в базу дамп
gunzip -c ./backup_mydb.dump.gz | docker exec -i my-postgres psql -U myuser -d mydb
Redis
Здесь точно также, вначале создаём раздел:
docker volume create redis_data
Затем запускаем контейнер:
docker run -d \
--name my-redis \
-p 6379:6379 \
-v redis_data:/data \
redis:8
Пример подключения к redis с помощью redis-cli:
docker exec -it my-redis redis-cli
Чтобы выйти из консоли redis выполните команду exit.
Пример создания бекапа данных и восстановление из бекапа:
# принудительно сохраняем данные на диск внутри контейнера
docker exec my-redis redis-cli BGSAVE
# копируем файл снапшота на хост
docker cp my-redis:/data/dump.rdb ./redis_backup.rdb
# для восстановления контейнер нужно остановить
docker stop my-redis
# копируем файл обратно в контейнер (перезаписываем)
docker cp ./redis_backup.rdb my-redis:/data/dump.rdb
# запускаем контейнер
docker start my-redis
MySQL
Создаём раздел для хранения данных:
docker volume create mysql_data
Запускаем контейнер:
docker run -d \
--name my-mysql \
-e MYSQL_ROOT_PASSWORD=rootpassword \
-e MYSQL_DATABASE=mydb \
-e MYSQL_USER=myuser \
-e MYSQL_PASSWORD=mypassword \
-p 3306:3306 \
-v mysql_data:/var/lib/mysql \
mysql:8.0
- С помощью указанных переменных настраиваются основные параметры MySQL.
Примеры подключения к MySQL:
docker exec -it my-mysql mysql -u root -p # пароль: rootpassword
docker exec -it my-mysql mysql -u myuser -p mydb # пароль: mypassword
Чтобы выйти из консоли mysql выполните команду exit.
Пример выгрузки базы данных в дамп и восстановление базы из дампа:
# создаём дамп
docker exec -i my-mysql mysqldump -u root -prootpassword mydb 2>/dev/null | gzip > ./backup_mydb.dump.gz
# удаляем базу
docker exec -it my-mysql mysql -u root -prootpassword -e "DROP DATABASE mydb";
# создаём новую базу
docker exec -it my-mysql mysql -u root -prootpassword -e "CREATE DATABASE mydb";
# загружаем в базу дамп
gunzip -c ./backup_mydb.dump.gz | docker exec -i my-mysql mysql -u root -prootpassword mydb
Итог
Посмотрим статистику потребления ресурсов созданными только что контейнерами. Делается это с помощью команды docker stats.
docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
30a3aac1a1d8 my-mysql 0.45% 380.3MiB / 3.823GiB 9.72% 796B / 126B 5.49MB / 274MB 38
1dc482d5d978 my-redis 0.19% 10.09MiB / 3.823GiB 0.26% 1.06kB / 126B 0B / 4.1kB 6
c41277d66035 my-postgres 0.00% 32.29MiB / 3.823GiB 0.82% 1.26kB / 126B 0B / 53.7MB 6
21718419aa0a my-apache 0.00% 37.88MiB / 3.823GiB 0.97% 4.65kB / 2.65kB 0B / 45.1kB 109
e9ebd0cb3dbb my-nginx 0.00% 4.766MiB / 3.823GiB 0.12% 6.18kB / 3kB 0B / 12.3kB 5
- Apache2 запустил аж 109 потоков, потому что в его одном процессе запускается сразу много потоков.
- А MySQL съел больше всех памяти — 380MiB.
После проделанной работы можем удалить всё что мы только что понаделали:
# остановим контейнеры
docker stop my-nginx my-apache my-postgres my-redis my-mysql
# удалим контейнеры
docker rm my-nginx my-apache my-postgres my-redis my-mysql
# удалим созданные разделы
docker volume rm postgres_data redis_data mysql_data
Если понравилась статья, подпишись на мой канал в VK или Telegram .