docker 构建django项目发布镜像

Fleur ·
更新时间:2024-09-20
· 778 次阅读

说明

基础镜像采用centos7.5,docker 版本为19.03.8,宿主机版本为Ubuntu 18.04.1。第一次做django项目发布,尝试用docker镜像打包,并且顺利成功。项目中涉及的es、mysql、redis等组件未采用docker部署。
项目路径是~/mywu/所有dockerfile、nginx配置、uwsgi配置、启动脚本都放在此项目目录下方便打包。
先构建centos+python+nginx打包基础镜像包。后续项目镜像包以此镜像包作为基础镜像包。

基础镜像包

下载centos7.5镜像包 docker pull centos:centos7.5.1804

(xm) pyvip@VIP:~/mywu$ docker pull centos:centos7.5.1804 centos7.5.1804: Pulling from library/centos Digest: sha256:7a45e4a1efbaafc1d9aa89925b6fdb33288a96d35ea0581412316e2f0ad3720a Status: Downloaded newer image for centos:centos7.5.1804 docker.io/library/centos:centos7.5.1804

下载nginx包nginx-1.13.7.tar.gz。

(xm) pyvip@VIP:~/mywu/$ wget http://nginx.org/download/nginx-1.13.7.tar.gz --2020-05-06 02:18:10-- http://nginx.org/download/nginx-1.13.7.tar.gz 正在解析主机 nginx.org (nginx.org)... 62.210.92.35, 95.211.80.227, 2001:1af8:4060:a004:21::e3 正在连接 nginx.org (nginx.org)|62.210.92.35|:80... 已连接。 已发出 HTTP 请求,正在等待回应... 200 OK 长度: 990836 (968K) [application/octet-stream] 正在保存至: “nginx-1.13.7.tar.gz” nginx-1.13.7.tar.gz 100%[=================================================================================================================================================================>] 967.61K 29.3KB/s 用时 29s 2020-05-06 02:18:40 (33.8 KB/s) - 已保存 “nginx-1.13.7.tar.gz” [990836/990836])

在项目路径下编写dockerfile vim basedocker

vim basedocker FROM centos:centos7.5.1804 #MAINTAINER 维护者信息 MAINTAINER wu #ENV 设置环境变量 ENV LANG en_US.UTF-8 ENV LC_ALL en_US.UTF-8 #RUN 执行以下命令 RUN curl -so /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo RUN yum install -y python36 python3-devel gcc pcre-devel zlib-devel make net-tools COPY nginx-1.13.7.tar.gz /opt #安装nginx RUN tar -zxf /opt/nginx-1.13.7.tar.gz -C /opt && cd /opt/nginx-1.13.7 && ./configure --prefix=/usr/local/nginx && make && make install & & ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx

构建docker包 docker build . -t centos7.5-nginx:v1.0 -f basedocker

(xm) pyvip@VIP:~/mywu/deploy$ docker build . -t centos7.5-nginx:v1.0 -f basedocker Sending build context to Docker daemon 994.3kB Step 1/8 : FROM centos:centos7.5.1804 ---> cf49811e3cdb Step 2/8 : MAINTAINER wu ---> Running in f49add210551 Removing intermediate container f49add210551 ---> 552e325d722f Step 3/8 : ENV LANG en_US.UTF-8 ---> Running in ccddd013a72d Removing intermediate container ccddd013a72d ---> 58dc7eb0f88d Step 4/8 : ENV LC_ALL en_US.UTF-8 ---> Running in 7ba7aa8be90c Removing intermediate container 7ba7aa8be90c ---> add9d0067325 Step 5/8 : RUN curl -so /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo ---> Running in a5671c21df3a Removing intermediate container a5671c21df3a ---> fa4b94c50599 Step 6/8 : RUN yum install -y python36 python3-devel gcc pcre-devel zlib-devel make net-tools ---> Running in d07bad00130e Loaded plugins: fastestmirror, ovl Repository base is listed more than once in the configuration ...... Removing intermediate container e483f4cec428 ---> dd6609c08cfa Successfully built dd6609c08cfa Successfully tagged centos7.5-nginx:v1.0

查看镜像

(xm) pyvip@VIP:~/mywu/deploy$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos7.5-nginx v1.0 dd6609c08cfa 14 seconds ago 449MB nginx latest 6678c7c2e56c 2 months ago 127MB centos centos7.5.1804 cf49811e3cdb 13 months ago 200MB delron/fastdfs latest 8487e86fc6ee 2 years ago 464MB delron/elasticsearch-ik 2.4.6-1.0 095b6487fb77 2 years ago 689MB 构建项目镜像

项目采用nginx+uwsgi部署
在xshell中生成pipenvll.txt文件(将项目中安装的包,存放到pipenvll.txt文件中)

(xm) pyvip@VIP:~/mywu/deploy$ pip freeze >pipenvll.txt (xm) pyvip@VIP:~/mywu$ more pipenvll.txt asgiref==3.2.3 baidu-aip==2.2.18.0 bce-python-sdk==0.8.37 certifi==2019.11.28 chardet==3.0.4 Django==2.1.7 django-haystack==2.8.1 django-redis==4.11.0 elasticsearch==2.4.1 future==0.18.2 idna==2.8 Pillow==7.0.0 pycrypto==2.6.1 PyMySQL==0.9.3 pytz==2019.3 redis==3.4.1 requests==2.22.0 six==1.14.0 sqlparse==0.3.0 urllib3==1.25.8 uWSGI==2.0.18

编写项目dockerfile mysitedockerf

(xm) pyvip@VIP:~/mywu$ more mysitedockerf FROM centos7.5-nginx:v1.0 #MAINTAINER 维护者信息 LABEL maintainer="wu" #工作目录 WORKDIR /opt/mysite #拷贝文件至工作目录 COPY . . RUN cp mysite-nginx.conf /usr/local/nginx/conf/mysite.conf #安装依赖的插件 RUN pip3 install -i https://pypi.doubanio.com/simple -r pipenvll.txt RUN chmod +x start.sh && rm -rf ~/.cache/pip #EXPOSE 映射端口 EXPOSE 80 #容器启动时执行命令 CMD ["./start.sh"]

下面就是dockerfile中涉及的文档编写了
nginx配置文件编写mysite-nginx.conf

(xm) pyvip@VIP:~/mywu$ more mysite-nginx.conf #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name 127.0.0.1; #charset koi8-r; #access_log logs/host.access.log main; location /media { alias /opt/mysite/xmb1/media; } # 静态文件 location /static { alias /opt/mysite/static; } location / { uwsgi_pass 127.0.0.1:8001; include /usr/local/nginx/conf/uwsgi_params; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }

uwsgi配置文件

(xm) pyvip@VIP:~/mywu$ more uwsgi.ini [uwsgi] # 使用nginx连接时使用,Django程序所在服务器地址 # 选择内网IP和端口 socket=127.0.0.1:8001 # 项目根目录 chdir=/opt/mysite #项目中wsgi.py文件的相对目录 wsgi-file=xmb1/wsgi.py # 进程数 processes=2 # 线程数 threads=2 # uwsgi服务器的角色 master=True # 存放进程编号的文件 pidfile=uwsgi.pid # 日志文件,因为uwsgi可以脱离终端在后台运行,日志看不见。以前的runserver是依赖终端的 daemonize=logs/uwsgi.log

启动配置文件 start.sh

(xm) pyvip@VIP:~/mywu$ more start.sh #!/bin/bash python3 manage.py collectstatic uwsgi --ini ./uwsgi.ini nginx -c /usr/local/nginx/conf/mysite.conf -g 'daemon off;'

最后一步构建项目镜像。第一次构建容器有问题起不来,后来修改配置又构建了一遍。最终成功的镜像是mysite:v1.1版本。
docker build . -t mysite:v1.1 -f mysitedockerf

Sending build context to Docker daemon 126.5MB Step 1/9 : FROM centos7.5-nginx:v1.0 ---> dd6609c08cfa Step 2/9 : LABEL maintainer="wu" ---> Running in 3b8a0a621cb1 Removing intermediate container 3b8a0a621cb1 ---> e3adf22c56da Step 3/9 : WORKDIR /opt/mysite ---> Running in 3126416f7129 Removing intermediate container 3126416f7129 ---> c1b6a38c8703 Step 4/9 : COPY . . ---> f895dd2917e6 Step 5/9 : RUN cp mysite-nginx.conf /usr/local/nginx/conf/mysite.conf ---> Running in 5f67e5d9c314 Removing intermediate container 5f67e5d9c314 ---> 9d25fe83d066 Step 6/9 : RUN pip3 install -i https://pypi.doubanio.com/simple -r pipenvll.txt ---> Running in 332c05091602 WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead. Collecting asgiref==3.2.3 (from -r pipenvll.txt (line 1)) Downloading https://pypi.doubanio.com/packages/a5/cb/5a235b605a9753ebcb2730c75e610fb51c8cab3f01230080a8229fa36adb/asgiref-3.2.3-py2.py3-none-any.whl Running setup.py install for uWSGI: finished with status 'done' .4.1 requests-2.22.0 six-1.14.0 sqlparse-0.3.0 uWSGI-2.0.18 urllib3-1.25.8 Removing intermediate container 332c05091602 ---> c84f013fb85a Step 7/9 : RUN chmod +x start.sh && rm -rf ~/.cache/pip ---> Running in 5d4bc7ff6e9a Removing intermediate container 5d4bc7ff6e9a ---> c96b1f194911 Step 8/9 : EXPOSE 80 ---> Running in 1af335420466 Removing intermediate container 1af335420466 ---> 145247f80859 Step 9/9 : CMD ["./start.sh"] ---> Running in 95f633ef1cf1 Removing intermediate container 95f633ef1cf1 ---> d68a50415dca Successfully built d68a50415dca Successfully tagged mysite:v1.0 (xm) pyvip@VIP:~/mywu$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysite v1.1 7c3c6f2af288 12 hours ago 627MB mysite v1.0 d68a50415dca 12 hours ago 627MB centos7.5-nginx v1.0 dd6609c08cfa 13 hours ago 449MB nginx latest 6678c7c2e56c 2 months ago 127MB centos centos7.5.1804 cf49811e3cdb 13 months ago 200MB delron/fastdfs latest 8487e86fc6ee 2 years ago 464MB delron/elasticsearch-ik 2.4.6-1.0 095b6487fb77 2 years ago 689MB

最后启动容器,验证服务正常。

(xm) pyvip@VIP:~/mywu$ docker run -dit --name mysite1 --net=host mysite:v1.1 a8a68ad874714bc96fa767a157e999d4bb4d604b09c163668dbb1244447374b4 (xm) pyvip@VIP:~/mywu$ (xm) pyvip@VIP:~/mywu$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a8a68ad87471 mysite:v1.1 "./start.sh" 28 seconds ago Up 27 seconds mysite1

由于我项目使用的数据库都是填的127.0.0.1。容器内部无法调用宿主机的127.0.0.1。因此我使用net=host主机网络模式启动容器。
为使得日后上K8S平台应该使用端口映射的模式部署,需要修改部分代码。
首先Django中setting配置文件中各配置连接使用环境变量设置

DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mysite', 'USER': os.environ.get("MYSQL_USER", 'root'), 'PASSWORD': os.environ.get("MYSQL_PASSWD", '123456'), 'HOST': os.environ.get("MYSQL_HOST", '127.0.0.1'), 'PORT': os.environ.get("MYSQL_PORT", '3306') } }

然后启动容器时指定环境变量即可。

docker run -dti -p 80:80 --name mysite -e MYSQL_HOST=10.0.2.15 -e MYSQL_USER=root -e MYSQL_PASSWD=123456 mysite:v1.2 莎拉拉吗酷奇 原创文章 7获赞 1访问量 999 关注 私信 展开阅读全文
作者:莎拉拉吗酷奇



django项目 Django 镜像 Docker

需要 登录 后方可回复, 如果你还没有账号请 注册新账号