Быстрый старт: Установка Django + Postgresql c помощью Docker Compose
В этом кратком руководстве показано, как использовать Docker Compose для настройки и запуска простого приложения. Перед запуском , установите Docker Compose.
Определите компоненты проекта
Для этого проекта вам необходимо создать Dockerfile, файл зависимостей Python и файл docker-compose.yml
. (Вы можете использовать расширение .yml
или .yaml
для этого файла.)
-
Создайте пустой каталог проекта.
Вы можете назвать каталог как-нибудь легко запомнить. Этот каталог является контекстом для вашего образа приложения. Каталог должен содержать только ресурсы для создания этого образа.
-
Создайте новый файл с именем
Dockerfile
в каталоге вашего проекта.Dockerfile определяет содержимое образа приложения с помощью одной или нескольких команд сборки, которые настраивают этот образ. После сборки вы можете запустить образ в контейнере. Дополнительные сведения Dockerfileсм. в руководстве пользователя Docker и справочнике по файлу Docker.
-
Добавьте следующее содержимое в файл
Dockerfile
.
FROM python:3
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
Этот Dockerfile
начинается с родительского образа Python 3 . Родительский образ изменяется путем добавления нового codeкаталога. Родительский образ дополнительно модифицируется путем установки требований Python, определенных в файле requirements.txt
.
-
Сохраните и закройте
Dockerfile
. -
Создайте файл
requirements.txt
в каталоге вашего проекта.Этот файл запускается командой
RUN pip install -r requirements.txt
в вашемDockerfile
. -
Добавьте необходимое пакеты в файл.
Django==4.2.3 psycopg2>=2.8
-
Сохраните и закройте файл
requirements.txt
. -
Создайте файл с именем
docker-compose.yml
в каталоге вашего проекта.Файл
docker-compose.yml
описывает сервисы, которые делают ваше приложение. В этом примере этими службами являются веб-сервер и база данных. Файл компоновки также описывает, какие образы Docker используют эти сервисы, как они связываются друг с другом, какие тома им может потребоваться смонтировать внутри контейнеров. Наконец,docker-compose.yml
файл описывает, какие порты предоставляют эти службы. Смотрите ссылкуdocker-compose.yml
для получения дополнительной информации о том, как работает этот файл. -
Добавьте следующую конфигурацию в файл
docker-compose.yml
.
services:
db:
image: postgres:14
container_name: db
restart: always
volumes:
- pgdata:/var/lib/postgresql/data
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
ports:
- "5432:5432"
networks:
- djangonetwork
webdjango:
build: .
container_name: django
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
environment:
- POSTGRES_NAME=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
depends_on:
- db
links:
- db:db
networks:
- djangonetwork
networks:
djangonetwork:
driver: bridge
volumes:
pgdata:
Этот файл определяет две службы: db
и webdjango
.
Примечание:
Это использует встроенный сервер разработки для запуска вашего приложения на порту 8000. Не используйте это в производственной среде. Для получения дополнительной информации см. Django документацию.
- Сохраните и закройте файл
docker-compose.yml
.
Создайте проект Django
На этом шаге вы создаете начальный проект Django, собирая образ из контекста сборки, определенного в предыдущей процедуре.
-
Перейдите в корень каталога вашего проекта.
-
Создайте проект Django, запустив команду docker compose run следующим образом.
sudo docker compose run web django-admin startproject myproject .
Это указывает Compose на запуск django-admin startproject myproject
в контейнере с использованием webdjango
образа и конфигурации службы. Поскольку webdjango
образ еще не существует, Compose создает его из текущего каталога, как указано в строке build: .
в файле docker-compose.yml
.
После webdjango
создания образа службы Compose запускает его и выполняет django-admin startproject
команду в контейнере. Эта команда указывает Django создать набор файлов и каталогов, представляющих проект Django.
- После завершения команды
docker compose
перечислите содержимое вашего проекта.
ls -l
drwxr-xr-x 2 root root myproject
-rw-rw-r-- 1 user user docker-compose.yml
-rw-rw-r-- 1 user user Dockerfile
-rwxr-xr-x 1 root root manage.py
-rw-rw-r-- 1 user user requirements.txt
Если вы используете Docker в Linux, django-admin
созданные файлы принадлежат пользователю root
. Это происходит потому, что контейнер работает от имени пользователя root
. Измените владельца новых файлов.
sudo chown -R $USER:$USER myproject manage.py
Если вы используете Docker на Mac или Windows, вы уже должны владеть всеми файлами, в том числе сгенерированными django-admin
. Перечислите файлы, чтобы убедиться в этом.
ls -l
total 32
-rw-r--r-- 1 user staff 145 Feb 13 23:00 Dockerfile
drwxr-xr-x 6 user staff 204 Feb 13 23:07 myproject
-rw-r--r-- 1 user staff 159 Feb 13 23:02 docker-compose.yml
-rwxr-xr-x 1 user staff 257 Feb 13 23:07 manage.py
-rw-r--r-- 1 user staff 16 Feb 13 23:01 requirements.txt
Подключить базу данных
В этом разделе вы настроите подключение к базе данных для Django.
-
В каталоге вашего проекта отредактируйте файл
myproject/settings.py
. -
Замените
DATABASES = ...
на следующее:
# settings.py
import os
[...]
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': os.environ.get('POSTGRES_NAME'),
'USER': os.environ.get('POSTGRES_USER'),
'PASSWORD': os.environ.get('POSTGRES_PASSWORD'),
'HOST': 'db',
'PORT': 5432,
}
}
Эти параметры определяются образом postgres Docker, указанным в файле docker-compose.yml
.
-
Сохраните и закройте файл.
-
Запустите команду docker compose up из каталога верхнего уровня для вашего проекта.
docker compose up
djangosample_db_1 is up-to-date
Creating djangosample_web_1 ...
Creating djangosample_web_1 ... done
Attaching to djangosample_db_1, djangosample_web_1
db_1 | The files belonging to this database system will be owned by user "postgres".
db_1 | This user must also own the server process.
db_1 |
db_1 | The database cluster will be initialized with locale "en_US.utf8".
db_1 | The default database encoding has accordingly been set to "UTF8".
db_1 | The default text search configuration will be set to "english".
<...>
webdjango_1 | July 30, 2020 - 18:35:38
webdjango_1 | Django version 3.0.8, using settings 'myproject.settings'
webdjango_1 | Starting development server at http://0.0.0.0:8000/
webdjango_1 | Quit the server with CONTROL-C.
На этом этапе ваше приложение Django должно работать на порту 8000
вашего хоста Docker. В Docker Desktop для Mac и Docker Desktop для Windows перейдите http://localhost:8000
в веб-браузере, чтобы увидеть страницу приветствия Django.
Примечание:
На некоторых платформах (Windows 10) вам может потребоваться отредактировать
ALLOWED_HOSTS
содержимоеsettings.py
и добавить в список имя хоста Docker или IP-адрес. В демонстрационных целях вы можете установить значение:ALLOWED_HOSTS = ['*']
Это значение небезопасно для производственного использования. Обратитесь к документации Django для получения дополнительной информации.
- Список запущенных контейнеров.
В другом окне терминала перечислите запущенные процессы Docker с помощью команды docker ps
или docker container ls
.
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
def85eff5f51 django_webdjango "python3 manage.py..." 10 minutes ago Up 9 minutes 0.0.0.0:8000->8000/tcp django_webdjango_1
678ce61c79cc postgres "docker-entrypoint..." 20 minutes ago Up 9 minutes 5432/tcp django_db_1
-
Отключите службы и выполните очистку одним из следующих способов:
- Stop the application by typing Остановите приложение, набрав
Ctrl-C
в той же оболочке, где вы его запустили:
Gracefully stopping... (press Ctrl+C again to force) Killing django_webdjango_1 ... done Killing django_db_1 ... done
- Или, для более элегантного завершения работы, переключитесь на другую оболочку и запустите docker compose down из верхнего уровня каталога вашего примера проекта Django.
docker compose down
Stopping django_web_1 ... done Stopping django_db_1 ... done Removing django_web_1 ... done Removing django_web_run_1 ... done Removing django_db_1 ... done Removing network django_default
- Stop the application by typing Остановите приложение, набрав
После закрытия приложения вы можете безопасно удалить каталог проекта Django (например, rm -rf django
).