DanLevy.net

Настройка Docker‑сервера

Запуск серверов баз данных одной командой

Hero image for Настройка Docker‑сервера

Docker Server Setup

Историческое замечание: это ссылка на локальную разработку 2015 года. Она полезна для понимания старого рабочего процесса, но не рассматривайте эти фрагменты как актуальные рекомендации для продакшена. Современные файлы Docker Compose, пользовательские сети, зафиксированные версии образов, аутентификация, секреты и проверенная автоматизация обновлений сегодня являются более надёжными настройками.

Для кого это руководство?

Никогда больше не позволяйте этим причинам стоять у вас на пути!

Быстрые ссылки на однострочники

Эта статья содержит однострочные команды для запуска самых популярных СУБД, включая:

PostgreSQL icon Postgres

MongoDB icon MongoDB

MySQL icon MySQL

Elastic icon ElasticSearch

Примечание: Эти команды предназначены только как быстрые локальные‑разработческие ярлыки. Если планируете использовать их в продакшене, сначала добавьте аутентификацию, управление секретами, резервные копии, сетевые политики, фиксированные образы и план обновлений.

Продвинутые пользователи Docker: Если вы знакомы с docker-compose, можете преобразовать приведённые ниже shell‑команды для использования в файлах docker-compose.yml.

Postgres Server

Запустите контейнер, назвав его pg-localhost

Terminal window
# Хранить файлы БД в локальном пути, вне контейнера
mkdir -p $HOME/.postgres-data
docker run \
--name pg-localhost \
-p 127.0.0.1:5432:5432 \
-e POSTGRES_PASSWORD=password \
--restart unless-stopped \
-it \
--shm-size=256mb \
postgres:16-alpine \
postgres -c 'listen_addresses=*' \
-c 'password_encryption=scram-sha-256' \
-c 'shared_memory_type=sysv' \
-c 'shared_buffers=256MB' \
-c 'max_connections=200'

При необходимости подгоняйте параметры командной строки. (Аргументы демона postgres идут после имени образа postgres:16-alpine. См. postgres -c 'listen_addresses=*'...)

Подключитесь к подсказке psql от имени пользователя postgres

Terminal window
docker exec --user postgres -it pg-localhost psql

Откройте оболочку контейнера от root

Terminal window
docker exec -it pg-localhost bash

Примечание: В приведённой команде используются официальные базовые образы Alpine Linux. Это не типичная среда Debian.

Чтобы использовать базовый образ debian/ubuntu, замените postgres:12-alpine на postgres:12.

MongoDB Server

Terminal window
mkdir -p $HOME/.mongodb/data
docker run -d \
--name mongodb \
--restart on-failure:5 \
-p 127.0.0.1:27017:27017 \
-v $HOME/.mongodb:/data \
mongo:7 \
bash -c 'mongod --bind_ip 0.0.0.0'

Теперь, когда сервер запущен, проверьте, что данные находятся в $HOME/.mongodb, выполнив:

Terminal window
ls -lach $HOME/.mongodb

Подключимся к серверу с помощью CLI‑утилиты mongosh. (Если она у вас не установлена, смотрите ниже.)

Terminal window
#> Используем параметры по умолчанию:
mongosh

Вы должны увидеть нечто подобное:

Предпросмотр вывода mongo shell

Установка инструментов Mongo CLI

Через brew на macOS
Terminal window
brew tap mongodb/brew
brew install mongodb-community-shell

MySQL‑сервер

ПРЕДУПРЕЖДЕНИЕ: ИЗМЕНИТЕ ПАРОЛЬ В ПЕРЕМЕННОЙ MYSQL_ROOT_PASSWORD, указанной ниже.

Terminal window
mkdir -p $HOME/.mysql
docker run -d \
-v $HOME/.mysql:/var/lib/mysql \
-p 127.0.0.1:3306:3306 \
--name mysql-$USER \
-e MYSQL_DATABASE=$USER \
-e MYSQL_ROOT_HOST='172.*.*.*' \
-e MYSQL_ROOT_PASSWORD='p@ssw0rd' \
mysql/mysql-server:8

ElasticSearch‑сервер

Terminal window
mkdir -p $HOME/.elastic
docker run -d \
--name elastic \
-p 127.0.0.1:9200:9200 \
-p 127.0.0.1:9300:9300 \
-v $HOME/.elastic:/data \
docker.elastic.co/elasticsearch/elasticsearch:8.15.5 bash -c 'elasticsearch --cluster.name elastic_cluster --node.name elastic01 --path.data /data/elastic-data --path.logs /data/elastic-logs '
Примечания по безопасности

ЗАМЕЧАНИЕ: параметр -p 127.0.0.1:27017:27017 ограничивает доступ к вашему экземпляру только локальной сетью Docker‑демона.
Чтобы «опубликовать» порты, уберите префикс локального IP‑адреса, позволяя внешнее подключение: -p 27017:27017. Убедитесь, что приняты необходимые меры безопасности.

Рекомендация: регулярно сканируйте открытые порты (например, с помощью nmap или masscan), чтобы подтвердить корректность сетевой конфигурации с отдельного узла в другой сети.

Теперь, когда у вас есть команды для запуска серверов баз данных, следующий шаг — упаковать приложение в Docker‑образ. Часть 2 продолжается ниже:

Упаковка NodeJS‑веб‑приложения

  1. Добавьте пустой файл с именем Dockerfile в корень проекта.
  2. (Опционально, рекомендуется) Добавьте файл .dockerignore, используя правила из .gitignore, чтобы исключить крупные необязательные пути. По умолчанию включаются все файлы проекта.

Создайте Dockerfile в корне приложения

# Пример для NodeJS
FROM node:22
EXPOSE 3000
COPY . /app/
WORKDIR /app
RUN apt-get update && apt-get dist-upgrade -yqq
RUN ["npm", "install"]
# Переопределяемая команда
CMD ["npm", "start"]

Проще продемонстрировать, как запускать сборку через Dockerfile и увидеть результат в консоли (см. команды ниже).

В терминале перейдите в папку проекта (cd) и выполните следующую команду build каждый раз при развертывании изменений — или когда нужно сменить/обновить ОС или конфигурацию окружения.

Terminal window
docker build -t app-name-here .

Справочник основных команд Docker

Сборка Docker‑образа

Terminal window
docker build -t app-name-here .

Создание/запуск веб‑приложения со ссылками на серверы БД

Terminal window
docker network create app-local
docker network connect app-local mongodb
docker network connect app-local elastic
docker run -d --name webapp01 --network app-local -p 3000:3000 app-name-here

Запуск в интерактивном режиме (не в фоне, в терминале)

Terminal window
docker run -it --name webapp01 --network app-local -p 3000:3000 app-name-here bash

Удаление контейнера или образа

Важно: любые данные, не сохранённые в смонтированном томе, будут потеряны!!

Terminal window
# Удалить образ
docker rmi -f app-name-here
docker rm -f webapp01
# теперь повторно выполните ваш `docker run...` из ^^^
# Например, чтобы остановить и удалить запущенные выше экземпляры БД, выполните:
docker rm -f mongo elastic