Как упаковать рабочее приложение в контейнер Docker?

Как я могу создать контейнер для Ubuntu, в котором будут настроены и работают SFTP и PostgreSQL, чтобы развернуть их на другом сервере или на разных серверах?
  • 1 февраля 2024 г. 10:48
Ответы на вопрос 2
Чтобы упаковать рабочее приложение в контейнер Docker, необходимо создать `Dockerfile` – текстовый файл с инструкциями для сборки образа Docker, а затем собрать образ и запустить его в виде контейнера. Ниже приведены шаги, которые нужно выполнить для создания простого `Dockerfile`, сборки образа и запуска контейнера.

1. **Создайте Dockerfile**:
```
# Используйте базовый образ Ubuntu
FROM ubuntu:latest

# Установите необходимые пакеты
RUN apt-get update && apt-get install -y \
    postgresql postgresql-contrib \
    openssh-server

# Настроить PostgreSQL
# Пример настройки пользователя и базы данных
USER postgres
RUN /etc/init.d/postgresql start &&\
    psql --command "CREATE USER myuser WITH SUPERUSER PASSWORD 'mypassword';" &&\
    createdb -O myuser mydb

# Настройка SFTP
# Здесь вы настроите пользователя SFTP, домашнюю директорию и соответствующие разрешения

# Обратите внимание: По умолчанию в Docker не рекомендуется запускать SSH,
# так как лучше использовать "docker exec", но если вам нужен именно SFTP,
# то будет необходимо убедиться, что SSH-сервис запускается при старте контейнера
USER root
RUN mkdir /var/run/sshd
RUN echo 'root:somesecurepassword' | chpasswd
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

# Порты, которые будем использовать
# 22 для SSH/SFTP, 5432 для PostgreSQL
EXPOSE 22 5432

# Очистить APT
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

# Запуск SSH и PostgreSQL при старте контейнера
CMD service ssh restart && service postgresql restart && tail -f /dev/null
```

2. **Соберите образ Docker**:
   В директории с `Dockerfile`, выполните команду:
   ```bash
   docker build -t myapp .
   ```
   Здесь `myapp` – это имя, которое вы хотите дать вашему образу, точка в конце указывает на текущую директорию, содержащую `Dockerfile`.

3. **Запустите контейнер**:
   ```bash
   docker run -d --name myapp_container -p 2222:22 -p 5432:5432 myapp
   ```
   Опция `-d` запускает контейнер в фоновом режиме, `--name` дает имя вашему контейнеру, `-p` пробрасывает порты из контейнера на хост.

Чтобы развернуть приложение на другом сервере, вам нужно будет либо скопировать собранный образ через `docker save` и `docker load`, либо использовать Docker Registry, куда можно загрузить образ командой `docker push`, а затем скачать его на другом сервере командой `docker pull`.

Имейте в виду, что использование SSH в контейнере Docker является нестандартной практикой. Обычно для управления файлами внутри контейнера используют механизм томов (volumes) и проброса файлов через `docker cp`. Если вам все-таки нужен доступ по SFTP, возможно стоит рассмотреть использование выделенного сервиса SFTP в отдельном контейнере, а не объединение его с базой данных в одном контейнере.
postgresql - уже есть готовые официальные образы. Просто выбрать нужную версию и сделать на ее основе свой образ, добавив свои конфиги либо просто примонтировать конфиги и том с данными. 
sftp - можно также поискать нужные образы, либо сделать свой на базе alpine, либо того же ubuntu если хочется меньше возиться...
Похожие вопросы