Django项目制作Docker镜像详解(完整步骤)

1 篇文章 0 订阅
1 篇文章 0 订阅

网上的做法太多,大多千篇一律,不是你复制我的就是我复制你的,然后还标成原创,我是真的不知道现在的世界怎么了。。。

本人尝试了各种网上的办法,踩了许多坑,最终实现将Django项目做成docker镜像的完整步骤,其中我也会对过程中所遇到的各种坑进行说明。

温馨提示:一定要看注意事项!一定要看注意事项!一定要看注意事项!

步骤:

1.首先需要先在本地搭建好docker环境(这里不做解释,搭建docker环境自行百度)

2.准备将需要做成镜像的Django项目结构做成以下结构(本人是这样的结构,初学者建议先按照我的结构来进行制作

项目结构
这里说明下为什么有两个dockerfile:主要是因为做docker镜像的时候需要一个基础镜像包和一个项目镜像包,大致可以理解基础镜像包指项目所需要运行的基础环境(比如说linux系统环境,python环境等等),项目镜像包大致可以理解是项目所需要的各种插件框架等(比如说Django项目肯定需要django框架以及其他的项目所依赖的框架等等)这里我的项目并没有使用到数据库,所以在这里不做数据库的环境,需要的自行将自己的数据库的环境添加进dockerfile文件中进行数据库安装)

3.基础镜像Dockerfile(主要就是对系统环境,镜像目录等设置)

#这里我使用的是linux centos7系统环境
FROM centos:7

#这里主要是添加一下作者信息
MAINTAINER xxxxxxxx@qq.com

#这里是存放的路径(网上大多说这里是设置环境变量,本人是没理解,根据我的实践,这里是将项目做成镜像后的路径)
ENV CODE_DIR=/opt/my_app
ENV DOCKER_SCRIPTS=$CODE_DIR/base_image/scripts

#将scripts下的文件复制到镜像中的镜像中的目录里(这里个人感觉没有什么太大作用,先这样进行复制)
COPY ./scripts/* $DOCKER_SCRIPTS/

#执行镜像中的provision.sh脚本
RUN chmod a+x $DOCKER_SCRIPTS/*
RUN $DOCKER_SCRIPTS/provision.sh

4.provision.sh文件(这个文件主要就是为了搭建系统所需要的环境)

#!/bin/bash
set -e

#python环境依赖(这里主要就是针对python环境所安装的一些依赖包)
yum install -y \
    kde-l10n-Chinese\
    glibc-common\
    git\
    wget\
    mysql-devel\
    gcc\
    swig\
    pulseaudio\
    pulseaudio-libs\
    pulseaudio-libs-devel\
    zlib-devel\
    bzip2-devel\
    openssl-devel\
    ncurses-devel\
    sqlite-devel\
    readline-devel\
    tk-devel\
    gdbm-devel\
    db4-devel\
    libpcap-devel\
    xz-devel\
    libffi-devel\
    ncurese-devel\
    automake\
    autoconf\
    libtool\
    make\
    alsa-lib-devel\
    poppler-utils\


#python3.7(开始安装Python环境)
wget https://www.python.org/ftp/python/3.7.7/Python-3.7.7.tgz
tar -zxvf Python-3.7.7.tgz
cd Python-3.7.7
./configure
make && make install
rm -rf Python-3.7.7*

#sqlite(这里我当时在最后由于提示我django版本和sqlite版本不兼容,所以在这里将sqlite版本进行升级,但是本人测试后此方法没用)
wget https://www.sqlite.org/2020/sqlite-autoconf-3330000.tar.gz
tar -zxvf sqlite-autoconf-3330000.tar.gz 
cd sqlite-autoconf-3330000
./configure --prefix=/usr/local
make && make install
mv /usr/bin/sqlite3  /usr/bin/sqlite3_old
ln -s /usr/local/bin/sqlite3   /usr/bin/sqlite3
export LD_LIBRARY_PATH="/usr/local/lib"
rm -rf sqlite-autoconf*

#pip3(这里是借鉴的网上的教程,作用不大,后面再安装的时候会说本身的pip版本已经高于这个版本了,所以这里的这个并没什么用)
wget --no-check-certificate https://github.com/pypa/pip/archive/9.0.1.tar.gz
tar -zvxf 9.0.1.tar.gz
cd pip-9.0.1
python3 setup.py install
rm -rf pip-9.0.1*
pip3 install --upgrade setuptools

5.这里开始制作基础镜像,在base_image文件夹中执行以下命令

注意:执行命令的时候一定到启动docker服务

# 注意:版本号后面有一个点一定要加上!版本号后面有一个点一定要加上!版本号后面有一个点一定要加上
docker build -t base_app_image:1.0 .  #注意这里的base_app_image指的是基础镜像的名称,后面制作项目镜像会用到这里名称

开始过程参考如下,过程所执行的操作太多就不一一进行截图展示了(由于过程所需要的时间较长,请耐心等待)
在这里插入图片描述
完成之后截图
在这里插入图片描述

6.项目镜像Dockerfile文件(主要是搭建对项目的一些框架,插件依赖等)

#基础镜像(这里的base_app_image就是之前制作的基础镜像,项目镜像是在基础镜像的基础上进行制作的,这个一定要理解清楚)
FROM base_app_image:1.0  
 
#这里主要就是设置一下编码语言
RUN localedef -c -f UTF-8 -i zh_CN zh_CN.utf8
ENV LC_ALL zh_CN.UTF-8
 
 
#将项目目录文件复制到镜像中,CODE_DIR是在基础镜像中定义的
COPY ./my_app $CODE_DIR/my_app
 
 
#安装项目依赖包(这里借鉴的网上的部分资料)
RUN pip3 install -U pip
RUN pip3 config set global.index-url http://mirrors.aliyun.com/pypi/simple
RUN pip3 config set install.trusted-host mirrors.aliyun.com
RUN pip3 install altgraph==0.17
RUN pip3 install asgiref==3.2.10
RUN pip3 install attrs==20.2.0
RUN pip3 install beautifulsoup4==4.9.1
RUN pip3 install bs4==0.0.1
RUN pip3 install certifi==2020.6.20
RUN pip3 install click==7.1.2
RUN pip3 install contrib==0.3.0
RUN pip3 install cycler==0.10.0
RUN pip3 install Django==2.1.8
RUN pip3 install docopt==0.6.2
RUN pip3 install Flask==1.1.2
RUN pip3 install httpserver==1.1.0
RUN pip3 install importlib-metadata==2.0.0
RUN pip3 install itsdangerous==1.1.0
RUN pip3 install Jinja2==2.11.2
RUN pip3 install jsonschema==3.2.0
RUN pip3 install kiwisolver==1.2.0
RUN pip3 install macholib==1.14
RUN pip3 install MarkupSafe==1.1.1
RUN pip3 install matplotlib==3.3.2
RUN pip3 install numpy==1.19.2
RUN pip3 install Pillow==8.0.1

 
#暴露端口
EXPOSE 8080
 
#启动项目,这里的路径就是前面基础镜像包的CODE_DIR路径,再加上自己的项目复制到里面的路径,不清楚的可以参考这我给出的结构进行比对
CMD ["python3", "/opt/my_app/my_app/manage.py", "runserver", "0.0.0.0:8080"]

注意:这里本人参照网络上的资料做了修改,网络上大部分这里写有:

RUN pip3 install -r $CODE_DIR/my_app/requirements.txt

本人在执行过程中出现过未找到该文件,也尝试了先生成该文件再执行也还是不行,不知道是哪里出的问题,所以本人就现在项目目录中先生成这个文件,然后再将文件中的内容复制到项目dockerfile文件中执行,生成命令如下

pip freeze > requirements.txt

然后将requirements.txt文件中的内容复制到项目dockerfile中,图中红色圈起来的就是自己生成的requirements.txt文件中的内容,将其复制到dockerfile中即可
在这里插入图片描述

注意:当时生成这个文件时,里面django的版本原来是3.1.2,但是经本人的测试,django 3.1.2版本会和前面所说的sqlite版本不兼容,网上给出的方法是升级sqlite版本(这个方法不适用,测试了没有效果),所以这里需要将django的版本降成2.1.8

7.切换到镜像dockerfile所在的目录执行以下命令:

docker build -t my_app:1.0 . #这里的my_app就是自己项目的镜像名称

开始步骤参考截图
在这里插入图片描述
制作完成参考截图
在这里插入图片描述

8.查看镜像,执行命令,只要找到自己刚刚生成的镜像名称即成功

docker images

9.启动镜像

#127.0.0.1是宿主机的ip,意思是将镜像的8080端口映射到宿主机的9999端口上,2108aee43b68指的是镜像id)
docker run -it -p 127.0.0.1:9999:8080  2108aee43b68 

启动成功后就可以使用localhost:9999访问自己的Django项目了(当然访问的地址需要根据自己的项目路由地址进行访问,例如我的项目需要localhost:9999/index 才可以访问)

  • 10
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值