如何 Docker 化 Python Django 应用程序
创始人
2024-03-02 00:11:57
0

Docker 是一个开源项目,为开发人员和系统管理员提供了一个开放平台,可以将应用程序构建、打包为一个轻量级容器,并在任何地方运行。Docker 会在软件容器中自动部署应用程序。

Django 是一个用 Python 编写的 Web 应用程序框架,遵循 MVC(模型-视图-控制器)架构。它是免费的,并在开源许可下发布。它速度很快,旨在帮助开发人员尽快将他们的应用程序上线。

在本教程中,我将逐步向你展示在 Ubuntu 16.04 中如何为现有的 Django 应用程序创建 docker 镜像。我们将学习如何 docker 化一个 Python Django 应用程序,然后使用一个 docker-compose 脚本将应用程序作为容器部署到 docker 环境。

为了部署我们的 Python Django 应用程序,我们需要其它 docker 镜像:一个用于 Web 服务器的 nginx docker 镜像和用于数据库的 PostgreSQL 镜像。

我们要做什么?

  1. 安装 Docker-ce
  2. 安装 Docker-compose
  3. 配置项目环境
  4. 构建并运行
  5. 测试

步骤 1 - 安装 Docker-ce

在本教程中,我们将从 docker 仓库安装 docker-ce 社区版。我们将安装 docker-ce 社区版和 docker-compose(其支持 compose 文件版本 3)。

在安装 docker-ce 之前,先使用 apt 命令安装所需的 docker 依赖项。

sudo apt install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

现在通过运行以下命令添加 docker 密钥和仓库。

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

安装 Docker-ce

更新仓库并安装 docker-ce。

sudo apt update
sudo apt install -y docker-ce

安装完成后,启动 docker 服务并使其能够在每次系统引导时启动。

systemctl start docker
systemctl enable docker

接着,我们将添加一个名为 omar 的新用户并将其添加到 docker 组。

useradd -m -s /bin/bash omar
usermod -a -G docker omar

启动 Docker

omar 用户身份登录并运行 docker 命令,如下所示。

su - omar
docker run hello-world

确保你能从 Docker 获得 hello-world 消息。

Docker-ce 安装已经完成。

步骤 2 - 安装 Docker-compose

在本教程中,我们将使用支持 compose 文件版本 3 的最新 docker-compose。我们将手动安装 docker-compose

使用 curl 命令将最新版本的 docker-compose 下载到 /usr/local/bin 目录,并使用 chmod 命令使其有执行权限。

运行以下命令:

sudo curl -L https://github.com/docker/compose/releases/download/1.21.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

现在检查 docker-compose 版本。

docker-compose version

确保你安装的是最新版本的 docker-compose 1.21。

安装 Docker-compose

已安装支持 compose 文件版本 3 的 docker-compose 最新版本。

步骤 3 - 配置项目环境

在这一步中,我们将配置 Python Django 项目环境。我们将创建新目录 guide01,并使其成为我们项目文件的主目录,例如包括 Dockerfile、Django 项目、nginx 配置文件等。

登录到 omar 用户。

su - omar

创建一个新目录 guide01,并进入目录。

mkdir -p guide01
cd guide01/

现在在 guide01 目录下,创建两个新目录 projectconfig

mkdir project/ config/

注意:

  • project 目录:我们所有的 python Django 项目文件都将放在该目录中。
  • config 目录:项目配置文件的目录,包括 nginx 配置文件、python pip 的requirements.txt 文件等。

创建一个新的 requirements.txt 文件

接下来,使用 vim 命令在 config 目录中创建一个新的 requirements.txt 文件。

vim config/requirements.txt

粘贴下面的配置:

Django==2.0.4  
gunicorn==19.7.0  
psycopg2==2.7.4

保存并退出。

创建 Nginx 虚拟主机文件 django.conf

config 目录下创建 nginx 配置目录并添加虚拟主机配置文件 django.conf

mkdir -p config/nginx/
vim config/nginx/django.conf

粘贴下面的配置:

upstream web {
  ip_hash;
  server web:8000;
}
 
# portal
server {
  location / {
        proxy_pass http://web/;
  }
  listen 8000;
  server_name localhost;
 
  location /static {    
    autoindex on;    
    alias /src/static/;    
  }
}

保存并退出。

创建 Dockerfile

guide01 目录下创建新文件 Dockerfile

运行以下命令:

vim Dockerfile

现在粘贴下面的 Dockerfile 脚本:

FROM python:3.5-alpine
ENV PYTHONUNBUFFERED 1  

RUN apk update && \
    apk add --virtual build-deps gcc python-dev musl-dev && \
    apk add postgresql-dev bash

RUN mkdir /config  
ADD /config/requirements.txt /config/  
RUN pip install -r /config/requirements.txt
RUN mkdir /src
WORKDIR /src

保存并退出。

注意:

我们想要为我们的 Django 项目构建基于 Alpine Linux 的 Docker 镜像,Alpine 是最小的 Linux 版本。我们的 Django 项目将运行在带有 Python 3.5 的 Alpine Linux 上,并添加 postgresql-dev 包以支持 PostgreSQL 数据库。然后,我们将使用 python pip 命令安装在 requirements.txt 上列出的所有 Python 包,并为我们的项目创建新目录 /src

创建 Docker-compose 脚本

使用 vim 命令在 guide01 目录下创建 docker-compose.yml 文件。

vim docker-compose.yml

粘贴以下配置内容:

version: '3'
  services:
    db:
      image: postgres:10.3-alpine
      container_name: postgres01
    nginx:
      image: nginx:1.13-alpine
      container_name: nginx01
      ports:
        - "8000:8000"
      volumes:
        - ./project:/src
        - ./config/nginx:/etc/nginx/conf.d
      depends_on:
        - web
    web:
      build: .
      container_name: django01
      command: bash -c "python manage.py makemigrations && python manage.py migrate && python manage.py collectstatic --noinput && gunicorn hello_django.wsgi -b 0.0.0.0:8000"
      depends_on:
        - db
      volumes:
        - ./project:/src
      expose:
        - "8000"
      restart: always

保存并退出。

注意:

使用这个 docker-compose 文件脚本,我们将创建三个服务。使用 alpine Linux 版的 PostgreSQL 创建名为 db 的数据库服务,再次使用 alpine Linux 版的 Nginx 创建 nginx 服务,并使用从 Dockerfile 生成的自定义 docker 镜像创建我们的 python Django 容器。

配置 Django 项目

将 Django 项目文件复制到 project 目录。

cd ~/django
cp -r * ~/guide01/project/

进入 project 目录并编辑应用程序设置 settings.py

cd ~/guide01/project/
vim hello_django/settings.py

注意:

我们将部署名为 “hello_django” 的简单 Django 应用程序。

ALLOW_HOSTS 行中,添加服务名称 web

ALLOW_HOSTS = ['web']

现在更改数据库设置,我们将使用 PostgreSQL 数据库来运行名为 db 的服务,使用默认用户和密码。

DATABASES = {  
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'postgres',
        'USER': 'postgres',
        'HOST': 'db',
        'PORT': 5432,
    }
}

至于 STATIC_ROOT 配置目录,将此行添加到文件行的末尾。

STATIC_ROOT = os.path.join(BASE_DIR, 'static/')

保存并退出。

配置 Django 项目

现在我们准备在 docker 容器下构建和运行 Django 项目。

步骤 4 - 构建并运行 Docker 镜像

在这一步中,我们想要使用 guide01 目录中的配置为我们的 Django 项目构建一个 Docker 镜像。

进入 guide01 目录。

cd ~/guide01/

现在使用 docker-compose 命令构建 docker 镜像。

docker-compose build

启动 docker-compose 脚本中的所有服务。

docker-compose up -d

等待几分钟让 Docker 构建我们的 Python 镜像并下载 nginx 和 postgresql docker 镜像。

完成后,使用以下命令检查运行容器并在系统上列出 docker 镜像。

docker-compose ps
docker-compose images

现在,你将在系统上运行三个容器,列出 Docker 镜像,如下所示。

我们的 Python Django 应用程序现在在 docker 容器内运行,并且已经创建了为我们服务的 docker 镜像。

步骤 5 - 测试

打开 Web 浏览器并使用端口 8000 键入服务器地址,我的是:http://ovh01:8000/

现在你将看到默认的 Django 主页。

默认 Django 项目主页

接下来,通过在 URL 上添加 /admin 路径来测试管理页面。

http://ovh01:8000/admin/

然后你将会看到 Django 管理登录页面。

Django administration

Docker 化 Python Django 应用程序已成功完成。

参考


via: https://www.howtoforge.com/tutorial/docker-guide-dockerizing-python-django-application/

作者:Muhammad Arul 译者:MjSeven 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

相关内容

在CentOS系统中为Do...
理解Docker存储的核心机制:驱动与分层管理 在CentOS系统...
2025-06-16 07:41:58
Docker 4.42 版...
IT之家 6 月 12 日消息,科技媒体 linuxiac 昨日(...
2025-06-12 15:13:33
我的docker随笔39:...
本文介绍在容器中修改时间而不影响宿主机的系统时间。 问题提出 某容...
2025-06-01 18:45:21
【Docker】Netwo...
文章目录网络情况查看宿主机网络情况 `ifconfig&#...
2025-06-01 12:34:38
容器安全配置
本博客地址:https://security.blo...
2025-06-01 06:33:19
HTML - 容器布局,使...
HTML - 容器布局,使容器充满屏幕高度ÿ...
2025-06-01 02:27:27

热门资讯

Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
使用 KRAWL 扫描 Kub... 用 KRAWL 脚本来识别 Kubernetes Pod 和容器中的错误。当你使用 Kubernet...
JStock:Linux 上不... 如果你在股票市场做投资,那么你可能非常清楚投资组合管理计划有多重要。管理投资组合的目标是依据你能承受...
通过 SaltStack 管理... 我在搜索Puppet的替代品时,偶然间碰到了Salt。我喜欢puppet,但是我又爱上Salt了:)...
Epic 游戏商店现在可在 S... 现在可以在 Steam Deck 上运行 Epic 游戏商店了,几乎无懈可击! 但是,它是非官方的。...
《Apex 英雄》正式可在 S... 《Apex 英雄》现已通过 Steam Deck 验证,这使其成为支持 Linux 的顶级多人游戏之...
如何在 Github 上创建一... 学习如何复刻一个仓库,进行更改,并要求维护人员审查并合并它。你知道如何使用 git 了,你有一个 G...
2024 开年,LLUG 和你... Hi,Linuxer,2024 新年伊始,不知道你是否已经准备好迎接新的一年~ 2024 年,Lin...
什么是 KDE Connect... 什么是 KDE Connect?它的主要特性是什么?它应该如何安装?本文提供了基本的使用指南。科技日...
Opera 浏览器内置的 VP... 昨天我们报道过 Opera 浏览器内置了 VPN 服务,用户打开它可以防止他们的在线活动被窥视。不过...