🕒 4 мин.
В этой статье я на практике покажу запуск простых сервисов в Docker контейнерах. Будем поднимать следующие сервисы: Nginx, Apache2, Postgres, Redis, MySQL. Я уже написал довольно много статей по 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
apache/conf/httpd.conf— основной конфиг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.