Чтобы упаковать рабочее приложение в контейнер 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 в отдельном контейнере, а не объединение его с базой данных в одном контейнере.