专栏首页运维录Django容器(上): 自定义基础镜像

Django容器(上): 自定义基础镜像

开始之前


某个 Python 项目,基于 Python:3.6Django:1.11 框架开发,希望项目能够容器化,然后可以通过 docker-compose 等工具编排容器/应用,本篇文章的目标是自定义Django基础镜像

与《为什么需要自定义一个基础镜像?》文章相同,基础镜像作用是为项目镜像提供支持

它构建在 Python 官方镜像之上,添加项目一些需要的扩展模块,例如 DjangopymysqlGunicorn等常用模块,具体以项目实际需求为准。

最后为能够高效的处理静态文件请求,使用 Nginx 反向代理 Django 应用,不过这是下一篇文章要讲的。

《Django容器(下): 使用Gunicorn管理Django》

敬请期待 公众号每周四 docker专题更新文章。

环境描述

容器镜像: python:3.6
容器系统: debian 9 (stretch)
Docker版本: CE - 17.06.0
Docker主机: Ubuntu Server 16.04

操作步骤


1. 基础镜像构建目录

tree base/

base/
├── conf
│   ├── 404.html
│   ├── default.conf
│   ├── nginx.conf
│   ├── requirements.txt
│   ├── sources.list
│   ├── ssl
│   │   ├── domain.crt
│   │   └── domain.key
│   └── supervisord.conf
└── `Dockerfile`

2 directories, 9 files

2. 基础镜像 Dockerfile 文件

cat base/Dockerfile

# start-base
FROM python:3.6
MAINTAINER dongnan #<@微信公众号:运维录>

# apt
COPY conf/sources.list /etc/apt/sources.list
RUN apt-get update \
        && apt-get install -y supervisor nginx \
    && apt-get clean \
        && rm -r /var/lib/apt/lists/*

# env
ENV TZ=Asia/Shanghai \
    LANG=en_US.UTF-8

# django
COPY conf/requirements.txt /root/
RUN pip --no-cache-dir install -r /root/requirements.txt -i https://mirrors.aliyun.com/pypi/simple/

这个 Dockerfile 很短,因为是项目基础镜像,只做一些基础工作就可以了。

它首先安装 supervisor nginx 软件包,然后是设置容器的环境变量。

最后使用 pip 安装项目依赖,django 、pymysql 都在 requirements.txt 这个文件中定义。

3. 构建镜像

docker build -t start-base .

Sending build context to Docker daemon    767kB
Step 1/8 : FROM python:3.6
# ...省略
Successfully built fc3f6f242301
Successfully tagged start-base

4. 验证镜像

基础镜像准备完毕后,就可以在项目镜像使用了,这里没有为基础镜像添加 TAG 标记,所以它是默认的 latest 。

docker images --format "{{.Repository}} {{.Tag}}" 

start-base latest

小结


最后来总结下文章中的知识点

  • 基础镜像作用是为项目镜像提供支持,并在基础镜像之上添加项目代码,完成项目镜像构建工作。
  • 使用 supervisor 在容器中管理 nginx、gunicorn (python WSGI Server)进程。
  • pippython 包管理工具,该工具提供了对python 包的查找、下载、安装、卸载的功能。
  • pip -i 选项, 指定仓库地址,默认为 https://pypi.org/simple,速度很慢建议使用国内仓库。

本文分享自微信公众号 - 运维录(gh_70d95b8f5f7c),作者:东南

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 没有Docker仓库还能分发镜像吗?

    首先明确的是建议优先使用Docker仓库,特别是对于Docker集群而言 Docker仓库非常重要,但是某些应用场景下比如单机环境下使用docker-comps...

    用户1560186
  • 为什么Docker镜像大小与仓库中不一致?

    如果仔细观察你会发现,Docker宿主机中某个镜像所占用的磁盘空间和在 Docker Hub(仓库)上看到的镜像大小是不同的,例如 golang:1.9 在 D...

    用户1560186
  • 为什么需要自定义一个基础镜像?

    对于使用php (python)等开发的项目,由于是解释型语言并不需要编译代码这个步骤(go或者java将依赖打包到可执行程序(包)中),但是往往还需要安装一些...

    用户1560186
  • docker 仓库里面python好多tag都代表什么意思?我们该如何选择

    今天让我同事帮忙构建一个基于python代码的docker包,然后他问我使用那个底层镜像,我说你直接去docker hub上找一个,他打开之后问我这么多我该使用...

    张琳兮
  • 容器镜像之腾挪大法: Harbor镜像远程复制视频演示

    (本文发布时,Harbor在Github上已获得2875颗星:https://github.com/vmware/harbor)

    Henry Zhang
  • docker相关概念

    镜像是什么呢?通俗地讲,它是一个只读的文件和文件夹组合。它包含了容器运行时所需要的所有基础文件和配置信息,是容器启动的基础。所以你想启动一个容器,那首先必须要有...

    宇宙之一粟
  • Docker 学习笔记--通过父镜像生成镜像

    一般情况下我们会通过已有镜像(父镜像)生成新的镜像,这个时候我们就需要使用到 FROM 命令。父镜像直接影响了生成新景象的大小和功能。我们可以把基础镜像或者普通...

    喵叔
  • Docker学习笔记--镜像

    镜像是Docker三大核心概念中最重要的一个,Dokcer运行容器钱需要本地存在对应的镜像,如果不存在对应的镜像,Doker 会先从默认的镜像仓库下载(如果用户...

    喵叔
  • docker 仓库里面python好多tag都代表什么意思?我们该如何选择

    今天让我同事帮忙构建一个基于python代码的docker包,然后他问我使用那个底层镜像,我说你直接去docker hub上找一个,他打开之后问我这么多我该使用...

    张琳兮
  • Docker 查看镜像

    happyJared

扫码关注云+社区

领取腾讯云代金券