Docker如何部署Python項(xiàng)目的實(shí)現(xiàn)詳解
Docker 是一個開源項(xiàng)目,為開發(fā)人員和系統(tǒng)管理員提供了一個開放平臺,可以將應(yīng)用程序構(gòu)建、打包為一個輕量級容器,并在任何地方運(yùn)行。Docker 會在軟件容器中自動部署應(yīng)用程序。
在本篇中,我將介紹如何 docker 化一個 Python Django 應(yīng)用程序,然后使用一個 docker-compose 腳本將應(yīng)用程序作為容器部署到 docker 環(huán)境。
環(huán)境
操作系統(tǒng)
dbnuo@localhost ~ sw_vers ProductName: Mac OS X ProductVersion: 10.15.3 BuildVersion: 19D76 dbnuo@localhost ~ uname -v Darwin Kernel Version 19.3.0: Thu Jan 9 20:58:23 PST 2020; root:xnu-6153.81.5~1/RELEASE_X86_64
Docker 版本
dbnuo@localhost ~ docker -v Docker version 19.03.8, build afacb8b
Docker Compose 版本
dbnuo@localhost ~ docker-compose -v docker-compose version 1.25.4, build 8d51620a
目錄結(jié)構(gòu)
這里列出本次用到的相關(guān)文件和目錄,以下會介紹每個文件目錄的作用和內(nèi)容。
. ├── bash.alias ├── docker-compose.yml ├── .env ├── services │ └── python │ │ ├── Dockerfile │ │ └── requirements.txt └── www └── python
- bash.alias:用以記錄本地終端的命令。
- docker-compose.yml:容器配置文件。
- .env:環(huán)境變量設(shè)置文件。
- services/python/Dockerfile:鏡像構(gòu)建文件。
- services/python/requirements.txt:依賴包管理文件。
- www/python:項(xiàng)目/代碼存放目錄。
構(gòu)建部署
設(shè)置環(huán)境變量
打開 .env 文件,添加以下內(nèi)容:
# # python # PYTHON_VERSION=3.8.2 PYTHON_PORT=9100
- PYTHON_VERSION:用以設(shè)置 Python Tags,可以在 Docker Hub 上查看所有 Tags。
- PYTHON_PORT:本地映射容器端口的端口。
構(gòu)建鏡像
打開 services/python/Dockerfile 文件,添加以下內(nèi)容:
ARG PYTHON_VERSION FROM python:${PYTHON_VERSION} AS python-base ENV LANG C.UTF-8 ENV LC_ALL C.UTF-8 ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONFAULTHANDLER 1 FROM python-base AS python-deps WORKDIR /code RUN apt-get update \ && apt-get -y install freetds-dev \ && apt-get -y install unixodbc-dev COPY requirements.txt ./ RUN pip install -r requirements.txt -i https://pypi.douban.com/simple
我描述下每個部分:
首先,指定要在其上構(gòu)建鏡像的 Python 鏡像。這是由 Docker 組織提供的官方鏡像,該 Python 鏡像版本由環(huán)境變量 PYTHON_VERSION 設(shè)置。我們?yōu)樵撶R像命名 python-base,它將在下個階段使用到:
ARG PYTHON_VERSION FROM python:${PYTHON_VERSION} AS python-base
接下來,設(shè)置環(huán)境變量以正確設(shè)置語言環(huán)境,阻止Python生成 .pyc 文件,并在 segfaults 上啟用 Python 追溯:
ENV LANG C.UTF-8 ENV LC_ALL C.UTF-8 ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONFAULTHANDLER 1
最后,使用 python-base 鏡像開始新的構(gòu)建階段。我們將在 python-deps 映像中安裝所有 Python 依賴項(xiàng):
FROM python-base AS python-deps WORKDIR /code RUN apt-get update \ && apt-get -y install freetds-dev \ && apt-get -y install unixodbc-dev COPY requirements.txt ./ RUN pip install -r requirements.txt -i https://pypi.douban.com/simple
依賴包管理
打開 services/python/requirements.txt 文件,添加項(xiàng)目需要的依賴。示例:
Django==3.0.4 djangorestframework==3.11.0 pyDes==2.0.1 PyMySQL==0.9.3 redis==3.4.1 requests==2.23.0 pyodbc==4.0.30 paramiko==2.7.1 psutil==5.7.0
容器配置
打開 docker-compose.yml 文件,配置容器:
version: "3" services: python: build: context: ./services/python args: PYTHON_VERSION: ${PYTHON_VERSION} command: python3 /code/HelloWorld/manage.py runserver 0.0.0.0:8000 # command: # - /bin/sh # - -c # - | # django-admin startproject HelloWorld # python3 /code/HelloWorld/manage.py runserver 0.0.0.0:8000 container_name: python hostname: python volumes: - ${SOURCE_DIR}/python:/code:rw expose: - "8000" ports: - "${PYTHON_PORT}:8000" privileged: true restart: always networks: - default networks: default:
有關(guān) Docker Compose 的詳細(xì)介紹,大家可以查閱官方文檔。
這里主要說明下 command ,這是配置在容器啟動后執(zhí)行的命令,類似 Dockerfile 的 CMD。
配置中又兩個 command,其中一個注釋了,二者只能使用一個。第一個是單條命令的配置方式,下面的是多條命令的配置方式。視個人情況修改其中命令和路徑(初次測試,建議使用下面的 command ,會自動初始化一個 HelloWorld 項(xiàng)目并啟動)。
啟動容器
在文件根目錄下運(yùn)行命令:
docker-compose up -d
運(yùn)行該命令會自動構(gòu)建鏡像并啟動容器,執(zhí)行完畢后:
查看鏡像:
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE dnmp_python latest 7218552b8814 17 hours ago 1.02GB python 3.8.2 f88b2f81f83a 3 weeks ago 933MB
查看容器:
docker-compose ps -a
Name Command State Ports ------------------------------------------------------------------------------------------------- python python3 /code/HelloWorld/m ... Up 0.0.0.0:9100->8000/tcp
State 狀態(tài)為 Up 說明啟動成功。
打開瀏覽器訪問試一試:
運(yùn)行成功。這里列幾個常用的命令:
啟動容器:docker-compose start python
停止容器:docker-compose stop python
重啟容器:docker-compose restart python
刪除容器:docker-compose && docker-compose rm python
查看日志:docker logs python
Host 使用 Python 命令
終端命令都會記錄在文件 bash.alias 中。
這里說下如何在本地使用 python 命令:
打開 ~/.bashrc (如果是 zsh 客戶端的使用 ~/.zshrc)
添加以下代碼至文件:
python () { tty= tty -s && tty=--tty docker run \ $tty \ --interactive \ --rm \ --volume $PWD:/code:rw \ --workdir /code \ dnmp_python python "$@" }
刷新配置文件,使之生效:source ~/.bashrc(如果是 zsh 客戶端的使用 source ~/.zshrc)
這時候在本地即可使用 python 命令了,試一下:
dbnuo@localhost ~ python -V Python 3.8.2
完整的示例,可以查看我的 GitHub 項(xiàng)目:BNDong/dnmp
到此這篇關(guān)于Docker如何部署Python項(xiàng)目的實(shí)現(xiàn)詳解的文章就介紹到這了,更多相關(guān)Docker部署Python項(xiàng)目內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)的ini文件操作類分享
這篇文章主要介紹了Python實(shí)現(xiàn)的ini文件操作類分享,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2014-11-11Python實(shí)現(xiàn)LSTM學(xué)習(xí)的三維軌跡
這篇文章主要為大家詳細(xì)介紹了如何使用LSTM來學(xué)習(xí)和預(yù)測三維軌跡,并提供詳細(xì)的Python實(shí)現(xiàn)示例,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-12-12Python機(jī)器學(xué)習(xí)應(yīng)用之基于線性判別模型的分類篇詳解
線性判別分析(Linear?Discriminant?Analysis,?LDA)是一種監(jiān)督學(xué)習(xí)的降維方法,也就是說數(shù)據(jù)集的每個樣本是有類別輸出。和之前介紹的機(jī)器學(xué)習(xí)降維之主成分分析(PCA)方法不同,PCA是不考慮樣本類別輸出的無監(jiān)督學(xué)習(xí)方法2022-01-01python manage.py runserver流程解析
這篇文章主要介紹了python manage.py runserver流程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11Python 實(shí)現(xiàn)異步調(diào)用函數(shù)的示例講解
今天小編就為大家分享一篇Python 實(shí)現(xiàn)異步調(diào)用函數(shù)的示例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10python 實(shí)現(xiàn)批量替換文本中的某部分內(nèi)容
今天小編就為大家分享一篇python 實(shí)現(xiàn)批量替換文本中的某部分內(nèi)容,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12