Запуск простых сервисов в Docker контейнерах

🕒 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.

Мы используем cookie-файлы для наилучшего представления нашего сайта. Продолжая использовать этот сайт, вы соглашаетесь с использованием cookie-файлов.
Принять
Отказаться
Политика конфиденциальности