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

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-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项目内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 在Docker上部署Python的Flask框架的教程

    本文中,我将尝试展示用Docker开发python应用(主要是Web应用)的可行方法.虽然我本人专注于Python的Flask微框架,但本文目的是演示如何通过Docker更好地开发和共享应用程序,(由任何语言和框架开发的应用程序).Docker通过封装依赖项,大大减少了开发环境和正式产品的差距. 大多数Python开发人员在开发中使用virtualenv.它提供了一种易用的机制让应用程序使用自己专用的依赖项,这些依赖项可能与在其它应用程序或操作系统存在冲突(尤其是不同的Pyhton版本,还有不同

  • 使用Docker搭建Django,Nginx,R,Python部署环境的方法

    本文介绍了使用Docker搭建Django,Nginx,R,Python部署环境的方法,分享给大家,具体如下: 基本环境: Ubuntu 16.10 docker 17.06.0-ce 压缩自己的项目文件 1.这里需要注意的是,在压缩的时候,也需要把自己的需要的Python包写在requirement.txt,这样搭建环境的时候才会知道你需要什么包,才能一起安装,我的项目的requirement.txt 内容如下. Django==1.10.5 rpy2==2.8.5 PyMySQL==0.7.

  • Docker部署Python爬虫项目的方法步骤

    1) 首先安装docker: # 用 yum 安装并启动 yum install docker -y && systemctl start docker 2) 下载自定义镜像需要用到的基础镜像: # 这里以centos7为例 docker pull centos:centos7 3) 基础镜像已经准备好了,接下来准备好需要部署的环境服务,以及python项目: ### 创建 dockerfile 文件 mkdir dockerfile && cd dockerfile ##

  • 在Docker上开始部署Python应用的教程

    几周前, Elastic Beanstalk声明在AWS云中配置和管理Docker容器.在本文中,我们通过一个简单的注册表单页面应用去理解Docker部署过程,该表单使用Elastic Beanstalk Python环境. 关于注册表单应用 几个月之前,我们就已经开发完这个应用并且发表在博客上.有4部分视频和一篇文章"Using DynamoDB and SNS with Elastic Beanstalk in any Supported AWS Region".今天,我们将在这部

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

    Docker 是一个开源项目,为开发人员和系统管理员提供了一个开放平台,可以将应用程序构建.打包为一个轻量级容器,并在任何地方运行.Docker 会在软件容器中自动部署应用程序. 在本篇中,我将介绍如何 docker 化一个 Python Django 应用程序,然后使用一个 docker-compose 脚本将应用程序作为容器部署到 docker 环境. 环境 操作系统 dbnuo@localhost ~ sw_vers ProductName: Mac OS X ProductVersion

  • IDEA通过Docker插件部署SpringBoot项目的过程详解

    1.配置Docker远程连接端口 找到并编辑服务器上的docker.service文件. vi /usr/lib/systemd/system/docker.service 如下图所示的地方,添加: -H tcp://0.0.0.0:2375 2.重启Docker systemctl daemon-reload service docker restart 3.服务器开放端口 我用的阿里云服务器,在安全组的配置规则,开放端口. 4.测试远程连接是否正常 curl http://localhost

  • docker中部署golang项目的步骤详解

    理解Docker Docker可以帮您为自己的应用程序创建一个单一的可部署"单位".这样的单位也叫做容器,其中包含了应用程序需要的一切.例如代码(或二进制文件).运行时.系统工具,以及系统库文件.将所有这些需要的内容打包为一个单一的单位,可确保无论将应用程序部署在何处,都能提供完全相同的环境.这种技术还可以帮您维持完全一致的开发和生产环境,通常这些环境是很难被追踪的. 一旦搭建完成,容器的创建和部署将可自动进行.这本身就可以避免一系列问题.这些问题中大部分都是因为文件不同步,或开发和生

  • pypy提升python项目性能使用详解

    目录 一.PyPy介绍 二.PyPy安装 三.PyPy和Python测试对比 四.PyPy注意事项 一.PyPy介绍 PyPy是用Python实现的Python解释器的动态编译器,是Armin Rigo开发的产品,能够提升我们python项目的运行速度.PyPy 是利用即时编译的 Python 的替代实现. 背后的原理是 PyPy 开始时就像一个解释器,直接从源文件运行我们的 Python 代码.但是,PyPy 不是逐行运行代码,而是在执行它们之前将部分代码编译为机器代码. 根据官方文档的介绍可

  • 在云虚拟主机部署thinkphp5项目的步骤详解

    前言 Thinkphp作为开源的PHP框架发展到今天,无疑是国内最适合PHP学员学习和使用的框架,除了简单容易上手,更大的优点是开发文档完善.插件丰富.本文将给大家详细介绍关于在在云虚拟主机部署thinkphp5项目的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 查阅ThinkPHP5.0完全开发手册->部署->虚拟主机环境,了解情況后,开始修改. 环境 thinkphp 5.0.11 阿里云云虚拟系统CentOS 第一步 修改移动入口文件位置,把它移动到根目录下

  • Python即时网络爬虫项目启动说明详解

    作为酷爱编程的老程序员,实在按耐不下这个冲动,Python真的是太火了,不断撩拨我的心. 我是对Python存有戒备之心的,想当年我基于Drupal做的系统,使用php语言,当语言升级了,推翻了老版本很多东西,不得不花费很多时间和精力去移植和升级,至今还有一些隐藏在某处的代码埋着雷.我估计Python也避免不了这个问题(其实这种声音已经不少,比如Python 3 正在毁灭 Python). 但是,我还是启动了这个Python即时网络爬虫项目.我用C++.Java和Javascript编写爬虫相关

  • Vue项目webpack打包部署到服务器的实例详解

    Vue项目webpack打包部署到服务器 这篇博文主要说的就是我今天遇到的问题,而且在经过我的询问,好多人在打包部署的时候都遇到了一些问题,下面就来说下,如何将Vue项目放置在服务器上,这里以Tomcat为例. 必须要配置的就是/config/index.js 在vue-cli webpack的模板下的/config/index.js,我们可以看到assetsPublicPath这个键,并且这个东西还出现了两次,我第一次打包的时候,只是修改了最下面的assetsPublicPath,将它从'/'

  • vue项目打包部署_nginx代理访问方法详解

    我又来了,今天部署了下vue项目,使用nginx做了代理,这样可以解决跨域的问题,这里做一个简单讲解. 1.先看vue项目打包(我这里使用的是vscode开发工具) 这里是我的项目结构: 打包之前需要修改如下配置文件: 配置文件一:build>>utils.js (修改publicPath:"../../" , 这样写是处理打包后找不到静态文件的问题) 配置文件二:config>>index.js(修改assetsPublicPath:'./' ,修改目的是为了

  • 基于Docker镜像部署go项目的方法步骤

    依赖知识 Go交叉编译基础 Docker基础 Dockerfile自定义镜像基础 docker-compose编排文件编写基础 当然,一点也不会也可以按照这个步骤部署完成,不过可能中间如果出点小问题,会不知道怎么解决,当然你也可以留言. 我是在mac环境上开发测试的,如果你是在windows上可能有一点出入,但应该不会有啥大问题. 一.依赖环境 Docker 二.编写一个GoLang web程序 我这里就写一个最简单的hello world程序吧,监听端口是80端口. 新建一个main.go文件

  • golang项目如何上线部署到Linu服务器(方法详解)

    Go作为Google2009年推出的语言,其被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言. 对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率.它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了. 到现在Go的开发已经是完全开放的,并且拥有一个活跃的社区. 下面看下golang项目如何上线部署到Linu服务器上. windows服务器 先本地编译 go build main.go 编译后会在同级目录生成可执行文件

随机推荐