Docker实战:Python Django应用容器化部署指南

键盘旁的猫
键盘旁的猫
发布时间:2026-10-12| 2人浏览过
原创

本文详细讲解如何将Python Django应用容器化。通过编写Dockerfile实现镜像自动化构建,解析FROM、RUN等核心指令;利用docker build命令生成镜像并运行容器,配置端口映射与卷挂载。最后介绍Docker Compose的使用,通过yml文件实现多容器集群的快速编排与自动化部署,提升开发运维效率。

一、前言

容器技术利用沙箱机制实现环境隔离,确保部署在其中的应用互不干扰且独立运行,从而显著提升安全性。本文主要演示如何将Python应用(基于Django框架)部署在Docker容器中,通过编写Dockerfile实现镜像构建的自动化,并结合Docker Compose工具进行容器编排。

二、编写Dockerfile文件

从官网下载的Python基础镜像通常较为精简,Web应用所需的依赖库需要手动安装。通过编写Dockerfile,可以在构建镜像时自动执行这些操作。具体示例如下:

FROM python:3.6.4

RUN mkdir /code \
&&apt-get update \
&&apt-get -y install freetds-dev \
&&apt-get -y install unixodbc-dev
COPY app /code 
COPY requirements.txt /code
RUN pip install -r /code/requirements.txt -i https://pypi.douban.com/simple
WORKDIR /code

CMD ["/bin/bash","run.sh"]

FROM指令是Dockerfile中至关重要的命令,用于指定构建流程的基础镜像。例如,上述示例指定python3.6.4作为基础镜像,后续所有定制操作均基于此镜像进行。若本地不存在该镜像,Docker会自动从官方仓库下载。注意,FROM必须是Dockerfile中的第一条指令。

RUN指令用于在镜像构建过程中执行参数命令,是Dockerfile执行逻辑的核心部分。

COPY指令用于复制文件,语法为COPY <源路径> <目标路径>。

WORKDIR指令用于设置工作目录,如果指定目录不存在,Docker会自动创建。

CMD指令用于指定容器启动时默认运行的主进程命令。Docker容器本质上是进程,启动时需指定运行的程序及参数。CMD即为此目的设计。需要注意的是,如果在docker run命令中显式指定了命令参数,Dockerfile中的CMD将失效。例如执行docker run -it -name redis docker.io/redis /bin/bash时,容器将直接执行/bin/bash,而忽略Dockerfile中定义的CMD。

三、构建镜像

docker build[OPTIONS]上下文路径|URL

  • [OPTIONS]参数通常包括:-t用于指定生成的镜像名称;-f用于指定Dockerfile文件的路径。
  • 上下文路径|URL:指定构建上下文的路径。若仅使用一个小圆点 ".",则代表当前目录。

执行命令docker build -t webtest . 可构建一个名为webtest的镜像。构建成功后,终端将返回一个镜像ID,例如1dfa2905efac。

[root@CentOS webtest]# ls
app Dockerfile requirements.txt run.sh
[root@CentOS webtest]# docker build -t webtest . 
...
...
...
Removing intermediate container 9c510e88e659
Step 6/6 : CMD /bin/bash run.sh
---> Running in 0bd29255c648
---> 1dfa2905efac
Removing intermediate container 0bd29255c648
Successfully built 1dfa2905efac
  • app: Django项目目录
  • Dockerfile
  • requirements.txt是项目运行所需要的python库
    • Django
    • djangorestframework
    • pyDes
    • PyMySQL
    • redis
    • requests
    • pymssql
    • pyodbc
    • paramiko
    • psutil

run.sh是容器启动时需要调用的Shell脚本

python /code/app/manage.py runserver 0.0.0.0:8000

启动容器,运行刚才构建的镜像。

docker run -it -p 6500:8000 -v /home/code/webtest:/code --name web --restart always --privileged=true webtest

[root@CentOS webtest]# docker run -it -p 6500:8000 -v /home/code/webtest:/code --name web --restart always --privileged=true webtest
Performing system checks...

System check identified no issues (0 silenced).

You have 15 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

August 09, 2018 - 09:56:51
Django version 2.1, using settings 'ShiHangTool.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.

-p参数:将容器内的8000端口映射到宿主机的6500端口。

-v参数:将主机目录/home/code/webtest映射到容器内的/code目录。

--name参数:为容器指定名称为web,webtest是我们之前构建的镜像名称。

--restart参数:设置为always,表示容器退出时总是自动重启。

--privileged=true参数:赋予容器执行文件所需的高级权限。

在浏览器或客户端输入 ip:6500/Home/OrderSettle-K8S/ 进行访问。

运行成功!

五、Compose

如果觉得上述手动操作过于繁琐,希望实现自动化部署,Docker Compose可以帮到你。

1.简介:

Compose是Docker官方开源项目,旨在实现Docker集群的快速编排。它通过docker-compose.yml文件来定义和运行一个或多个容器,是早期fig工具的升级版。

2.安装:

Compose由Python编写,调用Docker提供的API管理容器。因此,可以通过Python包管理工具pip进行安装。

pip install docker-compose

3.编写docker-compose.yml文件

以下是docker-compose.yml的主模板格式。

version: '3'
services:
  web1:
    build: .
    image: web1
    ports:
      - "7500:8000"
    volumes: 
      - /home/code/webtest:/code
    privileged: true
    restart: always

4.运行Compose项目

将Dockerfile、requirements.txt、docker-compose.yml以及app文件夹放置在同一目录下,然后运行命令docker-compose up。

[root@CentOS webtest]# docker-compose up
Creating network "webtest_default" with the default driver
Building web1
Step 1/6 : FROM python3.6.4-dev
 ---> ca46b1ed99ab
Step 2/6 : COPY app /code
 ---> f59b9540f8ab
Removing intermediate container e987c66b51f5
Step 3/6 : COPY requirements.txt /code
 ---> 2095b64882ac
Removing intermediate container e3099b386727
...
...
...

运行完成后,通过docker ps命令查看,可以看到名为web1的容器已经成功启动并运行。

[root@CentOS ~]# docker ps
CONTAINER ID    IMAGE          COMMAND         CREATED       STATUS       PORTS                       NAMES
eeab6b5a993b    web1           "/bin/bash run.sh"    About a minute ago  Up 59 seconds    0.0.0.0:7500->8000/tcp               webtest_web1_1
5fb51ce5a51c    webtest           "/bin/bash run.sh"    23 hours ago     Up About an hour  0.0.0.0:6500->8000/tcp               web

5.总结

Compose将构建镜像和运行容器两个步骤整合到一个yml文件中进行配置,从而实现了真正的自动化部署。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。