Django docker-compose example 1

docker_compose/examples/example_1:
total 48
4 drwxrwxr-x 3  4096 mai   15 13:28 .
4 drwxrwxr-x 3  4096 mai   15 11:42 ..
4 -rw-r--r-- 1   480 mai   15 12:49 docker-compose_base.yml
4 -rw-r--r-- 1   741 mai   15 12:49 docker-compose_dev.yml
4 -rw-r--r-- 1   501 mai    7 10:45 docker-compose_production.yml
4 drwxrwxr-x 2  4096 mai   15 13:28 docker_django
4 -rw-r--r-- 1   113 mai   15 12:49 .env_db_dev
4 -rw-r--r-- 1   113 mai   15 12:49 .env_db_production
4 -rw-r--r-- 1   244 mai   15 13:14 .env_django_dev
4 -rw-r--r-- 1   244 mai   15 13:16 .env_django_production
4 -rw-rw-r-- 1  1867 mai   15 13:12 example_1.rst
4 -rw-r--r-- 1  3703 mai   15 13:05 Makefile

docker_compose/examples/example_1/docker_django:
total 16
4 drwxrwxr-x 2  4096 mai   15 13:28 .
4 drwxrwxr-x 3  4096 mai   15 13:28 ..
4 -rw-rw-r-- 1  3075 mai   15 13:20 Dockerfile
4 -rw-rw-r-- 1  2065 mai   15 13:18 Dockerfile_dev

Makefile

  1# Minimal makefile
  2#
  3
  4# You can set these variables from the command line.
  5THIS_MAKEFILE := $(lastword $(MAKEFILE_LIST))
  6
  7# Put it first so that "make" without argument is like "make help".
  8help:
  9	@echo " "
 10	@echo "Targets:"
 11	@echo " "
 12	@echo "=========================="
 13	@echo "- make check_all"
 14	@echo "- make build_docker_staging"
 15	@echo "=========================="
 16	@echo "- make build_dev"
 17	@echo "- make up_dev"
 18	@echo "- make up_db_dev"
 19	@echo "- make exec_db_dev"
 20	@echo "- make exec_django_dev"
 21	@echo "- make log_dev"
 22	@echo "- make ps_dev"
 23	@echo "- make top_dev"
 24	@echo "- make down_dev"
 25	@echo "- make env_db_dev"
 26	@echo "- make env_django_dev"
 27	@echo "  ------------------------"
 28	@echo "- make test_dev"
 29	@echo "=========================="
 30	@echo "- make build_prod "
 31	@echo "- make up_prod "
 32	@echo "- make up_db_prod "
 33	@echo "- make exec_db_prod "
 34	@echo "- make exec_django_prod "
 35	@echo "- make log_prod "
 36	@echo "- make ps_prod "
 37	@echo "- make top_prod "
 38	@echo "- make down_prod "
 39	@echo "- make env_db_prod "
 40	@echo "- make env_django_prod "
 41	@echo "  ------------------------"
 42	@echo "- make test_prod "
 43	@echo "=========================="
 44	@echo " "
 45
 46
 47build_docker_staging:
 48	cd docker-django; docker build -f Dockerfile --tag docker.id3.eu/informatique/update_id3_staging:master .
 49
 50######################################## DEV ###########################
 51build_dev:
 52	docker-compose -f docker-compose_base.yml  -f docker-compose_dev.yml build
 53
 54up_db_dev:
 55	docker-compose -f docker-compose_base.yml -f docker-compose_dev.yml up db
 56
 57up_dev:
 58	@$(MAKE) -f $(THIS_MAKEFILE) down_prod
 59	docker-compose -f docker-compose_base.yml -f docker-compose_dev.yml up
 60
 61exec_db_dev:
 62	docker-compose -f docker-compose_base.yml  -f docker-compose_dev.yml exec db bash
 63
 64exec_django_dev:
 65	docker-compose -f docker-compose_base.yml  -f docker-compose_dev.yml exec django bash
 66
 67down_dev:
 68	docker-compose -f docker-compose_base.yml  -f docker-compose_dev.yml down
 69
 70env_django_dev:
 71	docker-compose -f docker-compose_base.yml  -f docker-compose_dev.yml exec django env
 72
 73env_db_dev:
 74	docker-compose -f docker-compose_base.yml  -f docker-compose_dev.yml exec db env
 75
 76log_dev:
 77	docker-compose -f docker-compose_base.yml -f docker-compose_dev.yml logs
 78
 79ps_dev:
 80	docker-compose -f docker-compose_base.yml -f docker-compose_dev.yml ps
 81
 82top_dev:
 83	docker-compose -f docker-compose_base.yml -f docker-compose_dev.yml top
 84
 85######################################## PROD ##########################
 86
 87build_prod:
 88	docker-compose -f docker-compose_base.yml  -f docker-compose_production.yml build
 89
 90up_prod:
 91	@$(MAKE) -f $(THIS_MAKEFILE) down_dev
 92	docker-compose -f docker-compose_base.yml -f docker-compose_production.yml up -d
 93
 94down_prod:
 95	docker-compose -f docker-compose_base.yml  -f docker-compose_production.yml down
 96
 97up_db_prod:
 98	docker-compose -f docker-compose_base.yml -f docker-compose_production.yml up db
 99
100exec_db_prod:
101	docker-compose -f docker-compose_base.yml  -f docker-compose_production.yml exec db bash
102
103exec_django_prod:
104	docker-compose -f docker-compose_base.yml  -f docker-compose_production.yml exec django bash
105
106env_django_prod:
107	docker-compose -f docker-compose_base.yml  -f docker-compose_production.yml exec django env
108
109env_db_prod:
110	docker-compose -f docker-compose_base.yml  -f docker-compose_production.yml exec db env
111
112log_prod:
113	docker-compose -f docker-compose_base.yml -f docker-compose_production.yml logs
114
115ps_prod:
116	docker-compose -f docker-compose_base.yml -f docker-compose_production.yml ps
117
118top_prod:
119	docker-compose -f docker-compose_base.yml -f docker-compose_production.yml top
120
121########################################################################
122
123.PHONY: help Makefile

docker-compose_base.yml

 1# docker-compose.yml
 2#
 3version: "3.5"
 4services:
 5  db:
 6    build:
 7      context: docker-db
 8      dockerfile: Dockerfile
 9    container_name: container_<db_name>
10    env_file:
11      - ".env_db_dev"
12    image: update_id3.mariadb:10.4.0
13    ports:
14      # # sudo netstat -ntlp
15      - 3306:3306
16    volumes:
17      - volume_db:/var/lib/mysql
18      -  /opt/db_update_id3:/opt/docker-db
19
20  django:
21    depends_on:
22      - db
23    env_file:
24      - ".env_django_dev"
25
26volumes:
27  volume_db:

Development

.env_db_dev

1MYSQL_ROOT_PASSWORD=<db_password>
2MYSQL_USER=<db_username>
3MYSQL_PASSWORD=<db_password>
4MYSQL_DATABASE=<db_name>

.env_django_dev

1SHELL=/bin/bash
2SECRET_KEY=<django_secret_key>
3DATABASE_URL=mysql://root:<db_password>@db:3306/<db_name>
4FILE_LOG=/opt/update_id3/logs/update_id3.log
5PYTHONUNBUFFERED=1
6PYTHONDONTWRITEBYTECODE=1
7DJANGO_LOG_LEVEL=INFO
8ALLOWED_HOST=update.id3.eu

docker_django/Dockerfile_dev

 1# dockerfile_dev
 2# Development environment (LDAP, MariaDB, no apache server)
 3#
 4# 2 stages:
 5#
 6# - first stage
 7#       building the python virtualenv with ldap support
 8#       (we need gcc and libldap2-dev libsasl2-dev libssl-dev)
 9# - second stage
10#       - copying the python virtualenv environment under /opt/update_id3/docker
11#       - install the ldap libraries
12#       - copying the django project under /opt/update_id3/update_id3
13#
14##### Start stage 1 : building the Python virtual environment ##########
15# https://hub.docker.com/_/python
16FROM python:3.7.3-slim-stretch as builder
17
18# gcc because we need regex and pyldap
19# libldap2-dev because we need pyldap
20RUN apt-get update \
21    && apt-get install -y gcc libldap2-dev libsasl2-dev libssl-dev default-libmysqlclient-dev
22
23# we need the bash shell for the 'source' binary
24SHELL ["/bin/bash", "-c"]
25WORKDIR /opt/update_id3/docker/
26COPY ./update_id3/requirements_dev.txt .
27RUN python -m venv .venv && \
28    source .venv/bin/activate && \
29    pip install -U pip wheel && \
30    pip install -r requirements_dev.txt
31
32#### Start stage 2 #########################################
33#
34#  volumes:
35#     - ./docker-django/update_id3/:/opt/update_id3/update_id3 # permet d'accéder au code du host
36FROM python:3.7.3-slim-stretch as deployer
37
38# ajout d'informations à l'image pour pouvoir l'identifier plus facilement
39LABEL maintainer "patrick.vergain@id3.eu"
40LABEL description "Application update.id3.eu 3.0.0 (NOT RELEASED)"
41
42# Set environment variables
43ENV PYTHONDONTWRITEBYTECODE 1
44ENV PYTHONUNBUFFERED 1
45
46WORKDIR /opt/update_id3/docker/
47COPY --from=builder /opt/update_id3/docker/.venv ./.venv
48
49# we only need  the ldap and mariadb libraries
50# https://packages.debian.org/fr/jessie/libldap-2.4-2
51RUN apt-get update \
52    && apt-get install -y tree libldap-2.4-2 default-libmysqlclient-dev \
53    && apt-get clean
54
55
56# copying the django project
57COPY ./update_id3 /opt/update_id3/update_id3
58WORKDIR /opt/update_id3/update_id3
59
60    RUN mkdir -p /opt/update_id3/logs \
61        && touch /opt/update_id3/logs/update_id3.log

docker-compose_dev.yml

 1# docker-compose_dev.yml
 2#
 3version: "3.5"
 4
 5services:
 6  db:
 7    container_name: container_<db_name>_dev
 8
 9  django:
10    build:
11      context: docker-django
12      dockerfile: Dockerfile_dev
13    container_name: container_django_update_id3_dev
14    command: bash -c "/opt/update_id3/docker/.venv/bin/python manage_dev.py migrate; /opt/update_id3/docker/.venv/bin/python manage_dev.py runserver 0.0.0.0:8005"
15    # command: bash -c "sleep 100000" # for debugging
16    environment:
17      - DJANGO_SETTINGS_MODULE=config.settings.development
18    env_file:
19      - ".env_django_dev"
20    ports:
21      # sudo netstat -ntlp
22      - "8005:8005"
23    volumes:
24      - ./docker-django/update_id3:/opt/update_id3/update_id3 # permet d'accéder au code du host

Production

.env_db_production

1MYSQL_ROOT_PASSWORD=<db_password>
2MYSQL_USER=<db_username>
3MYSQL_PASSWORD=<db_password>
4MYSQL_DATABASE=<db_name>

.env_django_production

1SHELL=/bin/bash
2SECRET_KEY=<django_secret_key>
3DATABASE_URL=mysql://root:<db_password>@db:3306/<db_name>
4FILE_LOG=/opt/update_id3/logs/update_id3.log
5DJANGO_LOG_LEVEL=INFO
6PYTHONUNBUFFERED=1
7PYTHONDONTWRITEBYTECODE=1
8ALLOWED_HOST=update.id3.eu

docker_django/Dockerfile

 1# update_id3/docker-django/Dockerfile
 2# Production environment (LDAP, wsgi, mariadb)
 3#
 4# 2 stages:
 5#
 6# - first stage
 7#       building the Python virtual environment with **ldap** and mariadb
 8#       and **mod_wsgi** support
 9#       we need:
10#          - gcc
11#          - libldap2-dev libsasl2-dev libssl-dev
12#          - apache2-dev apache2-utils
13#          - default-libmysqlclient-dev
14# - second stage
15#       - copying the Python virtualenv environment under /opt/update_id3/update_id3/.venv
16#       - install the ldap libraries
17#       - copying the django project under /opt/update_id3/update_id3
18#
19##### Start stage 1 : building the Python virtual environment ##########
20# https://hub.docker.com/_/python
21FROM python:3.7.3-slim-stretch as builder
22
23# gcc because we need regex, pyldap and mod_wsgi
24# libldap2-dev because we need pyldap
25# pour la production
26RUN apt-get update \
27    && apt-get install -y gcc libldap2-dev libsasl2-dev libssl-dev default-libmysqlclient-dev \
28    && apt-get install -y apache2-dev
29
30# we need the bash shell for the 'source' binary
31SHELL ["/bin/bash", "-c"]
32WORKDIR /opt/docker/
33COPY ./update_id3/requirements.txt .
34RUN python -m venv .venv && \
35    source .venv/bin/activate && \
36    pip install -U pip wheel && \
37    pip install -r requirements.txt && \
38    pip install mod_wsgi wsgi-basic-auth
39
40#### Start stage 2 #########################################
41#
42#  volumes:
43#     - ./docker-django/update_id3/:/opt/update_id3/update_id3 # permet d'accéder au code du host
44FROM python:3.7.3-slim-stretch as deployer
45
46# ajout d'informations à l'image pour pouvoir l'identifier plus facilement
47LABEL maintainer "patrick.vergain@id3.eu"
48
49WORKDIR /opt/update_id3/update_id3
50# installing the python virtual environment
51# mod_wsgi-py37.cpython-37m-x86_64-linux-gnu.so must be here:/opt/update_id3/update_id3/.venv/lib/python3.7/site-packages/mod_wsgi/server/mod_wsgi-py37.cpython-37m-x86_64-linux-gnu.so
52# see COPY ./update_id3.conf /etc/apache2/sites-available/000-default.conf
53COPY --from=builder /opt/docker/.venv ./.venv
54
55# wee need the http apache2 server and the ldap libraries
56RUN apt-get update \
57    && apt-get install -y tree apache2 apache2-utils libldap-2.4-2 default-libmysqlclient-dev \
58    && apt-get clean
59
60# =================================================
61COPY ./update_id3 /opt/update_id3/update_id3
62
63WORKDIR /opt/update_id3/update_id3
64RUN mkdir -p /opt/update_id3/static
65# hack: creating /opt/update_id3/logs/update_id3.log
66RUN mkdir -p /opt/update_id3/logs && \
67    touch /opt/update_id3/logs/update_id3.log && \
68    .venv/bin/python manage_prod.py collectstatic && \
69    rm /opt/update_id3/logs/update_id3.log
70
71### http apache2 server installation ###################################
72EXPOSE 80
73COPY ./update_id3.conf /etc/apache2/sites-available/000-default.conf
74## Launching the HTTP server
75CMD ["apache2ctl", "-D", "FOREGROUND"]
76# Pour le debug : voir l'existence de /opt/update_id3/update_id3/.venv/lib/python3.7/site-packages/mod_wsgi/server/mod_wsgi-py37.cpython-37m-x86_64-linux-gnu.so
77# CMD ["sleep", "10000000000"]

docker-compose_production.yml

 1# docker-compose_base.yml
 2# docker-compose_production.yml
 3#
 4version: "3.5"
 5
 6services:
 7
 8  django:
 9    build:
10      context: docker-django
11      dockerfile: Dockerfile
12    container_name: django_update_id3_prod
13    env_file:
14      - ".env_django_production"
15    image: docker.id3.eu/informatique/update_id3:latest
16    ports:
17      # sudo netstat -ntlp
18      - 8005:80
19    restart:
20        always
21    volumes:
22      - /opt/docker/update_id3/logs:/opt/update_id3/logs  # permet d'accéder au code du host