目標(biāo):
1、 將Django項(xiàng)目部署到docker上募疮,相關(guān)數(shù)據(jù)掛載于宿主機(jī)上;
2裂七、使用django-crontab定時模塊域庇,確保定時模塊正常啟動;
我的django項(xiàng)目結(jié)構(gòu)(普普通通闻葵,沒有重點(diǎn))
mysite/
|-- mysite
| |-- __init__.py
| |-- settings.py
| |-- urls.py
| |-- views.py
| `-- wsgi.py
`-- manage.py
1理朋、生成項(xiàng)目使用的第三方庫文件requirements.txt
在django項(xiàng)目的虛擬環(huán)境里拉岁,通過下面命令導(dǎo)出項(xiàng)目的第三方庫依賴包名稱
pip freeze > requirements.txt
此外,由于我的爬蟲項(xiàng)目需要走socks5代理(window電腦上的V2ray代理)驶乾,因此還需要在requirements.txt文件中加入庫名pysocks
,最終requirements.txt文件內(nèi)容如下:
asgiref==3.3.1
certifi==2020.11.8
chardet==3.0.4
Django==3.1.3
django-crontab==0.7.1
et-xmlfile==1.0.1
idna==2.10
jdcal==1.4.1
lxml==4.6.2
PyMySQL==0.10.1
pytz==2020.4
requests==2.25.0
sqlparse==0.4.1
urllib3==1.26.2
pysocks
2循签、 準(zhǔn)備Dockerfile 鏡像構(gòu)建文件级乐,創(chuàng)建名字Dockerfile的文件,內(nèi)容如下(各命令作用已注釋)
# 環(huán)境python:3.8.6
FROM python:3.8.6
#MAINTAINER 維護(hù)者信息
MAINTAINER 孫思鍇
# 啟動python環(huán)境緩存县匠,可以將print等輸出到控制臺
ENV PYTHONUNBUFFERED 1
# 復(fù)制 第三方庫依賴名稱文件到環(huán)境
COPY requirements.txt /
# 設(shè)置時區(qū)风科; # 修改apt源為阿里 # 更新apt源 # 安裝cron服務(wù)(用于定時任務(wù))
# 刪除軟件包(減少包鏡像體積) # 清理apt緩存 # 安裝python第三方庫
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& sed -i s@/deb.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list \
&& apt-get update \
&& apt-get install -y --no-install-recommends cron \
# && apt-get -y install vim \
&& rm -rf /var/lib/apt/lists/* \
&& apt-get clean \
&& pip install -r /requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/
# 暴露8000端口
EXPOSE 8000
# 先啟動cron服務(wù)(項(xiàng)目用到了django-crontab的定時任務(wù),其需要linux的cron服務(wù)來支持)聚唐;再將定時任務(wù)啟動(django-crontab語法要求)丐重,最后再啟動django工程。
CMD sh -c '/etc/init.d/cron start && python /mysite/manage.py crontab add && python /mysite/manage.py runserver 0.0.0.0:8000'
3杆查、 開始構(gòu)建鏡像
Dockerfile文件扮惦、requirements.txt 文件放在同一個目錄下,在該目錄下打開命令行窗口亲桦,執(zhí)行以下命令崖蜜,生成鏡像文件
docker build -t mysite:4.0 .
鏡像名稱mysite,版本4.0客峭,不要漏掉命令最后面一點(diǎn)
4豫领、創(chuàng)建容器
docker run -d --name mysite4 -p 8001:8000 --restart=on-failure:3 -v E:\DockerHouse\Django\mysite:/mysite -w /mysite mysite:4.0
上面命令解釋如下:
-d 后臺運(yùn)行容器,如果需要進(jìn)入容器舔琅,則使用-it命令
--name mysite4 容器命名mysite4
-p 8001:8000 將容器的8000端口映射到主機(jī)8001端口
--restart=on-failure:3 非正常關(guān)閉容器重啟次數(shù)為3等恐,防止宿主機(jī)意外關(guān)閉
-v E:\DockerHouse\Django\mysite:/mysite 文件掛載,/mysite位置是Django項(xiàng)目
-w /mysite 指定工作目錄备蚓,下次進(jìn)入容器才不用頻繁切換目錄
至此课蔬,容器創(chuàng)建完畢,容器啟動后先啟動cron服務(wù)郊尝,再將django項(xiàng)目的定時任務(wù)添加到cron二跋,最后才會啟動django項(xiàng)目。
5流昏、補(bǔ)充
1扎即、 步驟4創(chuàng)建容器后,由于我們設(shè)置的是容器在后臺靜默運(yùn)行况凉,如果需要進(jìn)入容器內(nèi)谚鄙,可使用命令: docker exec -it mysite4 bash
2、 mysite4容器啟動后刁绒,django-crontab的定時任務(wù)不會立即啟動襟锐,因?yàn)槠浔举|(zhì)是將任務(wù)交給了linux的cron服務(wù),所以至少要過 1膛锭、2 分鐘后任務(wù)才會被調(diào)用粮坞,如果需要立馬執(zhí)行任務(wù),可以重啟 cron服務(wù)初狰。
django-crontab模塊命令如下:
python manage.py crontab add # 將任務(wù)添加并生效
python manage.py crontab show # 顯示當(dāng)前的定時任務(wù)
python manage.py crontab remove # 刪除所有定時任務(wù)
補(bǔ)充:django-crontab定時模塊莫杈,需要使用 add 命令才能將任務(wù)添加到cron并生效。
前面構(gòu)建Dockerfile文件時奢入,已設(shè)置了容器啟動執(zhí)行add命令筝闹,后面就不再執(zhí)行add命令。
linux上的cron服務(wù)命令:
查看狀態(tài): /etc/init.d/cron status
啟動: /etc/init.d/cron start
關(guān)閉: /etc/init.d/cron stop
重啟: /etc/init.d/cron restart
重新載入配置: /etc/init.d/cron reload
列出目前的任務(wù)表: crontab -l
刪除目前的任務(wù)表: crontab -r
2腥光、可使用命令date
查看容器使用的時區(qū)(確保定時任務(wù)不會跑偏)
3关顷、window 檢測被占用的端口
netsh interface ipv4 show excludedportrange protocol=tcp
4、查看容器的代理配置
set | grep -i all_proxy # 查看代理配置
unset all_proxy # 關(guān)閉代理配置
curl http://pv.sohu.com/cityjson?ie=utf-8 # 查看當(dāng)前ip的地理位置(搜狐接口)
5武福、遇到報錯(已解決)
requests.exceptions.InvalidSchema: Missing dependencies for SOCKS support.
requests不支持SOCKS代理 议双,安裝依賴庫即可 pip install pysocks