docker簡單部署Django項(xiàng)目實(shí)例
docker簡單部署Django項(xiàng)目
使用docker配置項(xiàng)目,不能與宿主機(jī)本身的nginx服務(wù)、uWSGI等服務(wù)起沖突,可以先將宿主機(jī)上的這些服務(wù)先禁用,僅通過docker來配置對應(yīng)的服務(wù);若不想在禁用原有的服務(wù)的情況下,需注意端口不要有沖突
docker配置nginx服務(wù)
docker拉取nginx鏡像docker pull nginx
以掛載目錄的方式啟動Nginx,將項(xiàng)目靜態(tài)文件夾掛載到docker_nginx容器下的/usr/share/nginx/html目錄下
docker run \ --name=docker_nginx \ --privileged=true \ -v /data/pythonProject/autotpsite/dist:/usr/share/nginx/html \ -p 8080:80 \ -d \ nginx
--privileged=true 關(guān)閉安全權(quán)限,掛載多個目錄時,容器操作文件夾會沒有權(quán)限
如果該容器僅是一次性使用,可以加上--rm參數(shù)
通過訪問服務(wù)器IP:8080即可查看到對應(yīng)的靜態(tài)目錄文件
通過docker cp命令,將容器中的nginx的配置文件/etc/nginx拷貝到到宿主機(jī)上/data/nginx/conf,方便后續(xù)修改,因?yàn)槿萜鲀?nèi)沒有vi命令不方便修改。
docker cp docker_nginx:/etc/nginx /data/nginx/conf
docker配置后臺服務(wù)
修改uwsgi配置文件
[uwsgi] chdir =./ // 項(xiàng)目根目錄,配置文件處于項(xiàng)目根目錄,因此設(shè)置為相對路徑即可,復(fù)用性更高 module = autotpsite.wsgi:application // 指定wsgi模塊下的application對象 socket = 0.0.0.0:8888 //Nginx使用uwsgi_pass做方向代理時 需要設(shè)置成socket master = true // 主進(jìn)程 pidfile = uwsgi8888.pid // pid 文件,用于腳本啟動,停止該進(jìn)程 daemonize = uwsgi_server.log // 日志文件 enable-threads = true // 新增配置--允許多線程 buffer-size = 40960 // 設(shè)置請求頭最大字節(jié)數(shù),用于socket模式
因?yàn)槿萜髦g通信協(xié)議是http,而之前的nginx是通過socket進(jìn)行通信,所以這里需要進(jìn)行修改
[uwsgi] chdir = ./ // 項(xiàng)目根目錄,配置文件處于項(xiàng)目根目錄,因此設(shè)置為相對路徑即可,復(fù)用性更高 module = autotpsite.wsgi:application // 指定wsgi模塊下的application對象 http = 0.0.0.0:8888 //對本機(jī)8888端口提供服務(wù) master = true // 主進(jìn)程 pidfile = ./uwsgi8888.pid // pid 文件,用于腳本啟動,停止該進(jìn)程 daemonize = ./uwsgi_server.log // 日志文件,只記錄錯誤信息 disable-logging = true socket-timeout=10
python容器操作
部署測試平臺后臺服務(wù) Django+uwsgi
首先服務(wù)都依賴Python3.8,所以需要拉取鏡像docker pull python:3.8
啟動容器-掛載后端目錄-無需配置映射端口
docker run \ -it \ -v /data/pythonProject/autotpsite:/opt \ -p 8888:8888 \ --name djangoenv \ -d \ python:3.8
進(jìn)入容器
docker exec -it djangoenv bash
執(zhí)行cd /opt命令進(jìn)入容器掛載的opt目錄下,執(zhí)行ls命令,可以發(fā)現(xiàn),opt目錄下的文件,與宿主機(jī)/data/project/autotpsite目錄下的文件是一致的
安裝虛擬環(huán)境
執(zhí)行安裝庫操作
如果是Pipfile文件,需要通過pipenv命令進(jìn)行安裝對應(yīng)的庫,則需要先安裝pipenv,不過這種方式需要python版本與Pipfile文件中的python版本一致
pip install pipenv -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
如果是通過requirements.txt文件的,則執(zhí)行pip命令安裝對應(yīng)的庫即可
pip install -r requirements.txt -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
如果換源方式下載庫異常,可以配置pip.conf文件
mkdir -p /root/.config/pip && touch /root/.config/pip/pip.conf && echo " [global]\ntimeout = 60\nindex-url = https://pypi.doubanio.com/simple\ntrusted-host = pypi.doubanio.com" > /root/.config/pip/pip.conf
執(zhí)行命令python manage.py runserver,測試一下能否正常啟動,注意配置文件的數(shù)據(jù)庫 IP是否正確,否則可能連接不上
安裝uWSGI服務(wù)
安裝uWSGI服務(wù)
pip install uwsgi -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
執(zhí)行uwsgi uwsgi.ini命令啟動uWSGI,可通過ps -ef |grep uwsgi命令查看進(jìn)程是否啟動成功,通過tail -100f uwsgi_server.log命令查看是否有異常日志
腳本一鍵部署
為了下次方便隨時啟動新容器,可以把容器內(nèi)部的操作寫成shell ,執(zhí)行vim auto_deploy.sh命令,編寫腳本文件
auto_deploy.sh
cd opt/ && pip install -r requirements.txt -i http://pypi.douban.com/simple/ -- trusted-host pypi.douban.com && pip install uwsgi -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com && uwsgi uwsgi.ini && tail -f > /dev/null
將文件保存到宿主機(jī)的對應(yīng)/data/project/autotpsite目錄下
下次重啟啟動容器時,可以帶上該腳本文件進(jìn)行執(zhí)行,就不用再手動輸入命令去安裝虛擬環(huán)境和uWSGI服務(wù)了
docker run \ -it \ -p 8888:8888 \ -v /data/pythonProject/autotpsite:/opt \ --name djangoenv \ -d \ python:3.8 \ sh /opt/auto_deploy.sh
可通過docker logs -f djangoenv查看容器運(yùn)行的日志情況
修改nginx配置
修改nginx的配置文件,前面映射.出來了,所以不用進(jìn)入容器內(nèi)部去修改了,直接在宿主機(jī)下修改/data/nginx/conf目錄下,找到對應(yīng)的配置文件進(jìn)行修改即可/conf.d/default.conf,執(zhí)行命令vim default.conf編輯配置文件,在server塊中添加下方內(nèi)容
location ~/(api/|jira/) {
proxy_pass http://192.168.119.70:8888;
# proxy_pass http://127.0.0.1:8888;
}
重啟nginx容器
docker restart docker_nginx
其中192.168.119.70:8888為宿主機(jī)的ip+端口,該種方式是通過nginx訪問宿主機(jī)的方式來訪問對應(yīng)的docker后臺服務(wù)djangoenv,如果前端頁面接口返回正常信息,說明使用docker部署Django后臺服務(wù)成功
docker網(wǎng)絡(luò)配置
proxy_pass設(shè)置為http://127.0.0.1:8888無法訪問,是因?yàn)槿萜鞯木W(wǎng)絡(luò)是和主機(jī)隔離的,有自己的一套網(wǎng)絡(luò)
docker網(wǎng)絡(luò)知識
查看主機(jī)的網(wǎng)絡(luò)發(fā)現(xiàn)有個docker0網(wǎng)卡,這個是docker使用的網(wǎng)卡,docker就通過這個網(wǎng)卡來進(jìn)行網(wǎng)絡(luò)通信。
[root@localhost ~]# ip addr
# 其他網(wǎng)卡
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
group default
link/ether 02:42:f6:c3:5a:f4 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:f6ff:fec3:5af4/64 scope link
docker run 創(chuàng)建 Docker 容器時,可以用 --net 選項(xiàng)指定容器的網(wǎng)絡(luò)模式,Docker 有以下 4 種網(wǎng)絡(luò)模式:
- bridge 模式,使用
--net=bridge指定,默認(rèn)設(shè)置。 - host 模式,使用
--net=host指定。 - container 模式,使用
--net=container:NAMEorID指定。 - none 模式,使用
--net=none指定。
通過docker network ls命令可查看容器有哪些網(wǎng)絡(luò)
[root@localhost ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 9f606136c768 bridge bridge local c7fca13d33a9 host host local b590d278d4b1 none null local
默認(rèn)情況容器是掛載在bridge網(wǎng)絡(luò)的,所以可以查看bridge網(wǎng)絡(luò)的信息,查詢到相關(guān)容器的內(nèi)部IP,讓后通過內(nèi)部IP互相訪問。
執(zhí)行docker network inspect bridge命令查看docker容器網(wǎng)絡(luò)信息
# ....其他信息.....
"Containers": {
"3220d0e521dc0d9ed1e62bbf06f3db6d13722878fd64162f24013f9a876e902b": {
"Name": "docker_nginx",
"EndpointID": "9a167c7df70e7259ea01467edc0527a4f7b6f8a72791c22b894b26a91fc52e44",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
},
"671b14ffd0a9d92af2b30d3220b046934422307c9353f929f980f6042ce548c6": {
"Name": "djangoenv",
"EndpointID": "da589a787022042ed23ca33442fab05a8edaafaafe2c6e5fb69a727ee1092aaa",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
}
},
這里可以看到后臺服務(wù)djangoenv的IP是172.17.0.3/16,將nginx配置文件default.conf中的127.0.0.1改為172.17.0.3
location ~/(api/|jira/) {
# proxy_pass http://192.168.119.70:8888;
proxy_pass http://172.17.0.3:8888;
# proxy_pass http://127.0.0.1:8888;
}
重啟nginx服務(wù)后,接口依舊不會報錯,這是屬于bridge網(wǎng)絡(luò)模式下容器之間互相通信的一種配置方式
docker restart docker_nginx
bridge模式
bridge 模式是 Docker 默認(rèn)的網(wǎng)絡(luò)設(shè)置,此模式會為每一個容器分配 Network Namespace、設(shè)置 IP 等,并將一個主機(jī)上的 Docker 容器連接到一個虛擬網(wǎng)橋上。
當(dāng) Docker server 啟動時,會在主機(jī)上創(chuàng) 建一個名為 docker0 的虛擬網(wǎng)橋,此主機(jī)上啟動的 Docker 容器會連接到這個虛擬網(wǎng)橋上。虛擬網(wǎng)橋的 工作方式和物理交換機(jī)類似,這樣主機(jī)上的所有容器就通過交換機(jī)連在了一個二層網(wǎng)絡(luò)中。
接下來就要 為容器分配 IP 了,Docker 會從 RFC1918 所定義的私有 IP 網(wǎng)段中,選擇一個和宿主機(jī)不同的IP地址和 子網(wǎng)分配給 docker0,連接到 docker0 的容器就從這個子網(wǎng)中選擇一個未占用的 IP 使用。
如一般 Docker 會使用 172.17.0.0/16 這個網(wǎng)段,并將 172.17.42.1/16 分配給 docker0 網(wǎng)橋(在主機(jī)上使用 ifconfig 命令是可以看到 docker0 的,可以認(rèn)為它是網(wǎng)橋的管理接口,在宿主機(jī)上作為一塊虛擬網(wǎng)卡使用)
host 模式
如果啟動容器的時候使用 host 模式,那么這個容器將不會獲得一個獨(dú)立的 Network Namespace,而是和宿主機(jī)共用一個 Network Namespace。容器將不會虛擬出自己的網(wǎng)卡,配置自己的 IP 等,而是使用宿主機(jī)的 IP 和端口。
例如,我們在 10.10.101.105/24 的機(jī)器上用 host 模式啟動一個含有 web 應(yīng)用的 Docker 容器,監(jiān)聽 tcp 80 端口。當(dāng)我們在容器中執(zhí)行任何類似 ifconfig 命令查看網(wǎng)絡(luò)環(huán)境時,看到的都是宿主機(jī)上的信 息。而外界訪問容器中的應(yīng)用,則直接使用 10.10.101.105:80 即可,不用任何 NAT 轉(zhuǎn)換,就如直接跑 在宿主機(jī)中一樣。但是,容器的其他方面,如文件系統(tǒng)、進(jìn)程列表等還是和宿主機(jī)隔離的。
container 模式
這個模式指定新創(chuàng)建的容器和已經(jīng)存在的一個容器共享一個 Network Namespace,而不是和宿主機(jī)共享。新創(chuàng)建的容器不會創(chuàng)建自己的網(wǎng)卡,配置自己的 IP,而是和一個指定的容器共享 IP、端口范圍等。
同樣,兩個容器除了網(wǎng)絡(luò)方面,其他的如文件系統(tǒng)、進(jìn)程列表等還是隔離的。兩個容器的進(jìn)程可以通過 lo 網(wǎng)卡設(shè)備通信。
none模式
這個模式和前兩個不同。在這種模式下,Docker 容器擁有自己的 Network Namespace,但是,并不為 Docker容器進(jìn)行任何網(wǎng)絡(luò)配置。也就是說,這個 Docker 容器沒有網(wǎng)卡、IP、路由等信息。需要我們自己為 Docker 容器添加網(wǎng)卡、配置 IP 等。
docker相關(guān)網(wǎng)絡(luò)命令
- 查看所有docker網(wǎng)絡(luò)
docker network ls - 創(chuàng)建網(wǎng)絡(luò)
docker network create 網(wǎng)絡(luò)名 - 查看網(wǎng)絡(luò)信息
docker network inspect 網(wǎng)絡(luò)名 - 加入網(wǎng)絡(luò)
docker network connect 網(wǎng)絡(luò)名 容器名 - 移除網(wǎng)絡(luò)
docker network remove 網(wǎng)絡(luò)名(當(dāng)前網(wǎng)絡(luò)下沒有掛載容器) - 移除網(wǎng)絡(luò)下的容器
docker network disconnect 網(wǎng)絡(luò)名 容器名
容器通信
容器通信可以采用的有四種方案:
- 通過容器 IP 訪問:容器重啟后,IP 會發(fā)生變化,比較麻煩。
- 通過宿主機(jī)的 ip:port 的方式訪問:如果宿主機(jī) IP 改變,就得每個應(yīng)用都得改一遍,并且還要綁定端口,麻煩。
- 通過 link 建立鏈接:相互依賴的太緊,不利于維護(hù)。
- 自定義 network: 在同一個橋接網(wǎng)絡(luò)中的容器可以相互訪問,即使切換了宿主機(jī),也不影響,因?yàn)榭梢酝ㄟ^容器名來表示對方的IP。
通過容器 IP 訪問,作為寫死的IP一旦容器重啟就失效了,因此只作為臨時調(diào)試方案。第二種 和第三種也太麻煩不用。
采用第四種自定義network方案,實(shí)現(xiàn)容器互相通信。采用的是bridge網(wǎng)絡(luò)驅(qū)動模式,這個是docker默認(rèn)的網(wǎng)絡(luò)驅(qū)動模式,安全性高,性能好。
1、首先創(chuàng)建自定義網(wǎng)絡(luò)
docker network create -d bridge mynetwork
默認(rèn)是bridge驅(qū)動模式,所以也可以簡寫成
docker network create mynetwork
2、將將Nginx和Django后端項(xiàng)目容器加載到新網(wǎng)絡(luò)中,注意容器只能同時存在1個網(wǎng)絡(luò)中,即從默認(rèn)的網(wǎng)絡(luò)重新掛載到新建的網(wǎng)絡(luò)上。
docker network connect mynetwork docker_nginx docker network connect mynetwork djangoenv
為了不受到bridge網(wǎng)絡(luò)下的影響,先移除在bridge驅(qū)動模式網(wǎng)絡(luò)下的docker_nginx和djangoenv容器
docker network disconnect bridge docker_nginx docker network disconnect bridge djangoenv
此時執(zhí)行docker exec-it docker_nginx bash 命令進(jìn)入docker_nginx容器,嘗試用后端的容器名進(jìn)行通信
curl http://djangoenv:8888/index.html
3、修改nginx配置文件,對server塊內(nèi)容進(jìn)行修改
location ~/(api/|jira/){
proxy_pass http://djangoenv:8888;
}
重啟nginx服務(wù),接口依舊不會報錯,
docker restart docker_nginx
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Docker+selenium實(shí)現(xiàn)自動化健康報備的方法
這篇文章主要介紹了Docker+selenium實(shí)現(xiàn)自動化健康報備的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
Docker-Compose搭建Spark集群的實(shí)現(xiàn)方法
本文主要介紹了Docker-Compose搭建Spark集群的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
Docker基于現(xiàn)有鏡像構(gòu)建新鏡像的實(shí)現(xiàn)方法
這篇文章主要介紹了Docker基于現(xiàn)有鏡像構(gòu)建新鏡像的實(shí)現(xiàn)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12
Docker部署verdaccio搭建npm私服的實(shí)現(xiàn)
本女王主要介紹了Docker部署verdaccio搭建npm私服的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02

