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

作者:BNDong 时间:2022-01-16 07:30:31 

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

来源:https://www.cnblogs.com/bndong/p/12530507.html

标签:Docker,部署,Python
0
投稿

猜你喜欢

  • Python卸载模块的方法汇总

    2022-03-14 16:50:21
  • 动态给表添加删除字段并同时修改它的插入更新存储过程

    2011-12-01 10:18:28
  • Python cookbook(数据结构与算法)通过公共键对字典列表排序算法示例

    2021-07-23 01:24:36
  • 让JavaScript拯救HTML5的离线存储[译]

    2009-05-15 12:26:00
  • 理解Python中的With语句

    2023-02-09 17:22:33
  • django基础学习之send_mail功能

    2023-04-01 00:16:53
  • python动态加载变量示例分享

    2022-10-23 18:57:50
  • 如何实现网上站点维护?

    2010-05-24 18:35:00
  • Django如何使用redis作为缓存

    2022-12-30 19:19:20
  • python字符串判断密码强弱

    2021-05-09 04:20:04
  • matplotlib 对坐标的控制,加图例注释的操作

    2021-06-12 16:28:46
  • 由prototype_1.3.1进入javascript殿堂-类的初探

    2008-05-22 12:44:00
  • 基于Python实现的扫雷游戏实例代码

    2023-06-26 12:29:34
  • Pygame鼠标进行图片的移动与缩放案例详解

    2023-08-12 15:18:58
  • Python3实现打格点算法的GPU加速实例详解

    2022-05-26 23:20:30
  • 一个css垂直水平居中布局,css效果

    2008-11-03 11:40:00
  • aspjpeg 添加水印教程及生成缩略图教程

    2011-04-04 11:04:00
  • python2.7读取文件夹下所有文件名称及内容的方法

    2023-12-16 03:27:07
  • PyTorch CUDA环境配置及安装的步骤(图文教程)

    2022-06-19 14:00:28
  • 最简洁的SQL多重查询的解决方案

    2005-09-12 16:31:00
  • asp之家 网络编程 m.aspxhome.com