网上的做法太多,大多千篇一律,不是你复制我的就是我复制你的,然后还标成原创,我是真的不知道现在的世界怎么了。。。
本人尝试了各种网上的办法,踩了许多坑,最终实现将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 12345678910111213141516
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 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
5.这里开始制作基础镜像,在base_image文件夹中执行以下命令
注意:执行命令的时候一定到启动docker服务
# 注意:版本号后面有一个点一定要加上!版本号后面有一个点一定要加上!版本号后面有一个点一定要加上 docker build -t base_app_image:1.0 . #注意这里的base_app_image指的是基础镜像的名称,后面制作项目镜像会用到这里名称 12
开始过程参考如下,过程所执行的操作太多就不一一进行截图展示了(由于过程所需要的时间较长,请耐心等待)
完成之后截图
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"] 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
注意:这里本人参照网络上的资料做了修改,网络上大部分这里写有:
RUN pip3 install -r $CODE_DIR/my_app/requirements.txt 1
本人在执行过程中出现过未找到该文件,也尝试了先生成该文件再执行也还是不行,不知道是哪里出的问题,所以本人就现在项目目录中先生成这个文件,然后再将文件中的内容复制到项目dockerfile文件中执行,生成命令如下
pip freeze > requirements.txt 1
然后将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就是自己项目的镜像名称 1
开始步骤参考截图
制作完成参考截图
8.查看镜像,执行命令,只要找到自己刚刚生成的镜像名称即成功
docker images 1
9.启动镜像
#127.0.0.1是宿主机的ip,意思是将镜像的8080端口映射到宿主机的9999端口上,2108aee43b68指的是镜像id) docker run -it -p 127.0.0.1:9999:8080 2108aee43b68 12
启动成功后就可以使用localhost:9999访问自己的Django项目了(当然访问的地址需要根据自己的项目路由地址进行访问,例如我的项目需要localhost:9999/index 才可以访问)