?
概要
在這篇文章中,我將介紹如何使用 Docker 和 Nginx 部署 Django Web 項(xiàng)目。一步步講解如何構(gòu)建 Docker 鏡像、如何編寫(xiě) Docker Compose 文件和如何配置 Nginx。
1. Docker 構(gòu)建 Django Web 項(xiàng)目
1.1 配置 Django 項(xiàng)目
在開(kāi)始之前,我們需要有一個(gè) Django 項(xiàng)目。如果你還沒(méi)有 Django 項(xiàng)目,可以按照 Django 官方文檔的指導(dǎo)創(chuàng)建一個(gè)。我們將 Django 項(xiàng)目放在一個(gè)名為?myproject
?的目錄中。
1.2 編寫(xiě) Dockerfile
接下來(lái),我們需要編寫(xiě) Dockerfile。Dockerfile 是用來(lái)構(gòu)建 Docker 鏡像的腳本。在?myproject
?目錄下創(chuàng)建一個(gè)名為?Dockerfile
?的文件,并在其中添加以下內(nèi)容:
#?基礎(chǔ)鏡像
FROM?python:3.9
#?在容器中創(chuàng)建項(xiàng)目目錄
RUN?mkdir?/code
#?設(shè)置工作目錄
WORKDIR?/code
#?將當(dāng)前目錄下的所有文件復(fù)制到容器中的?/code?目錄
COPY?.?/code/
#?安裝項(xiàng)目依賴(lài)
RUN?pip?install?-r?requirements.txt
在上面的 Dockerfile 中,我們首先指定 Python 3.9 作為基礎(chǔ)鏡像。然后在容器中創(chuàng)建一個(gè)名為?/code
?的目錄,并將當(dāng)前目錄下的所有文件復(fù)制到容器中的?/code
?目錄中。最后,我們安裝項(xiàng)目所需的依賴(lài)。
1.3 構(gòu)建 Docker 鏡像
現(xiàn)在我們可以使用 Dockerfile 來(lái)構(gòu)建 Docker 鏡像了。在?myproject
?目錄下打開(kāi)終端,運(yùn)行以下命令:
docker?build?-t?myproject?.
上面的命令將使用?myproject
?目錄下的 Dockerfile 構(gòu)建一個(gè)名為?myproject
?的 Docker 鏡像。
1.4 運(yùn)行 Docker 鏡像
現(xiàn)在我們可以運(yùn)行 Docker 鏡像了。在終端中運(yùn)行以下命令:
docker?run?-it?--rm?-p?8000:8000?myproject
上面的命令將運(yùn)行一個(gè)名為?myproject
?的 Docker 鏡像,并將容器的端口 8000 映射到主機(jī)的端口 8000?,F(xiàn)在你可以在瀏覽器中訪問(wèn)?http://localhost:8000
?來(lái)查看你的 Django 項(xiàng)目是否正常工作了。
2. 使用 Docker Compose 編排 Django Web 項(xiàng)目
雖然上面的方法可以用來(lái)構(gòu)建和運(yùn)行 Docker 鏡像,但是它并沒(méi)有考慮到一些重要的問(wèn)題,例如如何處理數(shù)據(jù)庫(kù)、如何設(shè)置環(huán)境變量等等。為了解決這些問(wèn)題,我們可以使用 Docker Compose。
2.1 編寫(xiě) Docker Compose 文件
在?myproject
?目錄下創(chuàng)建一個(gè)名為?docker-compose.yml
?的文件,并在其中添加以下內(nèi)容:
version:?'3'
services:
??web:
????build:?.
????command:?python?manage.py?runserver?0.0.0.0:8000
????volumes:
??????-?.:/code
????ports:
??????-?"8000:8000"
????environment:
??????-?DJANGO_SETTINGS_MODULE=myproject.settings
??????-?DATABASE_URL=postgres://postgres:postgres@db:5432/postgres
??db:
????image:?postgres
????environment:
??????-?POSTGRES_DB=postgres
??????-?POSTGRES_USER=postgres
??????-?POSTGRES_PASSWORD=postgres
在上面的 Docker Compose 文件中,我們定義了兩個(gè)服務(wù):一個(gè)是?web
?服務(wù),另一個(gè)是?db
?服務(wù)。web
?服務(wù)是我們剛才構(gòu)建的 Django Web 項(xiàng)目,db
?服務(wù)是一個(gè) PostgreSQL 數(shù)據(jù)庫(kù)。
在?web
?服務(wù)中,我們使用了?build
?關(guān)鍵字來(lái)指定 Dockerfile 的路徑。command
?關(guān)鍵字用來(lái)指定容器啟動(dòng)時(shí)要運(yùn)行的命令,這里我們運(yùn)行 Django 的開(kāi)發(fā)服務(wù)器。volumes
?關(guān)鍵字用來(lái)將本地目錄與容器內(nèi)的目錄進(jìn)行映射,這樣我們可以在本地編輯文件并在容器內(nèi)運(yùn)行它們。ports
?關(guān)鍵字用來(lái)將容器內(nèi)的端口映射到主機(jī)上的端口。environment
?關(guān)鍵字用來(lái)設(shè)置環(huán)境變量,這里我們?cè)O(shè)置了 Django 的配置和數(shù)據(jù)庫(kù)連接的 URL。
在?db
?服務(wù)中,我們使用了?image
?關(guān)鍵字來(lái)指定使用 PostgreSQL 官方鏡像。environment
?關(guān)鍵字用來(lái)設(shè)置 PostgreSQL 的用戶(hù)名、密碼和數(shù)據(jù)庫(kù)名稱(chēng)。
2.2 運(yùn)行 Docker Compose
現(xiàn)在我們可以使用 Docker Compose 來(lái)構(gòu)建和運(yùn)行 Docker 鏡像了。在終端中運(yùn)行以下命令:
docker-compose?up
上面的命令將使用?docker-compose.yml
?文件來(lái)構(gòu)建和運(yùn)行 Docker 鏡像。在容器啟動(dòng)后,你可以在瀏覽器中訪問(wèn)?http://localhost:8000
?來(lái)查看你的 Django 項(xiàng)目是否正常工作了。
3. 配置 Nginx 反向代理
盡管我們已經(jīng)成功地將 Django Web 項(xiàng)目部署到了 Docker 中,但是我們還沒(méi)有解決如何使用 Nginx 配置反向代理的問(wèn)題。在這一節(jié)中,我們將講解如何使用 Nginx 配置反向代理。
3.1 編寫(xiě) Nginx 配置文件
在?myproject
?目錄下創(chuàng)建一個(gè)名為?nginx.conf
?的文件,并在其中添加以下內(nèi)容:
upstream?web?{
????server?web:8000;
}
server?{
????listen?80;
????location?/?{
????????proxy_pass?http://web;
????????proxy_set_header?Host?$host;
????????proxy_set_header?X-Real-IP?$remote_addr;
????}
}
在上面的配置文件中,我們定義了一個(gè)名為?web
?的 upstream,將其指向 Docker Compose 中的?web
?服務(wù)。然后我們定義了一個(gè) Nginx 服務(wù)器監(jiān)聽(tīng) 80 端口。在 location 中,我們將請(qǐng)求代理到 upstream 中的?web
?服務(wù),并設(shè)置了 Host 和 X-Real-IP 頭。
以上配置為訪問(wèn)ip打開(kāi)項(xiàng)目。如果你想綁定域名,可以改成:
upstream?web?{
????server?web:8000;
}
server?{
????listen?80;
????server_name?example.com;
????location?/?{
????????proxy_pass?http://web;
????????proxy_set_header?Host?$host;
????????proxy_set_header?X-Real-IP?$remote_addr;
????}
}
把example.com解析到你的ip后,即可實(shí)現(xiàn)訪問(wèn)域名打開(kāi)項(xiàng)目。
3.2 編寫(xiě) Dockerfile
為了讓 Nginx 能夠使用我們編寫(xiě)的配置文件,我們需要編寫(xiě)一個(gè) Dockerfile。
在?myproject
?目錄下創(chuàng)建一個(gè)名為?Dockerfile.nginx
?的文件,并在其中添加以下內(nèi)容:
#?基礎(chǔ)鏡像
FROM?nginx:latest
#?刪除默認(rèn)配置文件
RUN?rm?/etc/nginx/conf.d/default.conf
#?將自定義配置文件復(fù)制到容器中的?/etc/nginx/conf.d/?目錄下
COPY?nginx.conf?/etc/nginx/conf.d/
在上面的 Dockerfile 中,我們首先指定 Nginx 最新版本作為基礎(chǔ)鏡像。然后我們刪除默認(rèn)的配置文件,并將我們編寫(xiě)的配置文件復(fù)制到容器中的?/etc/nginx/conf.d/
?目錄下。
3.3 構(gòu)建 Docker 鏡像并運(yùn)行
現(xiàn)在我們可以使用 Dockerfile.nginx 來(lái)構(gòu)建 Docker 鏡像了。在終端中運(yùn)行以下命令:
docker?build?-t?myproject-nginx?-f?Dockerfile.nginx?.
上面的命令將使用?Dockerfile.nginx
?構(gòu)建一個(gè)名為?myproject-nginx
?的 Docker 鏡像。
接下來(lái),我們需要使用 Docker Compose 來(lái)啟動(dòng) Nginx 服務(wù)。在?docker-compose.yml
?中添加以下內(nèi)容:
version:?'3'
services:
??web:
????build:?.
????command:?python?manage.py?runserver?0.0.0.0:8000
????volumes:
??????-?.
????ports:
??????-?"8000:8000"
????environment:
??????-?DJANGO_SETTINGS_MODULE=myproject.settings
??????-?DATABASE_URL=postgres://postgres:postgres@db:5432/postgres
??db:
????image:?postgres
????environment:
??????-?POSTGRES_DB=postgres
??????-?POSTGRES_USER=postgres
??????-?POSTGRES_PASSWORD=postgres
??nginx:
????build:?.
????ports:
??????-?"80:80"
????depends_on:
??????-?web
在上面的 Docker Compose 文件中,我們定義了一個(gè)名為?nginx
?的服務(wù),使用之前編寫(xiě)的?Dockerfile.nginx
?來(lái)構(gòu)建 Docker 鏡像。我們將容器的端口 80 映射到主機(jī)的端口 80,并且在?depends_on
?中指定了?web
?服務(wù),這樣 Nginx 就可以將請(qǐng)求代理到?web
?服務(wù)中。
現(xiàn)在我們可以使用 Docker Compose 來(lái)構(gòu)建和運(yùn)行 Docker 鏡像。在終端中運(yùn)行以下命令:
docker-compose?up
上面的命令將使用?docker-compose.yml
?文件來(lái)構(gòu)建和運(yùn)行 Docker 鏡像。在容器啟動(dòng)后,你可以在瀏覽器中訪問(wèn)?http://localhost
?來(lái)查看你的 Django 項(xiàng)目是否正常工作了,這時(shí)請(qǐng)求會(huì)被 Nginx 代理到?web
?服務(wù)中。
4. 配置靜態(tài)文件服務(wù)和 HTTPS 支持
如果你的 Django 項(xiàng)目中包含靜態(tài)文件,你需要將它們配置為獨(dú)立的靜態(tài)文件服務(wù)。此外,你可能還需要為你的 Web 應(yīng)用程序配置 HTTPS 支持。在這一節(jié)中,我們將講解如何配置靜態(tài)文件服務(wù)和 HTTPS 支持。
4.1 配置靜態(tài)文件服務(wù)
為了讓 Nginx 作為靜態(tài)文件服務(wù),我們需要在?nginx.conf
?文件中添加以下內(nèi)容:
upstream?web?{
????server?web:8000;
}
server?{
????listen?80;
????location?/static/?{
????????alias?/code/static/;
????}
????location?/?{
????????proxy_pass?http://web;
????????proxy_set_header?Host?$host;
????????proxy_set_header?X-Real-IP?$remote_addr;
????}
}
在上面的配置文件中,我們添加了一個(gè)名為?/static/
?的 location,并設(shè)置其別名為?/code/static/
,這樣 Nginx 就可以將靜態(tài)文件服務(wù)到客戶(hù)端了。
4.2 配置 HTTPS 支持
為了配置 HTTPS 支持,我們需要使用 SSL 證書(shū)。你可以購(gòu)買(mǎi) SSL 證書(shū),也可以使用免費(fèi)的 Let's Encrypt 證書(shū)。
4.2.1 使用 Let's Encrypt 證書(shū)
如果你想使用 Let's Encrypt 證書(shū),可以按照以下步驟進(jìn)行配置。
首先,安裝 Certbot 工具。你可以在 Certbot 的官方網(wǎng)站上找到詳細(xì)的安裝說(shuō)明。
接下來(lái),使用 Certbot 工具來(lái)申請(qǐng)證書(shū)。在終端中運(yùn)行以下命令:
sudo?certbot?certonly?--webroot?--webroot-path=/code/static?-d?example.com
上面的命令將使用 webroot 插件來(lái)申請(qǐng)證書(shū)。--webroot-path
?選項(xiàng)將 Certbot 配置為在指定目錄下查找驗(yàn)證文件。-d
?選項(xiàng)指定了你的域名。
最后,將以下內(nèi)容添加到?nginx.conf
?文件中:
upstream?web?{
????server?web:8000;
}
server?{
????listen?80;
????server_name?example.com;
????return?301?https://$host$request_uri;
}
server?{
????listen?443?ssl;
????server_name?example.com;
????ssl_certificate?/etc/letsencrypt/live/example.com/fullchain.pem;
????ssl_certificate_key?/etc/letsencrypt/live/example.com/privkey.pem;
????location?/static/?{
????????alias?/code/static/;
????}
????location?/?{
????????proxy_pass?http://web;
????????proxy_set_header?Host?$host;
????????proxy_set_header?X-Real-IP?$remote_addr;
????}
}
在上面的配置文件中,我們定義了兩個(gè)服務(wù)器:第一個(gè)服務(wù)器監(jiān)聽(tīng) 80 端口,并將請(qǐng)求重定向到 443 端口;第二個(gè)服務(wù)器監(jiān)聽(tīng) 443 端口,并使用 SSL 證書(shū)來(lái)啟用 HTTPS 支持。ssl_certificate
?和?ssl_certificate_key
?分別指定了 SSL 證書(shū)和私鑰的路徑。
4.3 Docker Compose 文件更新
最后,我們需要更新 Docker Compose 文件來(lái)包含新的 Nginx 配置和靜態(tài)文件服務(wù)。以下是更新后的 Docker Compose 文件:
version:?"3"
services:
??web:
????build:
??????context:?.
??????dockerfile:?Dockerfile
????ports:
??????-?"8000:8000"
????environment:
??????-?DJANGO_SETTINGS_MODULE=myproject.settings
??????-?DATABASE_URL=postgres://postgres:postgres@db:5432/postgres
??db:
????image:?postgres
????environment:
??????-?POSTGRES_DB=postgres
??????-?POSTGRES_USER=postgres
??????-?POSTGRES_PASSWORD=postgres
??nginx:
????build:
??????context:?.
??????dockerfile:?Dockerfile.nginx
????ports:
??????-?"80:80"
??????-?"443:443"
????depends_on:
??????-?web
????volumes:
??????-?./nginx.conf:/etc/nginx/nginx.conf
??????-?./certbot:/etc/letsencrypt
在上面的 Docker Compose 文件中,我們添加了一個(gè)名為?nginx
?的服務(wù),并將其端口 443 映射到主機(jī)的端口 443,以支持 HTTPS。此外,我們將?/etc/nginx/nginx.conf
?和?/etc/letsencrypt
?目錄掛載到主機(jī)上,以便在容器外部進(jìn)行配置和證書(shū)的管理。
現(xiàn)在,你可以使用 Docker Compose 來(lái)構(gòu)建和運(yùn)行 Docker 鏡像,并在瀏覽器中訪問(wèn)?https://example.com
?來(lái)查看你的 Django 項(xiàng)目是否正常工作了。
5. 技術(shù)總結(jié)
如果你以前沒(méi)有使用過(guò) Docker,本文可能會(huì)有點(diǎn)晦澀。但是,當(dāng)你熟悉了這些工具和框架,你會(huì)發(fā)現(xiàn)使用它們來(lái)構(gòu)建和部署應(yīng)用程序是非常方便和高效的。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-618320.html
今天的分享就到這里,歡迎點(diǎn)贊收藏轉(zhuǎn)發(fā),感謝。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-618320.html
到了這里,關(guān)于Python web實(shí)戰(zhàn) | Docker+Nginx部署python Django Web項(xiàng)目詳細(xì)步驟【干貨】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!