Перейти к содержанию

Задачки по 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

events {
}
http {
    server {
        listen 8080;
    location / {
        root /var/www/html;
            index index.html;
        }
    }
}

Задача 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: