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中pycurl库的用法实例
Sep 30 Python
将Python代码打包为jar软件的简单方法
Aug 04 Python
Python2.7简单连接与操作MySQL的方法
Apr 27 Python
python遍历 truple list dictionary的几种方法总结
Sep 11 Python
Python实现多进程共享数据的方法分析
Dec 04 Python
Python深度优先算法生成迷宫
Jan 22 Python
PYTHON基础-时间日期处理小结
May 05 Python
python pickle存储、读取大数据量列表、字典数据的方法
Jul 07 Python
Python Selenium参数配置方法解析
Jan 19 Python
将keras的h5模型转换为tensorflow的pb模型操作
May 25 Python
教你如何用Python实现人脸识别(含源代码)
Jun 23 Python
68行Python代码实现带难度升级的贪吃蛇
Jan 18 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读取XML值的代码(推荐)
2011/01/01 PHP
codeigniter教程之上传视频并使用ffmpeg转flv示例
2014/02/13 PHP
Yii2 GridView实现列表页直接修改数据的方法
2016/05/16 PHP
PHP文件操作详解
2016/12/30 PHP
Google韩国首页图标动画效果
2007/08/26 Javascript
javascript脚本调试方法小结
2008/11/24 Javascript
使用iframe window的scroll方法控制iframe页面滚动
2014/03/05 Javascript
全面详细的jQuery常见开发技巧手册
2016/02/21 Javascript
Bootstrap页面布局基础知识全面解析
2016/06/13 Javascript
XMLHttpRequest Level 2 使用指南
2016/08/26 Javascript
vue中页面跳转拦截器的实现方法
2017/08/23 Javascript
Vue-Router2.X多种路由实现方式总结
2018/02/09 Javascript
Vue动态控制input的disabled属性的方法
2018/06/26 Javascript
详解如何使用微信小程序云函数发送短信验证码
2019/03/13 Javascript
基于Vue+elementUI实现动态表单的校验功能(根据条件动态切换校验格式)
2019/04/04 Javascript
使用Vue中 v-for循环列表控制按钮隐藏显示功能
2019/04/23 Javascript
vue 解决computed修改data数据的问题
2019/11/06 Javascript
Vue监听滚动实现锚点定位(双向)示例
2019/11/13 Javascript
javaScript中indexOf用法技巧
2019/11/26 Javascript
[50:01]Ti4 冒泡赛第二天 NEWBEE vs Titan
2014/07/15 DOTA
玩转python爬虫之URLError异常处理
2016/02/17 Python
python3中int(整型)的使用教程
2017/03/23 Python
python使用Paramiko模块实现远程文件拷贝
2019/04/30 Python
python程序 线程队列queue使用方法解析
2019/09/23 Python
纯CSS3实现自定义Tooltip边框涂鸦风格的教程
2014/11/05 HTML / CSS
编写一子程序,将一链表倒序,即使链表表尾变表头,表头变表尾
2016/02/10 面试题
终端业务员岗位职责
2013/11/27 职场文书
计算机专业推荐信范文
2013/11/27 职场文书
电工工作职责范本
2014/02/22 职场文书
企业法人代表任命书
2014/06/06 职场文书
学习考察心得体会
2014/09/04 职场文书
老人节标语大全
2014/10/08 职场文书
2015年中个人总结范文
2015/03/10 职场文书
体育委员竞选稿
2015/11/21 职场文书
MySQL数据库 任意ip连接方法
2022/05/20 MySQL
MySQL控制流函数(-if ,elseif,else,case...when)
2022/07/07 MySQL