Django docker-compose example 1 ¶
See also
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