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应用
1. 简介 Docker是目前主流IT公司广泛接受和使用的,用于构建.管理和保护它们应用程序的工具. 容器,例如Docker允许开发人员在单个操作系统上隔离和运行多个应用程序,而不是为服务器上的每个应 ...
- spring boot本地开发与docker容器化部署的差异
spring boot本地开发与docker容器化部署的差异: 1. 文件路径及文件名区别大小写: 本地开发环境为windows操作系统,是忽略大小写的,但容器中区分大小写 2. docker中的容器 ...
- Gogs的Docker容器化部署流程遇到的问题
Gogs的Docker容器化部署流程遇到的问题 最近在学习CI/CD的一些方案,个人比较青睐容器化轻量级.CI方面一开始是想使用gitlab的,但是发现我自己买的服务器配置太低,内存根本不够(大写 ...
- Docker 容器化部署1小时简单入门
Docker简介 Docker是DotCloud开源的.可以将任何应用包装在Linux container中运行的工具.2013年3月发布首个版本,当前最新版本为1.3.Docker基于Go语言开发, ...
- ASP.NET Core 实战:使用 Docker 容器化部署 ASP.NET Core + MySQL + Nginx
一.前言 在之前的文章(ASP.NET Core 实战:Linux 小白的 .NET Core 部署之路)中,我介绍了如何在 Linux 环境中安装 .NET Core SDK / .NET Core ...
- network_node:host解决Docker容器化部署微服务出现的Dobbo通信问题
在Docker中,有时候出现 ports: - 20880:20880 Dobbo通信出现问题. 此时应该改成 network_node:host 注释 ports!
- docker容器化python服务部署(supervisor-gunicorn-flask)
docker容器化python服务部署(supervisor-gunicorn-flask) 本文系作者原创,转载请注明出处: https://www.cnblogs.com/further-furt ...
- 通过 Azure Pipelines 实现持续集成之docker容器化及自动化部署
通过 Azure Pipelines 实现持续集成之docker容器化及自动化部署 Intro Azure DevOps Pipeline 现在对于公开的项目完全免费,这对于开源项目来讲无疑是个巨大的 ...
- Azure Devops实践(5)- 构建springboot项目打包docker镜像及容器化部署
使用Azure Devops构建java springboot项目,创建镜像并容器化部署 1.创建一个springboot项目,我用现有的项目 目录结构如下,使用provider项目 在根目录下添加D ...
随机推荐
- nova start 虚机的代码流程分析
nova start 虚机的代码流程分析,以ocata版本为分析基础1.nova api服务接受用户下发的 nova start启动虚机请求其对应的http restfull api接口为post / ...
- Vue的数据响应式
getter和setter怎么用 示例代码 getter ,关键词为 get ,用于获取一个值.定义时为函数,但是使用时不用加括号. setter 用于对数据的改写 Object.defineProp ...
- 使用 Python破解大众点评字体加密(SVG反扒)
前言 大众点评拥有大量高质量评论信息.种草信息,同时也有非常严格的反扒机制. 今天我们一起使用 Python破解大众点评字体加密,获取极具商业价值的信息. 本文知识点: requests 的使用 xp ...
- 前端ES6 一些面试题
1.ES5.ES6和ES2015有什么区别? ES2015特指在2015年发布的新一代JS语言标准,ES6泛指下一代JS语言标准,包含ES2015.ES2016.ES2017.ES2018等.现阶段在 ...
- 【小白学PyTorch】1 搭建一个超简单的网络
文章目录: 目录 1 任务 2 实现思路 3 实现过程 3.1 引入必要库 3.2 创建训练集 3.3 搭建网络 3.4 设置优化器 3.5 训练网络 3.6 测试 1 任务 首先说下我们要搭建的网络 ...
- Log4Net + Log4Mongo 将日志记录到MongoDb中
实现: 将日志保存在MongoDb中: 自定义日志字段: 日志按照日期拆分集合: 第一部分:将日志保存在MongoDb中 新建控制台程序Log4MongoDemo 通过NuGet安装Log4Net ( ...
- vs2015创建项目没法选择.net2.0的问题
今天要修护一个net2.0开发的程序bug,只修改了一行代码,发布到测试系统,结果程序奔溃了,吓出一身汗. 因为是直接崩溃,所以第一个想到的就是.net版本错了.一查看,果实是,项目属性里目标框架是4 ...
- php 循环里面套sql怎么解决
功能要求: 企业列表(展示企业的基本信息,这里只获取了名称.logo.和服务类型), 服务类型说明: 服务类型一共3级,1.2级是必填的,3级是非必填,如果填的话最多3个, 服务类型1.2.3保存在一 ...
- 安装Android Studio之后无法直接打开SDK Manager
之前安装的android studio之后,SDK Manager和AVD Manager两个运行程序双击都打不开页面了,之前都是正常的,所以java环境变量的问题是不存在的. SDK Manager ...
- wxWidgets教程
https://www.wxwidgets.org/docs/tutorials/ http://zetcode.com/gui/wxwidgets/ https://docs.wxwidgets.o ...