Πώς να κάνετε Dockerize μια εφαρμογή Django σε Linux


Σε αυτό το σεμινάριο, θα σας δείξω πώς να διαμορφώσετε ένα περιβάλλον Docker για το έργο Django σας ενώ βρίσκεται ακόμη στη φάση ανάπτυξης. Παρόλο που χρησιμοποιώ το Ubuntu 18.04, τα βήματα παραμένουν τα ίδια για οποιαδήποτε διανομή Linux χρησιμοποιείτε, με εξαίρεση την εγκατάσταση του Docker και του docker-compose.

Σε κάθε τυπικό έργο ανάπτυξης λογισμικού, συνήθως έχουμε μια διαδικασία ανάπτυξης που ξεκινά συνήθως από την αρχή του προγραμματιστή μέχρι το VCS και στην παραγωγή. Θα προσπαθήσουμε να τηρήσουμε τους κανόνες ώστε να κατανοήσετε πού εντάσσεται κάθε εργαλείο DevOps.

Το DevOps αφορά κυρίως την εξάλειψη της φράσης του παρελθόντος: «Αλλά λειτουργεί στον υπολογιστή μου!». Η κοντεϊνεροποίηση με Docker δημιουργεί το περιβάλλον παραγωγής για την εφαρμογή σας ώστε να μπορεί να αναπτυχθεί οπουδήποτε, Αναπτύξτε μία φορά, αναπτύξτε οπουδήποτε!

1) Εγκαταστήστε το Docker Engine

Χρειάζεστε μια εγκατεστημένη μηχανή εκτέλεσης Docker στον διακομιστή/υπολογιστή σας. Οι οδηγοί εγκατάστασης του Docker θα πρέπει να σας φανούν πολύ χρήσιμοι.

Πώς να εγκαταστήσετε το Docker σε CentOS/Debian/Ubuntu

2) Ρύθμιση Περιβάλλοντος

Έχω δημιουργήσει ένα αποθετήριο στο GitHub για αυτό το έργο που ονομάζεται django-docker-dev-app. Μπορείτε να το κάνετε fork ή να το κλωνοποιήσετε/κατεβάσετε ελεύθερα.

Πρώτα, δημιούργησε τον φάκελο για να περιέχει το πρότζεκτ σου. Ο φάκελος εργασίας μου ονομάζεται django-docker-dev-app. Μπες στον φάκελο και άνοιξέ τον στο IDE σου.

Αρχείο Docker

Σε ένα περιβάλλον με κοντέινερ, όλες οι εφαρμογές ζουν μέσα σε ένα κοντέινερ. Τα ίδια τα κοντέινερ αποτελούνται από διάφορες εικόνες. Μπορείτε να δημιουργήσετε τη δική σας εικόνα ή να χρησιμοποιήσετε άλλες εικόνες από το Docker Hub. Ένα Dockerfile είναι ένα κείμενο του Docker που το Docker διαβάζει για να δημιουργήσει/χτίσει αυτόματα μια εικόνα. Το Dockerfile μας θα περιλαμβάνει όλες τις εξαρτήσεις που απαιτούνται από το έργο μας.

Δημιουργήστε ένα αρχείο με όνομα Dockerfile.

nano Dockerfile

Στο αρχείο πληκτρολογήστε τα εξής:

#base image
FROM python:3.9-alpine

#maintainer
LABEL Author="CodeGenes"

# The enviroment variable ensures that the python output is set straight
# to the terminal with out buffering it first
ENV PYTHONBUFFERED 1

#copy requirements file to image 
COPY ./requirements.txt /requirements.txt

#let pip install required packages
RUN pip install -r requirements.txt

#directory to store app source code
RUN mkdir /app

#switch to /app directory so that everything runs from here
WORKDIR /app

#copy the app code to image working directory
COPY ./app /app

#create user to run the app(it is not recommended to use root)
#we create user called user with -D -> meaning no need for home directory
RUN adduser -D user

#switch from root to user to run our app
USER user

Δημιουργήστε το αρχείο requirements.txt και προσθέστε τις απαιτήσεις του έργου σας.

Django
djangorestframework

Δημιουργήστε το φάκελο app που θα περιέχει τον πηγαίο κώδικα. Τώρα είμαστε έτοιμοι να δημιουργήσουμε την εικόνα μας!

mkdir app

Ανοίξτε ένα τερματικό στο έργο σας και πληκτρολογήστε την ακόλουθη εντολή για να δημιουργήσετε την εικόνα μας:

 docker build .

Στο τέλος λέει στο Docker να ελέγξει για το Dockerfile στον ίδιο κατάλογο. Αν είχατε το αρχείο σε διαφορετική τοποθεσία, θα είχαμε γράψει τη διαδρομή προς αυτό το αρχείο. Στη συνέχεια, το Docker θα καλέσει τις απαραίτητες εικόνες από το Docker Hub για να δημιουργήσει την εικόνα σας.

Χρησιμοποιώντας το Docker Compose

Από τα έγγραφα του Docker: Το Compose είναι ένα εργαλείο για τον ορισμό και την εκτέλεση εφαρμογών Docker με πολλαπλά κοντέινερ. Με το Compose, χρησιμοποιείτε ένα αρχείο YAML για να διαμορφώσετε τις υπηρεσίες της εφαρμογής σας. Στη συνέχεια, με μια μόνο εντολή, δημιουργείτε και ξεκινάτε όλες τις υπηρεσίες από τη διαμόρφωσή σας.

  • Εγκατάσταση Docker Compose σε Linux

Επειδή το πρότζεκτ μας θα απαιτεί πολλές υπηρεσίες στο μέλλον, είναι καλύτερο να δημιουργήσουμε ένα περιβάλλον πολλαπλών κοντέινερ γι' αυτό. Για παράδειγμα, μπορεί να χρειαστούμε ένα κοντέινερ για να φιλοξενήσει το frontend μας, άλλο για να φιλοξενήσει μια βάση δεδομένων και άλλο για να φιλοξενήσει το backend όταν μεταβούμε σε αρχιτεκτονική μικροϋπηρεσιών. Θα δημιουργήσουμε ένα αρχείο docker-compose που θα ορίζει τις διάφορες υπηρεσίες και τα κοντέινερ που θα απαιτεί το πρότζεκτ μας.

Δημιουργήστε ένα αρχείο με όνομα docker-compose.yml

version: "3"
services:
  ddda:
    build:
      context: .
    ports:
      - "8000:8000"
    volumes:
      - ./app:/app
    command: >
      sh -c "python manage.py runserver 0.0.0.0:8000"

Σημειώστε τη μορφή αρχείου YAML!!! Έχουμε μία υπηρεσία που ονομάζεται ddda (Django Docker Dev App).

Τώρα είμαστε έτοιμοι να κατασκευάσουμε την υπηρεσία μας:

docker-compose build

Μετά από μια επιτυχημένη δημιουργία βλέπετε: Successfully tagged djangodockerdevapp_ddda:latest

Σημαίνει ότι η εικόνα μας ονομάζεται djangodockerdevapp_ddda:latest και η υπηρεσία μας ονομάζεται ddda

Τώρα σημειώστε ότι δεν έχουμε δημιουργήσει ακόμα το έργο μας Django! Αν ακολουθήσατε με επιτυχία την παραπάνω διαδικασία, τότε συγχαρητήρια, έχετε ρυθμίσει το περιβάλλον Docker για το έργο σας! Στη συνέχεια, ξεκινήστε την ανάπτυξή σας κάνοντας τα εξής:

Δημιουργήστε το έργο Django:

 docker-compose run ddda sh -c “django-admin.py startproject app .”

Για να εκτελέσετε το κοντέινερ σας:

docker-compose up

Στη συνέχεια επισκεφθείτε το http://localhost:8000/

Δημιουργία μεταναστεύσεων

$ docker-compose exec ddda python manage.py migrate

Από τώρα και στο εξής θα εκτελείτε εντολές Django όπως η παραπάνω εντολή, προσθέτοντας την εντολή σας μετά το όνομα της υπηρεσίας ddda.

Αυτό είναι προς το παρόν. Ξέρω ότι είναι απλό και υπάρχουν πολλά χαρακτηριστικά που δεν έχουμε καλύψει, όπως μια βάση δεδομένων, αλλά αυτό είναι μια αρχή!

Το έργο είναι διαθέσιμο στο GitHub εδώ.

Περισσότερα για το Docker:

  • Εξαγωγή και Εισαγωγή Εικόνων/Κοντέινερ Docker
  • Εγκατάσταση του Harbor Docker Image Registry σε CentOS/Debian/Ubuntu
  • Πώς να τρέξετε τοπικά clusters Kubernetes στο Docker