Docker如何部署Python项目的实现详解


Posted in Python onOctober 26, 2020

Docker 是一个开源项目,为开发人员和系统管理员提供了一个开放平台,可以将应用程序构建、打包为一个轻量级容器,并在任何地方运行。Docker 会在软件容器中自动部署应用程序。

在本篇中,我将介绍如何 docker 化一个 Python Django 应用程序,然后使用一个 docker-compose 脚本将应用程序作为容器部署到 docker 环境。

环境

操作系统

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

目录结构

这里列出本次用到的相关文件和目录,以下会介绍每个文件目录的作用和内容。

.
├── bash.alias
├── docker-compose.yml
├── .env
├── services
│  └── python
│  │  ├── Dockerfile
│  │  └── requirements.txt
└── www
  └── python
  • bash.alias:用以记录本地终端的命令。
  • docker-compose.yml:容器配置文件。
  • .env:环境变量设置文件。
  • services/python/Dockerfile:镜像构建文件。
  • services/python/requirements.txt:依赖包管理文件。
  • www/python:项目/代码存放目录。

构建部署

设置环境变量

打开 .env 文件,添加以下内容:

#
# python
#
PYTHON_VERSION=3.8.2
PYTHON_PORT=9100
  • PYTHON_VERSION:用以设置 Python Tags,可以在 Docker Hub 上查看所有 Tags。
  • PYTHON_PORT:本地映射容器端口的端口。

构建镜像

打开 services/python/Dockerfile 文件,添加以下内容:

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

我描述下每个部分:

首先,指定要在其上构建镜像的 Python 镜像。这是由 Docker 组织提供的官方镜像,该 Python 镜像版本由环境变量 PYTHON_VERSION 设置。我们为该镜像命名 python-base,它将在下个阶段使用到:

ARG PYTHON_VERSION
FROM python:${PYTHON_VERSION} AS python-base

接下来,设置环境变量以正确设置语言环境,阻止Python生成 .pyc 文件,并在 segfaults 上启用 Python 追溯:

ENV LANG C.UTF-8
ENV LC_ALL C.UTF-8
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONFAULTHANDLER 1

最后,使用 python-base 镜像开始新的构建阶段。我们将在 python-deps 映像中安装所有 Python 依赖项:

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 文件,添加项目需要的依赖。示例:

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:

有关 Docker Compose 的详细介绍,大家可以查阅官方文档。

这里主要说明下 command ,这是配置在容器启动后执行的命令,类似 Dockerfile 的 CMD。

配置中又两个 command,其中一个注释了,二者只能使用一个。第一个是单条命令的配置方式,下面的是多条命令的配置方式。视个人情况修改其中命令和路径(初次测试,建议使用下面的 command ,会自动初始化一个 HelloWorld 项目并启动)。

启动容器

在文件根目录下运行命令:

docker-compose up -d

运行该命令会自动构建镜像并启动容器,执行完毕后:

查看镜像:

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 状态为 Up 说明启动成功。

打开浏览器访问试一试:

Docker如何部署Python项目的实现详解

运行成功。这里列几个常用的命令:

启动容器: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 项目:BNDong/dnmp

到此这篇关于Docker如何部署Python项目的实现详解的文章就介绍到这了,更多相关Docker部署Python项目内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python中tell()方法的使用详解
May 24 Python
Python学习笔记之解析json的方法分析
Apr 21 Python
Python基于xlrd模块操作Excel的方法示例
Jun 21 Python
使用Flask集成bootstrap的方法
Jul 24 Python
解决Python下imread,imwrite不支持中文的问题
Dec 05 Python
python实现Excel文件转换为TXT文件
Apr 28 Python
python ImageDraw类实现几何图形的绘制与文字的绘制
Feb 26 Python
Python3 xml.etree.ElementTree支持的XPath语法详解
Mar 06 Python
python+adb命令实现自动刷视频脚本案例
Apr 23 Python
python和C++共享内存传输图像的示例
Oct 27 Python
Python urllib3软件包的使用说明
Nov 18 Python
python 爬取小说并下载的示例
Dec 07 Python
python Gabor滤波器讲解
Oct 26 #Python
详解基于python的图像Gabor变换及特征提取
Oct 26 #Python
多个版本的python共存时使用pip的正确做法
Oct 26 #Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
Oct 26 #Python
如何使用Pytorch搭建模型
Oct 26 #Python
使用python-cv2实现视频的分解与合成的示例代码
Oct 26 #Python
python递归函数用法详解
Oct 26 #Python
You might like
php命令行使用方法和命令行参数说明
2014/04/08 PHP
PHP获取昨天、今天及明天日期的方法
2016/02/03 PHP
aspx中利用js实现确认删除代码
2010/07/22 Javascript
Nodejs实现批量下载妹纸图
2015/05/28 NodeJs
微信小程序 wx.request(object) API详解及实例代码
2016/09/30 Javascript
vue-resource 拦截器使用详解
2017/02/21 Javascript
vue-cli如何快速构建vue项目
2017/04/26 Javascript
使用nvm和nrm优化node.js工作流的方法
2019/01/17 Javascript
微信小程序实现炫酷的弹出式菜单特效
2019/01/28 Javascript
详解JSON和JSONP劫持以及解决方法
2019/03/08 Javascript
Vee-validate 父组件获取子组件表单校验结果的实例代码
2019/05/20 Javascript
js使用文档就绪函数动态改变页面内容示例【innerHTML、innerText】
2019/11/07 Javascript
js 计算月/周的第一天和最后一天代码
2020/02/01 Javascript
解决vue项目运行提示Warnings while compiling.警告的问题
2020/09/18 Javascript
addEventListener()和removeEventListener()追加事件和删除追加事件
2020/12/04 Javascript
[40:55]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#4Newbee VS Fnatic
2016/03/03 DOTA
django ajax json的实例代码
2018/05/29 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
2020/05/17 Python
用Python实现童年贪吃蛇小游戏功能的实例代码
2020/12/07 Python
video结合canvas实现视频在线截图功能
2018/06/25 HTML / CSS
HTML5 解决苹果手机不能自动播放音乐问题
2017/12/27 HTML / CSS
Clarria化妆品官方网站:购买天然和有机化妆品系列
2018/04/08 全球购物
实习单位接收函
2014/01/11 职场文书
制药工程专业个人求职自荐信
2014/01/25 职场文书
餐饮收银员岗位职责
2014/02/07 职场文书
大学优秀班主任事迹材料
2014/05/02 职场文书
信用卡工资证明格式
2014/09/13 职场文书
大学生村官个人对照检查材料(群众路线)
2014/09/26 职场文书
代办社保委托书范文
2014/10/06 职场文书
大学生就业协议书范本(适用于公司企业)
2014/10/07 职场文书
2014年法制宣传日活动方案
2014/11/02 职场文书
税务会计岗位职责
2015/04/02 职场文书
2015年社区居委会工作总结
2015/05/18 职场文书
穷人该怎么创业?谨记以下几点
2019/07/11 职场文书
导游词之峨眉山
2019/12/16 职场文书
Mysql Online DDL的使用详解
2021/05/20 MySQL