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 过滤字符串的技巧,map与itertools.imap
Sep 06 Python
跟老齐学Python之有容乃大的list(3)
Sep 15 Python
Python实现的数据结构与算法之链表详解
Apr 22 Python
python通过openpyxl生成Excel文件的方法
May 12 Python
python变量不能以数字打头详解
Jul 06 Python
利用python实现命令行有道词典的方法示例
Jan 31 Python
python简单线程和协程学习心得(分享)
Jun 14 Python
用python标准库difflib比较两份文件的异同详解
Nov 16 Python
PYTHON实现SIGN签名的过程解析
Oct 28 Python
解决Python Matplotlib绘图数据点位置错乱问题
May 16 Python
Python中的面向接口编程示例详解
Jan 17 Python
python 如何用urllib与服务端交互(发送和接收数据)
Mar 04 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
咖啡店都有些什么常规豆子呢?有什么风味在里面
2021/03/04 咖啡文化
PHP用PDO如何封装简单易用的DB类详解
2017/07/30 PHP
PHP实现 APP端微信支付功能
2018/06/22 PHP
Laravel用户授权系统的使用方法示例
2018/09/16 PHP
PHP PDOStatement::errorInfo讲解
2019/01/31 PHP
document.all与WEB标准
2020/05/13 Javascript
javascript 设置某DIV区域内的checkbox复选框
2009/11/30 Javascript
Js 刷新框架页的代码
2010/04/13 Javascript
innerText和textContent对比及使用介绍
2013/02/27 Javascript
细说javascript函数从函数的构成开始
2013/08/29 Javascript
利用javascript打开模态对话框(示例代码)
2014/01/11 Javascript
javascript实现密码验证
2015/11/10 Javascript
Node.js+Express配置入门教程
2016/05/19 Javascript
利用jQuery实现CheckBox全选/全不选/反选的简单代码
2016/05/31 Javascript
servlet+jquery实现文件上传进度条示例代码
2017/01/25 Javascript
详解HTTPS 的原理和 NodeJS 的实现
2017/07/04 NodeJs
JS复杂判断的更优雅写法代码详解
2018/11/07 Javascript
JS实现的获取银行卡号归属地及银行卡类型操作示例
2019/01/08 Javascript
koa2 用户注册、登录校验与加盐加密的实现方法
2019/07/22 Javascript
[00:48]完美“圣”典2016风云人物:xiao8宣传片
2016/11/30 DOTA
[04:09]2018年度DOTA2社区贡献奖-完美盛典
2018/12/16 DOTA
Python处理JSON时的值报错及编码报错的两则解决实录
2016/06/26 Python
Python 基础知识之字符串处理
2017/01/06 Python
python回调函数中使用多线程的方法
2017/12/25 Python
浅谈Tensorflow模型的保存与恢复加载
2018/04/26 Python
python中dir()与__dict__属性的区别浅析
2018/12/10 Python
python3实现弹弹球小游戏
2019/11/25 Python
Pytho爬虫中Requests设置请求头Headers的方法
2020/09/22 Python
python 实现一个图形界面的汇率计算器
2020/11/09 Python
Original Penguin美国官网:布拉德皮特、强尼德普喜爱的服装品牌
2016/10/25 全球购物
Clearly新西兰:购买眼镜、太阳镜和隐形眼镜
2018/04/26 全球购物
线程同步的方法
2016/11/23 面试题
2014年政教处工作总结
2014/12/20 职场文书
党员公开承诺书2015
2015/01/21 职场文书
社区文明创建工作总结2015
2015/04/21 职场文书
MySQL创建表操作命令分享
2022/03/25 MySQL