Задачки по Docker
Задача 1. Запустить в докере рабочий веб-сервер nginx
1) Создать образ mynginx, который будет запускать nginx внутри контейнера
2) Получить ответ вашего nginx из контейнера по адресу http://localhost:8080
3) Использовать базовые легковесные образы – alpine
4) Добавить возможность конфигурирования nginx через внешний файл
5) Статические страницы (сайты) должны быть внешним томом volume
6) Контейнер должен запускаться от непривилегированного пользователя
7) Создать файл docker-compose для старта и сборки
Решение
Пример решения
Структура проекта:
Dockerfile
FROM alpine:3.24
RUN apk add --no-cache nginx && addgroup -S www && adduser -S -D -G www www
RUN mkdir -p /run/nginx /var/log/nginx /var/lib/nginx/tmp && chown -R www:www /run/nginx /var/log/nginx /var/lib/nginx
COPY nginx.conf /etc/nginx/nginx.conf
USER www
CMD ["nginx", "-g", "daemon off;"]
docker-compose.yml
version: '3'
services:
nginx:
build: .
image: mynginx
ports:
- 8080:8080
volumes:
- site-data:/var/www/html
volumes:
site-data:
nginx.conf
Задача 2. Собрать из исходного когда и запустить в Docker рабочее приложение
1) Написать Dockerfile для приложения Django
2) Использовать базовые легковесные образы - alpine
3) Изучить скрипт init.sh, придумать, как запускать миграции баз данных и создание суперпользователя после старта контейнера с приложением
4) Получить ответ из контейнера по адресу http://localhost:8000
5) При перезапуске контейнера, скрипт будет выдавать ошибку, что суперпользователь уже есть. Доработать скрипт таким образом, чтобы суперпользователь создавался только на новой базе данных.
6) Файл с базой данных sqlite должен быть внешним томом volume
7) Реализовать конфигурацию суперпользователя через переменные окружения
8) Контейнер должен запускаться от непривилегированного пользователя
9)Создать файл docker-compose для старта и сборки
10) Вынести выполнение автоматических миграций в отдельный сервис docker-compose
Решение
Пример решения
Структура проекта:
Dockerfile
FROM python:3.9-alpine
WORKDIR /app
RUN addgroup andrey && adduser -D -G andrey andrey && chown -R andrey:andrey /app
USER andrey
COPY --chown=andrey requirements.txt .
RUN pip install -r requirements.txt
COPY --chown=andrey . .
RUN mkdir db && chmod +x init.sh
CMD ["./init.sh"]
Скрипт init.sh
#! /bin/sh
user=$DJANGO_SUPERUSER_USERNAME
email=$DJANGO_SUPERUSER_EMAIL
password=$DJANGO_SUPERUSER_PASSWORD
file=db/db.sqlite3
if [ ! -f "$file" ] ; then
python3 manage.py migrate
echo "from django.contrib.auth.models import User; User.objects.create_superuser('$user', '$email', '$password')" | python3 manage.py shell || true
fi
docker-compose.yml
services:
web:
build: .
ports:
- "8000:8000"
command: python manage.py runserver 0.0.0.0:8000
volumes:
- django_lab:/app/db
depends_on:
migrate:
condition: service_completed_successfully
migrate:
build: .
environment:
- DJANGO_SUPERUSER_USERNAME=andrey
- DJANGO_SUPERUSER_EMAIL=waie.99@mail.ru
- DJANGO_SUPERUSER_PASSWORD=br8Vebak
volumes:
- django_lab:/app/db
command: ./init.sh
volumes:
django_lab:
Задача 3. Собрать из исходного когда и запустить в Docker рабочее приложение + использовать СУБД PostgreSQL
1) Написать Dockerfile для приложения Django
2) Использовать базовые легковесные образы - alpine
3) Изучить скрипт init.sh, придумать, как запускать миграции баз данных и создание суперпользователя после старта контейнера с приложением
4) Получить ответ из контейнера по адресу http://localhost:8000
5) При перезапуске контейнера, скрипт будет выдавать ошибку, что суперпользователь уже есть. Доработать скрипт таким образом, чтобы суперпользователь создавался только на новой базе данных.
6) Файл с базой данных sqlite должен быть внешним томом volume
7) Реализовать конфигурацию суперпользователя через переменные окружения
8) Контейнер должен запускаться от непривилегированного пользователя
9) Создать файл docker-compose для старта и сборки
10) Добавить в docker-compose.yml сервис PostgreSQL
11) Данные PostgreSQL должны быть внешним томом volume
12) Указать в docker-compose.yml настройки переменных окружения для БД и приложения
13) Вынести выполнение автоматических миграций и создание суперпользователя в отдельный сервис docker-compose. Реализовать конфигурацию суперпользователя через переменные окружения
14) Получить ответ из контейнера по адресу http://localhost:8000
15) Контейнер должен запускаться от непривилегированного пользователя
Решение
Пример решения
Структура проекта:
Dockerfile
FROM python:3.9-alpine
WORKDIR /app
RUN addgroup andrey && adduser -D -G andrey andrey && chown -R andrey:andrey /app
USER andrey
COPY --chown=andrey requirements.txt .
RUN pip install -r requirements.txt
COPY --chown=andrey . .
RUN mkdir db && chmod +x init.sh
CMD ["./init.sh"]
Скрипт init.sh
#! /bin/sh
# User credentials
user=$DJANGO_SUPERUSER_USERNAME
email=$DJANGO_SUPERUSER_EMAIL
password=$DJANGO_SUPERUSER_PASSWORD
echo "from django.contrib.auth.models import User; User.objects.create_superuser('$user', '$email', '$password')" | python3 manage.py shell || true
python3 manage.py runserver 0.0.0.0:8000
docker-compose.yml
services:
db:
image: 192.168.0.107:5000/postgres:17
environment:
- POSTGRES_DB=myproject
- POSTGRES_USER=myprojectuser
- POSTGRES_PASSWORD=password
- TZ=UTC
- PGTZ=UTC
volumes:
- pg17_data:/var/lib/postgresql/data
ports:
- "5432:5432"
web:
build: .
ports:
- "8000:8000"
environment:
- DJANGO_SUPERUSER_USERNAME=andrey
- DJANGO_SUPERUSER_EMAIL=waie.99@mail.ru
- DJANGO_SUPERUSER_PASSWORD=br8Vebak
depends_on:
migrate:
condition: service_completed_successfully
migrate:
build: .
command: python3 manage.py migrate
depends_on:
db:
condition: service_started
volumes:
pg17_data: