Основи роботи з Linux. / Початок роботи з Doker. / Django и PostgreSQL с Doker.
Джаного та база даних з Docker.
Створюємо новий проект.
Файл залежностей requirements.txt
Django
psycopg2
Встановлення ВО та залежностей.
Старт проекту та сервера.
В даному випадку ми не застосовували міграцію і базу даних не було створено.
Тепер завдання полягає в тому, щоб не використовувати папку venv, а встановити залежності всередині образу Docker.
При цьому зробивши так, щоб усі файли проекту залишалися в локальній області для розробки та не переносились усередину контейнера.
Таким чином, все що служить для запуску проекту (оточення) буде ізольовано всередині контейнера.
Створимо файл Dockerfile.
FROM python:3.6 AS django
ENV PYTHONUNBUFFERED 1
RUN mkdir /app
WORKDIR /app
RUN apt update
RUN apt -y install libpq-dev
COPY requirements.txt /app
RUN pip install -r requirements.txt
ENV PYTHONUNBUFFERED 1 - наказує python виводити все в термінал
Запускаємо складання образу
docket build.
і спостерігаємо процес
Бачимо, що просить оновити інсталятор pip.
Додамо команду поновлення як просить.
...
COPY requirements.txt /app
RUN /usr/local/bin/python -m pip install --upgrade pip
RUN pip install -r requirements.txt
Тепер наше завдання запустити образ у контейнері.
Найпростіше це злити через docker-compose up.
Для цього потрібний файл конфігурації docker-compose.yaml.
version: '3.5'
services:
django:
build: .
restart: always
ports:
- 8000:8080
Запускаємо команду складання та запуску контейнера.
docker-compose up
Тепер нам потрібно запустити кілька команд всередині контейнера, щоб підняти веб-сервер з джанго проектом.
Також нам необхідно зробити посилання всередині контейнера на наш каталог із проектом зовні.
version: '3.5'
services:
django:
build: .
restart: always
ports:
- 8000:8000
working_dir: /app
command: python manage.py runserver 0.0.0.0:8000
volumes:
- ./blog:/app
Додамо контейнер із PostgreSQL.
db:
restart: always
image: postgres:latest
ports:
- "5432:5432"
volumes:
- ./pg_data:/var/lib/postgresql/data/
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=1q2w3e
- POSTGRES_DB=blog
Тепер додамо файл налаштувань оточення для проекту .env.dev
DEBUG=1
SECRET_KEY=foo
DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1 [::1]
SQL_ENGINE=django.db.backends.postgresql
SQL_DATABASE=blog
SQL_USER=postgres
SQL_PASSWORD=1q2w3e
SQL_HOST=db
SQL_PORT=5432
Увімкнемо його в контейнер.
version: '3.5'
services:
django:
...
env_file:
- ./.env.dev
І пропишемо коннект у settings.py
DATABASES = {
"default": {
"ENGINE": os.environ.get("SQL_ENGINE", "django.db.backends.sqlite3"),
"NAME": os.environ.get("SQL_DATABASE", os.path.join(BASE_DIR, "db.sqlite3")),
"USER": os.environ.get("SQL_USER", "user"),
"PASSWORD": os.environ.get("SQL_PASSWORD", "password"),
"HOST": os.environ.get("SQL_HOST", "localhost"),
"PORT": os.environ.get("SQL_PORT", "5432"),
}
}
Перезбираємо контейнери.
docker-compose up --build
Проводимо міграцію.
docker-compose exec django python manage.py migrate --noinput
Точка входу для образу
Використовується для запуску скрипта під час кожного запуску образу.
Наприклад, якщо ми хочемо застосовувати міграцію щоразу, коли запускаємо образ створимо файл entrypoint.sh.
#!/bin/sh
if [ "$DATABASE" = "postgres" ]
then
echo "Waiting for postgres..."
while ! nc -z $SQL_HOST $SQL_PORT; do
sleep 0.1
done
echo "PostgreSQL started"
fi
python manage.py flush --no-input
python manage.py migrate
exec "$@"
І хобуємо його в образ.
FROM python:3.6 AS python36
...
RUN mkdir /entry
COPY entrypoint.sh /entry
ENTRYPOINT ["/entry/entrypoint.sh"]
Якщо потрібно використовувати різні Dockerfile для контейнерів.
services:
service1:
build:
context: .
args:
- NODE_ENV=local
dockerfile: Dockerfile_X
ports:
- "8765:8765"
Корисні команди
Видалення контейнерів.
docker-compose down -v
Перегляд списку запущених контейнерів
docker ps
Видалити контейнер
docker-compose rm db