Django je napredni open-source Python web-okvir koji vam može pomoći da brzo izgradite svoju Python aplikaciju. Potiče brzi razvoj i čist, pragmatičan dizajn prateći arhitektonski obrazac model–predložak–pogled. Izvan kutije, okvir dolazi s potrebnim modernim komponentama aplikacije kao što su autentifikacija korisnika, okvir za predmemoriranje, objektno-relacijski maper, URL dispečer, sustav predložaka, i prilagodljivo administrativno sučelje.
Gunicorn ‘Green Unicorn’ je Python WSGI HTTP poslužitelj za UNIX sustave. Gunicorn poslužitelj je kompatibilan s raznim web-okvirima, nudi izvrsne performanse i lagan je za resurse poslužitelja. Docker je open-source platforma za kontejnere koja postoji već neko vrijeme, čineći razvoj aplikacija brzim, učinkovitim i predvidljivim.
U ovom vodiču ćete steći vještine u razvoju i implementaciji skalabilnih kontejneriziranih Django web-aplikacija. Koristit ćemo Django Polls aplikaciju stvorenu prateći uvodne vodiče za početak rada s Djangom. U vrijeme pisanja ovog vodiča, bazirali smo ga na Django 3.2 podržanom od strane Python 3.6 ili novijem. Implementirat ćemo aplikaciju kao kontejner s Dockerom i posluživati je pomoću Gunicorn poslužitelja. Naravno, prije implementacije Django aplikacije u kontejner, morat ćete napraviti neke izmjene u kodu projekta kako biste riješili stvari poput zapisivanja u standardne izlazne tokove i rada s varijablama okruženja. Statičke datoteke kao što su CSS i JavaScript slike mogu se prebaciti na usluge pohrane objekata kako bi se omogućilo jednostavno upravljanje datotekama s jedne lokacije u višekontejnerskom okruženju.
Pokazat ćemo vam kako implementirati ove izmjene na temelju dobro opisane twelve-factor metodologije za izgradnju skalabilnih web-aplikacija. Nakon što dovršite izmjene, izgradit ćete Docker sliku aplikacije i implementirati kontejneriziranu aplikaciju pomoću Dockera. Preporučujemo da pratite korake navedene u vodiču kako biste u potpunosti razumjeli vodič.
Preduvjeti
Budući da je ovo praktični vodič, preporučujemo da imate postavu u nastavku kako biste lakše pratili:
-
Ubuntu 20.04 poslužitelj. Možete pratiti korake od 1 do 4 ovog korak-po-korak vodiča koji će vam pomoći postaviti vaš Ubuntu poslužitelj na CloudSigma.
-
Obavezno dodajte korisnika sa sudo privilegijama na oba čvora koja ćemo koristiti za pokretanje naredbi kako je opisano u gornjem vodiču.
-
Instalirajte Docker na poslužitelj. Možete pratiti korake 1, 2 i 3 našeg vodiča o instaliranju i upravljanju Dockerom. Ne zaboravite dodati gore stvorenog sudo korisnika u Docker grupu.
-
Kompatibilan prostor za pohranu objekata. Django podržava nekoliko usluga pohrane kako je navedeno u dokumentaciji za django-storages. Možete odabrati onu koju preferirate i pratiti dokumentaciju kako biste je postavili. Za ovaj vodič koristit ćemo MinIO koji je usluga pohrane u oblaku kompatibilna s S3.
-
Instanca SQL baze podataka. Django podržava nekoliko SQL baza podataka koje možete slobodno odabrati. Za ovaj vodič koristit ćemo PostgreSQL. PostgreSQL baza podataka neće biti implementirana unutar kontejnera. Postavit ćemo zaseban Ubuntu poslužitelj za hostiranje PostgreSQL instance kako bismo osigurali postizanje naše višekontejnerske postave kao i postojanost podataka. Možete stvoriti još jednu Ubuntu 20.04 instancu i pratiti ovaj vodič za Postavljanje instance PostgreSQL baze podataka na Ubuntu. Ne zaboravite dodati ulogu u PostgreSQL bazi podataka za svog sudo korisnika kao što je objašnjeno u koracima 2 i 3. Ova uloga će vam omogućiti povezivanje s bazom podataka s drugih poslužitelja koji hostiraju vaše kontejnere.
Prema ovim preduvjetima, trebali biste imati dvije instance Ubuntu poslužitelja. Jedna instanca će pokretati vaš Docker kontejner, a druga instanca će pokretati PostgreSQL instancu. Počnimo!
Korak 1: Konfiguriranje instance PostgreSQL baze podataka
U ovom odjeljku modificirat ćemo konfiguracije Postgresa na Ubuntu poslužitelju na kojem se izvodi instanca Postgresa. To će omogućiti veze s vanjske IP adrese. Nakon što se poveže, možemo stvoriti bazu podataka i korisničku ulogu, specifičnu za aplikaciju Django Polls koju implementiramo.
Prvo, ako ste postavili svoje okruženje prema Preduvjeti, trebali biste imati ulogu u svojoj PostgreSQL bazi podataka za svog sudo korisnika. Zatim moramo postaviti lozinku za ovu ulogu. Dok ste na poslužitelju na kojem se izvodi PostgreSQL, prijavite se u Postgres terminal sa sljedećom naredbom:
|
1 |
sudo -u postgres psql |
Nakon što ste u Postgres terminalu, izdajte naredbu \password za izmjenu lozinke korisnika. Sintaksa za \passwordnaredbu je \password <username>. Za naš slučaj, naredba:
|
1 |
\password cloudsigma |
Unesite lozinku i potvrdite je. Spremite ovu lozinku na sigurno mjesto jer ćete je kasnije koristiti za autentifikaciju s drugog Ubuntu poslužitelja. Nakon toga upišite exit i pritisnite Enter za izlazak iz Postgres terminala.
Ako ste omogućili vatrozid (ufw) na instanci PostgreSQL poslužitelja, morat ćete dopustiti promet na zadani Postgres priključak 5432. Možete ograničiti promet tako da dolazi samo s određene IP adrese vašeg drugog Ubuntu poslužitelja koji će pokretati Docker spremnik. Izvršite sljedeću naredbu za dodavanje ufw pravila, zamjenjujući svoju IP adresu tamo gdje je istaknuto:
|
1 |
sudo ufw allow from ubuntu_server_ip_address to any port 5432 |
To će osigurati da se samo vaš poslužitelj može povezati s PostgreSQL instancom. Iako to dopušta promet kroz vatrozid, također morate modificirati konfiguracijske datoteke PostgreSQL-a kako biste omogućili povezivanje s udaljene IP adrese. Prema zadanim postavkama, konfiguracija dopušta samo povezivanje s lokalnog računala (localhost). Konfiguracijske datoteke za PostgreSQL nalaze se u direktoriju /etc/postgresql/12/main . 12, u ovom slučaju, je verzija PostgreSQL-a koju smo instalirali za ovaj vodič. Možda ste instalirali drugu verziju. Stoga je možete promijeniti u direktorij /etc/postgresql/ i izlistati sadržaj kako biste pronašli broj verzije PostgreSQL-a koji ste instalirali.
Koristite nano za izmjenu konfiguracijske datoteke:
|
1 |
sudo nano /etc/postgresql/12/main/postgresql.conf |
Pronađite ovaj redak u nastavku, odkomentirajte ga i postavite ga da dopušta veze sa svih IP adresa:
|
1 |
listen_addresses = '*' |
Spremite i zatvorite datoteku. Zatim morate urediti i datoteku pg_hba.conf , ona se nalazi u istom direktoriju kao i postgresql.conf. Datoteka pg_hba.conf omogućuje vam definiranje s kojih se računala možete povezati na PostgreSQL instancu, kao i metodu autentifikacije. Otvorite datoteku pomoću nano:
|
1 |
sudo nano /etc/postgresql/12/main/pg_hba.conf |
Molimo pročitajte komentare u ovoj datoteci kako biste razumjeli ključne riječi. Odjeljak koji tražimo je ovaj:

Naš fokus bit će na drugom retku, želite da izgleda kao redak ispod nakon što ga odkomentirate:
|
1 |
host all all your_ubuntu_server_ip/24 md5 |
Molimo zamijenite istaknuti dio s IP adresom vašeg Ubuntu poslužitelja kako biste mu omogućili povezivanje s PostgreSQL instancom. Spremite datoteku kada budete spremni. Ponovno pokrenite PostgreSQL bazu podataka kako bi promjene stupile na snagu:
|
1 |
sudo service postgresql restart |
Naš drugi Ubuntu poslužitelj s navedenom IP adresom trebao bi se moći povezati s Postgres instancom.
Korak 2: Povezivanje s instancom PostgreSQL poslužitelja i stvaranje baze podataka i korisnika
U ovom koraku pokušat ćemo osigurati da se Ubuntu instanca koja poslužuje naš Docker spremnik može povezati s drugim poslužiteljem na kojem se izvodi PostgreSQL instanca. Prijavite se u Ubuntu instancu koja ima Docker i instalirajte paket postgresql-client unutar Ubuntu glavnog računala (još ne unutar spremnika).
Uobičajeno, prvo ažurirajte apt paket, a zatim instalirajte paket sa sljedećim naredbama:
|
1 |
sudo apt update |
|
1 |
sudo apt install postgresql-client |
Paket instaliran iznad pomoći će vam u stvaranju baze podataka i korisnika za vašu aplikaciju. Zatim se moramo povezati s PostgreSQL instancom slanjem parametara povezivanja klijentu Postgresql.
Parametri povezivanja slijede ovu sintaksu:
|
1 |
psql -U username -h host -p port -d database --set=sslmode=require |
U ovoj naredbi, username je korisnik/uloga koju ste dodali u svoju PostgreSQL bazu podataka. host je IP adresa Ubuntu instance na kojoj se izvodi vaša PostgreSQL baza podataka. port je zadani port na kojem Postgres sluša dolazne veze, tj. 5432. Na mjestu database, koristit ćemo zadanu bazu podataka pod nazivom postgres koja dolazi s instalacijom PostgreSQL-a. Zamijenite svoje vrijednosti u istaknutim dijelovima na odgovarajući način i pritisnite Enter. Kada se to od vas zatraži, unesite lozinku koju ste postavili. Ovo vas prijavljuje u Postgres upit gdje možete upravljati bazom podataka.
Uspješno ste se povezali s PostgreSQL instancom. Sada možete stvoriti bazu podataka za aplikaciju Django polls. Nazovimo je django_polls:
|
1 |
CREATE DATABASE django_polls; |
Provjerite završava li vaša izjava točkom-zarezom kako biste izbjegli pogreške. Zatim se prebacite u django_polls bazu podataka pomoću naredbe:
|
1 |
\c django_polls; |
Zatim stvorite korisnika baze podataka specifičnog za ovaj projekt. Nazovimo korisnika django_user:
|
1 |
CREATE USER django_user WITH PASSWORD 'password'; |
Odaberite sigurnu lozinku za svog korisnika. Kada završite, moramo izmijeniti parametre povezivanja za korisnika kojeg smo upravo stvorili. To pomaže ubrzati operacije baze podataka osiguravajući da se ispravne vrijednosti ne traže i ne postavljaju svaki put kada se uspostavi veza.
Postavite zadano kodiranje koje Django očekuje kao UTF-8:
|
1 |
ALTER ROLE django_user SET client_encoding TO 'utf8'; |
Zatim postavite zadanu shemu izolacije transakcija na „ read committed”, što blokira čitanja iz neizvršenih transakcija:
|
1 |
ALTER ROLE django_user SET default_transaction_isolation TO 'read committed'; |
Postavite svoju vremensku zonu. Kako bi vodič bio univerzalan, koristit ćemo UTC:
|
1 |
ALTER ROLE django_user SET timezone TO 'UTC'; |
Na kraju, dodijelite administrativne privilegije baze podataka novom korisniku:
|
1 |
GRANT ALL PRIVILEGES ON DATABASE django_polls TO django_user; |
Izađite iz PostgreSQL upita kada budete spremni:
|
1 |
\q |
To je sve za ovaj korak. Nakon što ispravno konfigurirate svoju Django aplikaciju, ona bi trebala moći upravljati vašom bazom podataka.
Korak 3: Preuzimanje aplikacije iz Git repozitorija i definiranje ovisnosti
U ovom koraku klonirat ćemo Django-polls repozitorij aplikacije. Ovaj repozitorij sadrži kod za Djangov vodič za pisanje vaše prve Django aplikacije.
Prijavite se na Ubuntu poslužitelj na kojem se izvodi Docker, stvorite direktorij pod nazivom django_project i idite u njega:
|
1 2 |
mkdir django_project cd django_project |
Zatim klonirajte repozitorij u direktorij pomoću sljedeće naredbe:
|
1 |
git clone https://github.com/jaymoh/django-polls.git |
Idite u direktorij i izlistajte sadržaj:
|
1 |
cd django-polls |
Izlistajte sadržaj direktorija:
|
1 |
ls |

Obratite pažnju na sljedeće stavke:
-
manage.py: ova datoteka je ulaz u uslužni program naredbenog retka koji Django pruža za upravljanje vašom aplikacijom.
-
mysite: direktorij s opsegom Django projekta i postavkama koda.
-
polls: direktorij koji sadrži polls kod aplikacije.
-
templates: sadrži prilagođene datoteke predložaka za administratorske stranice.
Da biste saznali više o tome kako smo zapravo stvorili projekt, pogledajte Pisanje vaše prve Django aplikacije u službenoj dokumentaciji. Unutar django-polls direktoriju, želimo imati naše Python ovisnosti definirane u tekstualnoj datoteci. Nazvat ćemo je requirements.txt. Otvorite datoteku u svom omiljenom uređivaču teksta:
|
1 |
nano requirements.txt |
Zalijepite sljedeće retke unutar datoteke kako biste deklarirali ovisnosti:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Django==3.2.9 gunicorn==20.1.0 docutils==0.18.1 sqlparse==0.4.2 jmespath==0.10.0 psycopg2==2.9.2 python-dateutil==2.8.2 pytz==2021.3 six==1.16.0 urllib3==1.26.7 django-storages==1.12.2 minio==7.1.6 django-minio-backend==3.3.2 django-dotenv==1.4.2 boto3==1.21.38 |
U ovoj datoteci definirali smo Python ovisnosti s njihovim točnim verzijama koje bi trebale biti instalirane kada gradite aplikaciju. Neke od njih uključuju Django, django-storages za interakciju sa spremnicima za pohranu objekata, psycopg2 adapter za PostgreSQL, gunicorn WSGI poslužitelj i druge dodatne ovisnosti. Spremite i zatvorite datoteku kada završite.
Korak 4: Konfiguriranje varijabli okruženja za Django aplikaciju
Metodologija twelve-factor app preporučuje da izdvojite tvrdo kodirane konfiguracije iz koda vaše aplikacije. Čineći to, dobivate slobodu promjene ponašanja aplikacije u vremenu izvršavanja modificiranjem varijabli okruženja bez diranja koda. Docker radi s ovom postavom, pa ćemo modificirati datoteku postavki kako bi radila s varijablama okruženja. Kubernetes također radi s ovom konfiguracijskom postavom. Podijelit ćemo još jedan vodič o implementaciji s Kubernetesom na CloudSigma blogu.
Datoteka settings.py je glavna datoteka postavki za Django projekt. To je Python modul koji koristi nativne strukture podataka za konfiguraciju aplikacije. Za našu aplikaciju, datoteka se nalazi na lokaciji django-polls/mysite/settings.py. Većina njezinih vrijednosti je tvrdo kodirana. To će od vas zahtijevati da modificirate konfiguracijsku datoteku u kodu ako promijenite ponašanje aplikacije. Želimo to promijeniti. Srećom, Python nudi funkciju getenv u modulu os . Možemo je koristiti kako bismo konfigurirali Django da umjesto toga čita konfiguracijske parametre iz lokalnih varijabli okruženja.
Nastavimo modificiranjem datoteke django-polls/mysite/settings.py kako bismo zamijenili tvrdo kodirane vrijednosti varijabli. Možda ćemo ih htjeti ažurirati u vremenu izvršavanja pozivom na os.getenv. Ova funkcija čita vrijednost postavljenu u navedenom nazivu varijable okruženja. Opcionalno, možete navesti drugi parametar koji je zadana vrijednost koja će se koristiti ako varijabla okruženja nije postavljena.
Evo primjera:
|
1 |
SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') |
U gornjem retku govorimo Djangu da dohvati tajni ključ iz varijable okruženja. Ne pružamo zamjensku vrijednost jer ćemo ključ osigurati izvana. Ako ne postoji, aplikacija se ne bi trebala pokrenuti. Dok osiguravamo tajni ključ izvana, također želimo osigurati da sve naše kontejnerizirane kopije aplikacije koriste isti ključ na različitim poslužiteljima. Time se izbjegavaju potencijalni problemi koji nastaju kada različite kopije aplikacije koriste različite ključeve.
Evo još jednog primjera sa zadanom opcijom:
|
1 |
DEBUG = os.getenv('DEBUG', False) |
U ovom retku definiramo varijablu okruženja DEBUG koju treba pročitati. Međutim, ako nije postavljena, dali smo drugi parametar koji će biti proslijeđen varijabli postavki DEBUG. DEBUG je postavljena na False kako bismo osigurali da se osjetljive informacije ne prosljeđuju na frontend u slučaju problema s aplikacijom. Međutim, ako smo u razvojnom načinu rada, želimo da bude postavljena na True kako bi nam se omogućio prikaz informacija o pogrešci radi lakšeg ispravljanja pogrešaka.
Sada kada znate važnost varijabli okruženja, otvorite django_project/django-polls/settings.py u svom uređivaču. Prvo uvezite modul os dodavanjem ovog retka na vrh datoteke settings.py:
|
1 |
import os |
Zatim pronađite ove varijable i ažurirajte ih na sljedeći način:
|
1 2 3 |
SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') DEBUG = os.getenv('DEBUG', False) ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS', '127.0.0.1').split(',') |
U postavci ALLOWED_HOSTS, specificiramo da bi trebala dobiti vrijednost iz varijable okruženja DJANGO_ALLOWED_HOSTS i podijeliti je u Python listu koristeći zarez ( ,) kao separator. Ako varijabla nedostaje, ALLOWED_HOSTS se postavlja na 127.0.0.1.
Zatim se pomaknite kroz datoteku i pronađite odjeljak DATABASES, te ga konfigurirajte da također čita iz varijabli okruženja:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.{}'.format( os.getenv('DB_ENGINE', 'sqlite3') ), 'NAME': os.getenv('DB_DATABASE', 'django_polls'), 'USER': os.getenv('DB_USERNAME', 'your_db_username'), 'PASSWORD': os.getenv('DB_PASSWORD', 'your_secure_default_password'), 'HOST': os.getenv('DB_HOST', '127.0.0.1'), 'PORT': os.getenv('DB_PORT', 5432), 'OPTIONS': json.loads( os.getenv('DB_OPTIONS', '{}') ), } } |
Primijetite da smo dodali json.loads modul. Također biste trebali dodati uvoz modula na vrh settings.py datoteke:
|
1 |
import json |
Funkcija json.loads deserijalizira JSON objekt proslijeđen u DATABASES['default']['OPTIONS'] iz varijable okruženja DB_OPTIONS. Specificiranje ove opcije omogućuje nam prosljeđivanje proizvoljne strukture podataka za definiranje konfiguracije baze podataka. Pokretač baze podataka uključuje skup valjanih opcija koje se na njega primjenjuju. Opcija JSON daje nam fleksibilnost kodiranja JSON objekta s odgovarajućim parametrima za pokretač baze podataka koji u tom trenutku koristimo.
Postavka DATABASES['default']['NAME'] specificira naziv baze podataka u sustavu za upravljanje relacijskim bazama podataka koji smo postavili. U slučaju korištenja SQLite baze podataka, trebali biste navesti put do datoteke baze podataka.
Imajte na umu da Python nudi nekoliko metoda za čitanje vanjskih varijabli okruženja. Koristili smo samo jednu od njih. Slobodno istražite i koristite druge metode. U ovom koraku naučili ste kako raditi s vanjskim varijablama okruženja. To vam daje fleksibilnost za promjenu varijabli i izmjenu ponašanja aplikacije koja se izvodi u spremnicima. U sljedećem koraku naučit ćete kako raditi s uslugama pohrane objekata.
Korak 5: Rad s vanjskim uslugama pohrane objekata
Glavna prednost kontejnerizacije vaše aplikacije je u tome što je čini prenosivom za jednostavno postavljanje nekoliko kopija aplikacije kada se promet poveća. Time se otvara prostor za skaliranje. Međutim, to donosi problem održavanja verzija statičkih datoteka i resursa u različitim spremnicima. Zahvaljujući poboljšanjima u tehnologiji oblaka, ove zajedničke statičke elemente možete prebaciti na vanjsku pohranu. Zatim datoteke možete učiniti dostupnima putem mreže svim vašim pokrenutim spremnicima. Umjesto pokušaja sinkronizacije datoteka u različitim pokrenutim spremnicima, imate jedno središnje mjesto za upravljanje njima.
Koncept koji gore pokušavamo objasniti je korištenje usluga pohrane objekata u oblaku, ili Simple Storage Services (S3). Django ima paket pod nazivom django-storages koji vam omogućuje rad s udaljenim pozadinskim sustavima za pohranu. Django-storages radi s većinom usluga pohrane objekata kompatibilnih s S3, kao što su FTP, SFTP, Amazonov AWS S3, Google Cloud Storage, Dropbox i Azure Storage, između ostalih. U ovom vodiču koristit ćemo MinIO. Slobodno koristite bilo koje druge usluge pohrane objekata kompatibilne s S3. MinIO nudi visokoučinkovitu pohranu objekata kompatibilnu s S3. S MinIO-om možete izgraditi podatkovnu infrastrukturu kompatibilnu s S3 na bilo kojem oblaku.
Pokazat ćemo vam kako postaviti MinIO uslugu pohrane na platformi CloudSigma. Slijedite ove korake:
-
Započnite s izradom računa na platformi CloudSigma. Ako naiđete na bilo kakve probleme tijekom izrade MinIO pohrane, povežite se s CloudSigma’s besplatnom 24/7 podrškom putem chata uživo, i oni će vam pomoći.
-
Dodajte svoje podatke za naplatu.
-
Zatim zatražite svoj javno dostupni bucket odavde: https://blog.cloudsigma.com/xxxx. Morat ćete kontaktirati podršku putem chata uživo kako biste dobili vjerodajnice za pristup svom računu.
-
Nakon što se izradi vaše MinIO okruženje za pohranu objekata, dobit ćete vjerodajnice za pristup i druge upute za pristup. Vjerodajnice bi trebale uključivati vaš MINI_ACCESS_KEY, MINIO_SECRET_KEY, i MINIO_URL. Koristit ćete ove ključeve u uputama u nastavku.
Učinimo još neke promjene u datoteci mysite/settings.py koju smo mijenjali u prethodnom koraku. U datoteci dodajte aplikaciju storages na Django popis INSTALLED_APPS:

Aplikacija storages instalira se putem django-storages kao što je definirano u requirements.txt. Pomaknite se do dna datoteke i zamijenite varijablu STATIC_URL sljedećim isječkom koda:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# Statičke datoteke (CSS, JavaScript, slike) # https://docs.djangoproject.com/en/3.2/howto/static-files/ DEFAULT_FILE_STORAGE = os.getenv('STATIC_DEFAULT_FILE_STORAGE', 'storages.backends.s3boto3.S3Boto3Storage') AWS_S3_ENDPOINT_URL = os.getenv('MINIO_URL') AWS_ACCESS_KEY_ID = os.getenv('MINIO_ACCESS_KEY') AWS_SECRET_ACCESS_KEY = os.getenv('MINIO_SECRET_KEY') AWS_STORAGE_BUCKET_NAME = os.getenv('STATIC_MINIO_BUCKET_NAME') AWS_S3_OBJECT_PARAMETERS = { 'CacheControl': 'max-age=86400', } AWS_LOCATION = 'static' AWS_DEFAULT_ACL = 'public-read' STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage' STATIC_URL = '{}/{}/'.format(AWS_S3_ENDPOINT_URL, AWS_LOCATION) STATIC_ROOT = "static/" |
Imajte na umu da su neke od konfiguracijskih varijabli fiksno kodirane (hard-coded):
-
STATICFILES_STORAGE: definira pozadinski sustav za pohranu koji će Django koristiti za rukovanje statičkim datotekama. U našem vodiču koristimo MinIO pohranu, ali možete koristiti bilo koji pozadinski sustav kompatibilan s S3 kao što je objašnjeno u dokumentaciji za Django Storages.
-
AWS_S3_OBJECT_PARAMETERS: definira zaglavlja kontrole predmemorije (cache-control).
-
AWS_LOCATION: ovo koristimo za postavljanje direktorija unutar bucketa za pohranu gdje će se pohraniti sve statičke datoteke. Slobodno možete odabrati drugo ime.
-
AWS_DEFAULT_ACL: postavlja popis kontrole pristupa (ACL) za statičke datoteke. Postavljanje vrijednosti na ‘ public-Read’ učinit će datoteke dostupnima svim javnim korisnicima.
-
STATIC_URL: Django koristi osnovni URL postavljen u ovoj varijabli za generiranje URL-ova za statičke datoteke. Osnovni URL u ovom slučaju dobiva se kombiniranjem URL-a krajnje točke (endpoint URL) i poddirektorija statičkih datoteka.
-
STATIC_ROOT: definira gdje lokalno prikupiti statičke datoteke prije kopiranja u udaljenu pohranu objekata.
Također imamo neke izvana definirane varijable okruženja kako bismo održali fleksibilnost i prenosivost:
-
AWS_STORAGE_BUCKET_NAME: definira naziv spremnika za pohranu na koji će Django učitati resurse.
-
AWS_S3_ENDPOINT_URL: definira URL krajnje točke koji se koristi za pristup usluzi pohrane objekata. To će biti URL mapiran na poslužitelj koji je domaćin vaše MinIO usluge.
Spremite i zatvorite datoteku kada završite s uređivanjem.
Nakon što postavite te postavke i instalirate deklarirane Python ovisnosti, možete pokrenuti Django naredbu manage.py collectstatic bilo kada kako biste prikupili statičke datoteke svog projekta i učitali ih na udaljenu pozadinu za pohranu objekata:
|
1 |
python manage.py collectstatic |
Međutim, još nismo postavili env datoteku s konfiguracijama, pa će vjerojatno doći do pogreške.
Kada pokrenete naredbu, potrebno je nekoliko trenutaka da se vaši resursi kopiraju u MinIO Cloud Storage, ovisno o njihovoj veličini i brzini vaše internetske veze.
To je sve za ovaj korak. Pogledajmo kako možemo riješiti slanje Django zapisa u Docker Engine kako biste ih mogli pregledavati pomoću naredbe docker logs u sljedećem koraku.
Korak 6: Postavljanje zapisivanja u Django aplikaciji
U načinu rada za ispravljanje pogrešaka, kada je opcija DEBUG postavljena na True, Django zapisuje informacije u standardni izlaz i standardnu pogrešku. Informacije o zapisima obično se prikazuju na terminalu s kojeg ste pokrenuli razvojni HTTP poslužitelj.
U produkciji vjerojatno koristite drugi HTTP poslužitelj, a opcija DEBUG postavljena je na False. Django će u ovom slučaju koristiti drugačiju metodu zapisivanja. Django šalje zapise prioriteta ERROR ili CRITICAL na administrativni e-mail račun koji definirate. To izvrsno funkcionira u mnogim situacijama.
U kontejneriziranim i Kubernetes postavkama, preporučuje se zapisivanje u standardni izlaz i standardnu pogrešku. Poruke zapisa prikupljaju se u jednom direktoriju na datotečnom sustavu čvora i lako su dostupne pomoću naredbi kubectl and docker . S centraliziranom točkom zapisivanja na datotečnom sustavu čvora, operativni tim može lako pokrenuti procese na svakom čvoru za praćenje i prosljeđivanje zapisa. Stoga moramo konfigurirati našu aplikaciju da piše zapise u ovu standardnu postavku.
Bit će vam drago saznati da Django koristi vrlo prilagodljiv modul logging iz standardne Python knjižnice. To vam omogućuje da definirate rječnik koji prolazi kroz logging.config.dictConfig kako biste definirali željene izlaze i oblikovanje. Evo dobrog članka o Django Logging, The Right Way koji vam može pomoći da ovladate tehnikama zapisivanja u Djangu.
Otvorite datoteku django-polls/mysite/settings.py u svom uređivaču. Dodajte uvoz za Python knjižnicu logging.config na vrhu datoteke:
|
1 |
import logging.config |
Do sada, sa svim uvozima koje smo dodali, vaš odjeljak za uvoz u settings.py trebao bi izgledati ovako:

Knjižnica logging.config prima rječnik nove konfiguracije zapisivanja putem funkcije dictConfig kako bi nadjačala zadano ponašanje zapisivanja u Djangu.
Pomaknite se do dna datoteke i dodajte sljedeći isječak koda za konfiguraciju zapisivanja:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# Konfiguracija zapisivanja # Onemogući prethodnu konfiguraciju LOGGING_CONFIG = None # Dohvati razinu zapisa iz okruženja LOGLEVEL = os.getenv('DJANGO_LOGLEVEL', 'info').upper() logging.config.dictConfig({ 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'console': { 'format': '%(asctime)s %(levelname)s [%(name)s:%(lineno)s] %(module)s %(process)d %(thread)d %(message)s', }, }, 'handlers': { 'console': { 'class': 'logging.StreamHandler', 'formatter': 'console', }, }, 'loggers': { '': { 'level': LOGLEVEL, 'handlers': ['console',], }, }, }) |
LOGGING_CONFIG je postavljen na None kako bi se onemogućile/očistile zadane konfiguracije zapisivanja koje Django definira. LOGLEVEL je postavljen varijablom okruženja DJANGO_LOGLEVEL . Međutim, ako ona ne postoji, želimo da bude postavljena na ‘ info’.
Modul logging.config koji smo uvezli na vrhu pruža funkciju dictConfig koja se koristi za postavljanje novog rječnika konfiguracije. Rječnik definira formatiranje teksta pomoću ključa formatters. Izlaz se postavlja pomoću ključa handlers, a na kraju ključ loggers definira koja poruka treba ići kojem rukovatelju.
Nakon što definirate te postavke, Docker će izložiti zapise putem naredbe docker logs. Slično tome, u drugom vodiču koji ćemo raditi za Kubernetes, zapise možete pregledati naredbom kubectl logs. Pokrenimo sada proces kontejnerizacije u sljedećem koraku.
Korak 7: Definiranje Dockerfile-a aplikacije
U ovom koraku definiramo konfiguraciju za pokretanje slike kontejnera koja će pokretati Django aplikaciju koju poslužuje Gunicorn WSGI poslužitelj. Definirat ćemo runtime okruženje za izgradnju slike kontejnera, instalirati aplikaciju i njezine ovisnosti te izvršiti neke konačne konfiguracije.
-
Roditeljska slika za Django aplikaciju
Odluka o temeljnoj slici na kojoj ćete bazirati svoj kontejner prva je odluka koju ćete donijeti kada se bavite kontejneriziranim implementacijama. Naravno, imate mogućnost izgraditi svoje slike kontejnera od nule (SCRATCH), tj. praznog datotečnog sustava, ili ih bazirati na postojećoj slici kontejnera. Budući da ne želimo ponovno izmišljati kotač, našu ćemo sliku graditi od bazne slike. Postoji mnogo slika kontejnera otvorenog koda dostupnih u Dockerovom službenom repozitoriju slika kontejnera. Osim ako ne gradite svoju sliku od nule, preporučuje se korištenje slike sa službenog Docker huba. To je zato što Docker verificira slike kako bi slijedile najbolje prakse te osigurava redovita ažuriranja i sigurnosne zakrpe.
Budući da je Django Python radni okvir, iskoristit ćemo sliku sa standardnim Python okruženjem koje već ima instalirane alate i biblioteke koje trebamo. Na službenoj stranici za Python slike na Docker hubu, možete pronaći sliku temeljenu na Pythonu za različite verzije Pythona.
Iz naših različitih vodiča temeljenih na Dockeru, primijetit ćete da koristimo slike temeljene na Alpine Linuxu. Alpine Linux nudi robusno, ali lagano okruženje operativnog sustava za pokretanje kontejneriziranih aplikacija. Iako je njegov datotečni sustav malen, proširiv je i dolazi s potpunim sustavom za upravljanje paketima uz mogućnost dodavanja funkcionalnosti.
Prilikom odabira bazne slike na Docker hubu, možete primijetiti više dostupnih oznaka za svaku sliku. Za Python, imamo 3-alpine, što upućuje na najnoviju verziju slike Python 3 najnovije verzije Alpinea. To znači da u slučaju da vaš projekt radi sa starijom verzijom slike, može se pokvariti kada održavatelji Docker slike naprave ažuriranje. Kako biste izbjegli takve scenarije u budućnosti, uvijek se preporučuje odabrati najspecifičnije oznake za sliku koju želite koristiti.
U ovom vodiču koristit ćemo 3.8.12-alpine3.15 sliku kao baznu sliku za našu Django aplikaciju. Ova specifična oznaka bit će navedena u Dockerfile pomoću FROM instrukcije. Dockerfile će se nalaziti u glavnom direktoriju projekta: django_project.
Započnite navigacijom izvan Django-polls direktorija natrag u django_project direktorij:
|
1 |
cd .. |
Nakon što ste u direktoriju, upotrijebite svoj omiljeni uređivač kako biste otvorili datoteku pod nazivom Dockerfile :
|
1 |
nano Dockerfile |
Zatim zalijepite sljedeći redak kako biste postavili bazu svoje slike:
|
1 |
FROM python:3.8.12-alpine3.15 |
Ključna riječ FROM definira početnu točku prilagođene Docker slike. S time definiranim, možemo nastaviti dodavati instrukcije za postavljanje aplikacija. Ove instrukcije će instalirati potrebne ovisnosti, kopirati datoteke aplikacije i postaviti runtime okruženje.
Dodajte sljedeći isječak koda unutar Dockerfile-a:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
ADD django-polls/requirements.txt /app/requirements.txt RUN set -ex \ && apk add --no-cache --virtual .build-deps postgresql-dev build-base \ && python -m venv /env \ && /env/bin/pip install --upgrade pip \ && /env/bin/pip install --no-cache-dir -r /app/requirements.txt \ && runDeps="$(scanelf --needed --nobanner --recursive /env \ | awk '{ gsub(/,/, "\nso:", $2); print "so:" $2 }' \ | sort -u \ | xargs -r apk info --installed \ | sort -u)" \ && apk add --virtual rundeps $runDeps \ && apk del .build-deps ADD django-polls /app WORKDIR /app ENV VIRTUAL_ENV /env ENV PATH /env/bin:$PATH EXPOSE 8000 |
U ovom isječku koda govorimo Dockeru da kopira requirements.txt datoteku u /app/requirements.txt kako bismo osigurali da su ovisnosti aplikacije dostupne na datotečnom sustavu slike. Ovisnosti uključuju sve Python pakete potrebne za pokretanje aplikacije. Ovisnosti se kopiraju prve kako bi Docker mogao spremiti sloj slike u privremenu memoriju. To je zato što Docker sprema svaki korak u Dockerfile-u u privremenu memoriju. Prva izgradnja slike obično traje duže. Docker će preuzeti ovisnosti, a zatim ih spremiti u privremenu memoriju. Ako se requirements.txt datoteka ne promijeni, Docker će graditi iz privremene memorije, čime se naknadne izgradnje ubrzavaju.
Sljedeći korak ima RUN instrukciju koja izvršava popis Linux naredbi, lančano povezanih s Linux && operatorom. Naredbe rade sljedeće:
-
Koristite Alpineov apk alat za upravljanje paketima za instalaciju PostgreSQL razvojnih datoteka i osnovnih ovisnosti za izgradnju.
-
Stvorite Python virtualno okruženje.
-
Instalirajte Python ovisnosti definirane u requirements.txt datoteci pomoću pip.
-
Kompajlirajte potrebne runtime pakete analizirajući zahtjeve instaliranih Python paketa.
-
Uklonite sve ovisnosti za izgradnju koje više nisu potrebne.
Razlog za lančano povezivanje naredbi u RUN koraku je smanjenje slojeva slike. Docker stvara novi sloj slike na vrhu postojećeg datotečnog sustava svaki put kada naiđe na ADD, COPY, ili RUN instrukcija u Dockerfile-u. Sažimanje naredbi gdje je primjenjivo smanjit će broj stvorenih slojeva slike.
Stavke dodane u slojeve slike ne mogu se ukloniti u sljedećem sloju. Morate deklarirati instrukcije za brisanje neželjenih stavki prije nego što prijeđete na sljedeću instrukciju. To je nužno kako bi se smanjila veličina slike. Trebali biste primijetiti da smo dodali apk del naredbu na kraju RUN naredbe. To je učinjeno kako bi se uklonile ovisnosti za izgradnju nakon što smo ih upotrijebili za izgradnju paketa aplikacije.
Zatim imamo još jednu ADD instrukciju koju koristimo za kopiranje koda aplikacije u /app direktorij. Zatim ćemo koristiti WORKDIR instrukciju za postavljanje radnog direktorija slike na /app direktorij, koji sada sadrži kod aplikacije.
Zatim imamo ENV instrukcije koje koristimo za postavljanje dviju varijabli okruženja koje će slika učiniti dostupnima pokrenutim kontejnerima. Prvo, postavljamo VIRTUAL_ENV varijablu na /env. Drugo, postavljamo PATH varijablu kako bi uključivala /env/bin direktorij. U ova dva retka učitavamo /env/bin/activate skriptu, što je način na koji aktiviramo virtualno okruženje u Linux okruženju. Više o radu s virtualnim okruženjima u Pythonu na drugim operacijskim sustavima. Posljednja instrukcija je EXPOSE naredba koja postavlja port 8000 na kojem će kontejner slušati tijekom izvođenja.
Do sada je vaš Dockerfile gotovo potpun, osim zadane naredbe koja će se pokrenuti kada pokrenete kontejnere. Definirajmo je u sljedećem odjeljku.
-
Razumijevanje zadane naredbe Docker slike
Prilikom pokretanja Docker kontejnera možete navesti naredbu za izvršavanje. Međutim, ako ne navedete naredbu, zadana naredba Docker slike odredit će što će se dogoditi kada se kontejner pokrene. Koristimo ENTRYPOINT ili CMD instrukcije pojedinačno ili zajedno kako bismo definirali zadanu naredbu unutar Dockerfile-a.
Ako odlučite definirati i ENTRYPOINT i CMD, u ENTRYPOINT instrukciji definirate izvršnu datoteku koju će kontejner pokrenuti. U CMD instrukciji definirate zadani popis argumenata za izvršnu naredbu. Zadani popis argumenata možete nadjačati dodavanjem alternativnih argumenata u naredbenom retku prilikom pokretanja kontejnera u formatu:
|
1 |
docker run <image> <arguments> |
Ovaj format sprječava programere da lako nadjačaju ENTRYPOINT naredbu. ENTRYPOINT naredba je definirana za pozivanje skripte koja će postaviti okruženje i izvršiti različite radnje na temelju pruženog popisa argumenata.
Možete koristiti ENTRYPOINT instrukciju samu za konfiguriranje izvršne datoteke kontejnera. Međutim, ovaj format ne dopušta definiranje zadanog popisa argumenata. Možete navesti argumente kada pokrećete kontejner pomoću docker run naredbe.
Ako se odlučite samo za CMD , Docker to tumači kao zadanu naredbu i popis argumenata, koje možete nadjačati tijekom izvođenja. Više informacija možete pronaći u službenoj referentnoj dokumentaciji za Dockerfile.
Pogledajmo kako možemo primijeniti informacije koje ste naučili o zadanim naredbama na naš primjer kontejnera. Želimo prema zadanim postavkama posluživati aplikaciju pomoću gunicorn poslužitelja. Iako popis argumenata proslijeđen gunicorn poslužitelju ne mora biti konfigurabilan tijekom izvođenja, želimo fleksibilnost pokretanja drugih naredbi u svrhe kao što su uklanjanje pogrešaka ili upravljanje konfiguracijama (inicijalizacija baze podataka, prikupljanje statičkih resursa itd.). Kao što vidite, u našem je najboljem interesu koristiti CMD za definiranje zadane naredbe koja će nam omogućiti da je nadjačamo kad god je to potrebno.
Evo nekoliko sintaksi koje možete koristiti za definiranje CMD naredbe:
- CMD ["command", "argument 1", "argument 2", . . . ,"argument n"]: exec format (preporučeni format), prima naredbu i popis argumenata. Izvršava naredbu izravno bez obrade u ljusci.
- CMD command "argument 1" "argument 2" . . . "argument n": Format ljuske (shell format) definira naredbu i popis argumenata. Prosljeđuje popis naredbi ljusci na obradu. Ovo vam može biti korisno ako želite zamijeniti varijable okruženja u naredbi, međutim, nije sasvim predvidljivo.
- CMD ["argument 1", "argument 2", . . . ,"argument n"]: Format popisa argumenata, on samo definira zadani popis argumenata i koristi se zajedno s ENTRYPOINT instrukcijom.
Koristit ćemo exec format za definiranje naše konačne instrukcije u Dockerfile. Dodajte sljedeći redak na kraj svog Dockerfile:
|
1 |
CMD ["gunicorn", "--bind", ":8000", "--workers", "3", "mysite.wsgi:application"] |
Sada možete spremiti i zatvoriti Dockerfile.
Kada pokrenete kontejnere koristeći ovu sliku, oni će izvršiti gunicorn povezan na localhost port 8000 s 3 radnika i pozvati application funkciju u wsgi.py datoteci koja se nalazi u mysite direktoriju. Možete odabrati pružanje druge naredbe kako biste nadjačali zadanu naredbu tijekom izvođenja i izvršili drugi proces umjesto gunicorna. Možda biste željeli saznati više o Gunicorn radnicima.
Vaš Dockerfile je sada spreman i možete koristiti docker build za izgradnju slike aplikacije. Možete koristiti docker run za pokretanje kontejnera na vašem lokalnom razvojnom računalu.
-
Izgradnja Docker slike
Naredba docker build će prema zadanim postavkama tražiti Dockerfile u trenutnom direktoriju kako bi pronašla svoje upute za izgradnju. Također šalje "kontekst" izgradnje Docker daemonu. Kontekst izgradnje je skup datoteka koje bi trebale biti dostupne tijekom procesa izgradnje. Prema zadanim postavkama, trenutni direktorij u kojem pokrećete docker build naredbu postavljen je kao kontekst izgradnje.
Dok ste u istom direktoriju koji sadrži vaš Dockerfile, pokrenite naredbu docker build. Navedite sliku i oznaku pomoću -t zastavice i postavite trenutni direktorij kao kontekst izgradnje pomoću točke ( .) na kraju naredbe:
|
1 |
docker build -t django-polls:v1 . |
U ovoj naredbi nazvali smo sliku django-polls a oznaku v1. Primijetite točku na kraju naredbe, koristimo je za označavanje trenutnog direktorija kao konteksta izgradnje.
Kada docker build završi, trebali biste vidjeti nešto slično sljedećem izlazu:

Vaša Docker slika je sada spremna. Da nismo izdvojili neke od konfiguracija u vanjske varijable okruženja, mogli biste jednostavno pokrenuti svoj kontejner pomoću docker run naredbe. Međutim, budući da nismo konfigurirali vanjske varijable okruženja koje smo postavili u settings.py datoteci, pokretanje neće uspjeti. Dovršimo to u sljedećem koraku.
Korak 8: Postavljanje okruženja za izvršavanje i testiranje aplikacije
Približavamo se kraju ovog vodiča. U ovom koraku konfigurirat ćemo varijable okruženja u env datoteci. S postavljenim varijablama u env datoteci, možemo stvoriti shemu baze podataka, generirati i prenijeti statičke datoteke na vanjsku uslugu pohrane objekata i na kraju testirati aplikaciju.
Docker dolazi s nekoliko metoda koje možete koristiti za pružanje varijabli okruženja kontejneru. U našem slučaju želimo pružiti popis varijabli okruženja putem datoteke. Stoga ćemo koristiti --env-file metodu.
Koristeći svoj omiljeni uređivač, stvorite datoteku pod nazivom env u django_project direktoriju:
|
1 |
nano env |
Zalijepite sljedeći popis varijabli:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
DJANGO_SECRET_KEY=your_secret_key DEBUG= DJANGO_LOGLEVEL=info DJANGO_ALLOWED_HOSTS=IP_adresa_vašeg_poslužitelja DB_ENGINE=postgresql_psycopg2 DB_DATABASE=polls_db DB_USERNAME=hackins DB_PASSWORD=lozinka_vaše_baze_podataka DB_HOST=host_vaše_baze_podataka DB_PORT=port_vaše_baze_podataka STATIC_DEFAULT_FILE_STORAGE=storages.backends.s3boto3.S3Boto3Storage STATIC_MINIO_BUCKET_NAME=test-bucket MINIO_ACCESS_KEY=vaš_minio_pristupni_ključ MINIO_SECRET_KEY=vaš_minio_tajni_ključ MINIO_URL=vaš_minio_url:vaš_minio_port |
Varijable na popisu su one koje ste definirali u prethodnim koracima:
-
DJANGO_SECRET_KEY: Generirajte jedinstvenu, nepredvidivu vrijednost kako je objašnjeno u Django dokumentaciji. Možete koristiti ovu naredbu za generiranje nasumičnog niza i njegovo postavljanje u varijablu:
|
1 |
python -c 'from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())' |
-
DEBUG: Postavili smo ovu vrijednost na True, ali za produkcijsku implementaciju, ne zaboravite je postaviti na False tako da je ostavite praznom.
-
DJANGO_LOGLEVEL: postavili smo ovo na info, slobodno je prilagodite na željenu razinu.
-
DJANGO_ALLOWED_HOSTS: postavite ovu vrijednost na IP adresu Ubuntu poslužitelja na kojem se izvode vaši Docker spremnici. Opcijski, postavite je na *, zamjenski znak koji odgovara svim hostovima ako ste u razvojnom načinu rada.
-
DB_DATABASE: ako ste koristili drugačiji naziv baze podataka, postavite ga ovdje na odgovarajući način.
-
DB_USERNAME: postavite ovo na korisničko ime koje ste odabrali za svoju bazu podataka.
-
DB_PASSWORD: postavite ovo na lozinku koju ste odabrali za svoju bazu podataka.
-
DB_HOST: postavite ovo na host na kojem se izvodi instanca vaše baze podataka kao što ste postavili u Prvom koraku.
-
DB_PORT: postavite ovo na port vaše baze podataka.
-
STATIC_MINIO_BUCKET_NAME: postavite ovo na naziv bucket-a koji ste izradili na svom MinIO Cloud Storage računu.
Spremite i zatvorite datoteku kada završite s uređivanjem.
Konfiguracije okruženja su sada spremne. Moramo pokrenuti spremnik prosljeđivanjem argumenata za nadjačavanje zadane CMD naredbe i stvoriti shemu baze podataka pomoću naredbi manage.py makemigrations i manage.py migrate.
Evo naredbe:
|
1 |
docker run --env-file env django-polls:v1 sh -c "python manage.py makemigrations && python manage.py migrate" |
U ovoj naredbi pokrećemo sliku spremnika django-polls:v1, koristeći zastavicu –env-file za prosljeđivanje datoteke varijabli okruženja. Također nadjačavamo zadanu CMD naredbu s sh -c "python manage.py makemigrations && python manage.py migrate" Kada se ova naredba pokrene za pokretanje spremnika, stvorit će se shema baze podataka kako je definirano u kodu aplikacije.
Ako je uspješno, trebali biste vidjeti izlaz sličan onome u nastavku:

Izlaz pokazuje da je shema baze podataka uspješno stvorena.
Sljedeći korak je stvaranje administrativnog korisnika za Django aplikaciju. Pokrenut ćemo spremnik i pokrenuti interaktivnu ljusku unutar njega sa sljedećom naredbom:
|
1 |
docker run -i -t --env-file env django-polls:v1 sh |
Naredba pokreće spremnik s upitom ljuske koji možete koristiti za interakciju s Python ljuskom. Stvorimo korisnika:
|
1 |
python manage.py createsuperuser |
Slijedite upite kako biste unijeli korisničko ime, adresu e-pošte, lozinku, ponovno upišite lozinku i pritisnite enter za stvaranje korisnika. Izađite iz ljuske i zaustavite spremnik pritiskom na CTRL+D.
Zatim moramo ponovno pokrenuti spremnik, nadjačavajući zadanu naredbu s Django naredbom collectstatic kako bismo generirali statičke datoteke za aplikaciju i prenijeli ih na vašu MinIO uslugu pohrane u oblaku:
|
1 |
docker run --env-file env django-polls:v1 sh -c "python manage.py collectstatic --noinput" |
Kada završi, trebali biste vidjeti sličan izlaz kao u nastavku, koji pokazuje da se vaš spremnik uspješno povezao s MinIO uslugom pohrane i prenio statičke datoteke:
![]()
Naš spremnik za pohranu sada izgleda ovako, s direktorijima koje je Django stvorio:

Napokon, sada možemo pokrenuti aplikaciju naredbom:
|
1 |
docker run --env-file env -p 80:8000 django-polls:v1 |
Evo izlaza:

Kada izvršite gornju naredbu, ona pokreće zadanu CMD naredbu u vašoj slici i izlaže port 8000 kako je definirano. Sada se Ubuntu na portu 80 mapira na 8000 port django-polls:v1 kontejnera.
Sada možemo testirati aplikaciju u pregledniku. Otvorite javnu IP adresu svog poslužitelja u pregledniku: http://your_server_public_ip.
Očekujte da ćete naići na pogrešku 404 Stranica nije pronađena, jer prema Django vodiču, nismo definirali rutu za / putanju:

Imamo varijablu DEBUG postavljenu na True, zato vidimo ovu stranicu s pogreškom s mnogo ključnih informacija. Uklonimo postavku varijable DEBUG . Najprije ćete morati zaustaviti pokrenuti kontejner pomoću CTRL+C. Zatim otvorite env datoteku:
|
1 |
nano env |
Zatim pronađite varijablu DEBUG i uklonite njezinu vrijednost ili je ostavite praznom. Ostavljamo je praznom jer funkcija getenv interpretira False kao niz znakova, stoga vraćajući true:
|
1 |
DEBUG= |
Spremite datoteku i ponovno pokrenite kontejner naredbom:
|
1 |
docker run --env-file env -p 80:8000 django-polls:v1 |
Ako posjetite http://your_server_public_ip u svom pregledniku, trebali biste vidjeti zadanu stranicu 404:

Vidjeli ste kako možete manipulirati ponašanjem svoje Django aplikacije u vremenu izvođenja pomoću varijabli okruženja, bez mijenjanja izvornog koda.
Idite na http://your_server_public_ip/polls kako biste vidjeli početnu stranicu anketa (Polls):

Nemamo anketa jer smo tek implementirali aplikaciju.
Idite na administratorsko sučelje: http://your_server_public_ip/admin kako biste vidjeli prozor za administratorsku autentifikaciju:

Unesite vjerodajnice koje ste postavili naredbom createsuperuser za prijavu. Sada biste trebali biti na sučelju administrativne stranice:

Imajte na umu da se sve statičke datoteke poslužuju s vanjske usluge pohrane koju smo postavili. Možete kliknuti desnom tipkom miša u prozoru preglednika i odabrati Prikaži izvor stranice:

Možete dodati neka pitanja i opcije te testirati cjelokupne performanse aplikacije:

Vratite se na početnu stranicu anketa http://your_server_public_ip/polls i pokušajte glasati o pitanju:

Nakon što testirate i potvrdite da sve radi kako se očekuje, možete ugasiti kontejner.
Zaključak
Uspješno ste konfigurirali Django web aplikaciju za dobar rad u okruženju temeljenom na kontejnerima. To je uključivalo prilagodbu aplikacije za rad s vanjskim varijablama okruženja, postavljanje aplikacije da koristi uslugu pohrane u oblaku za statičke datoteke i stvaranje Dockerfile-a za sliku kontejnera. Promjene koje smo napravili kako bismo dokerizirali aplikaciju možete vidjeti na django-polls-docker grani django-polls GitHub repozitorija.
Odavde su mogućnosti ograničene samo vašom maštom. Možete postaviti Nginx obrnuti proxy koji će se nalaziti između klijenata i Gunicorn poslužitelja. Također možete dodati Certbot za dobivanje TLS certifikata kako biste osigurali svoj Nginx poslužitelj. Preporučujemo dodavanje HTTP proxyja za međuspremanje sporih klijenata i zaštitu vašeg Gunicorn poslužitelja od napada uskraćivanjem usluga.
Iako smo definirali 3 radnika u naredbi za pokretanje u Dockerfile-u, možete postaviti željeni broj ovisno o resursima dostupnima na vašem poslužitelju. Više informacija možete pronaći u službenoj dokumentaciji o dizajnu Gunicorna. Ako želite, možete poslati Docker sliku koju ste izgradili na Dockerhub i pokušati je implementirati na nekoliko okruženja koja imaju instaliran Docker. Ako želite saznati više, nastavite pratiti naš blog s vodičima jer ćemo pripremiti popratni vodič za osiguravanje Django aplikacije pomoću Nginxa i Let’s Encrypta.
Na kraju, evo još resursa koji će vam pomoći u korištenju Dockera:
- Kako ugostiti repozitorij Docker slika i izgraditi Docker slike s GitLab samoupravljanom instancom na Ubuntu 20.04
- Rad s Docker podatkovnim volumenima na Ubuntu 20.04
- Izgradnja i implementacija Flask aplikacije s Dockerom na Ubuntu 20.04
- Kako implementirati WordPress s Docker kontejnerima na Ubuntu 20.04
Sretno programiranje!
Komentari
Još nema komentara. Budite prvi.