一、docker-compose安装

1、在安装好docker基础上,linux系统运行以下命令以下载 Docker Compose 的当前稳定版本

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
要安装其他版本的 Compose,请替换 1.29.2。

2、将可执行权限应用于二进制文件、创建软连接、测试是否安装成功。

sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

3、docker-compose version测试是否安装成功

二、部署

Django + Uwsgi + Nginx + Postgres + Redis组合容器

本例中我们将使用docker-compose编排并启动4个容器,这个更接近于实际生成环境下的部署。

  1.  Django + Uwsgi容器:核心应用程序,处理后端请求
  2.  PostgreSQL 容器:数据库服务
  3.  Redis 容器:缓存服务
  4.  Nginx容器:反向代理服务并处理静态资源请求

这四个容器的依赖关系是:Django+Uwsgi 容器依赖 Redis 容器和 PostgreSQL 容器,Nginx 容器依赖Django+Uwsgi容器。为了方便容器间的相互访问和通信,我们使用docker-compose时可以给每个容器取个别名,这样访问容器时就可以直接使用别名访问,而不使用Docker临时给容器分配的IP了。

Docker-compose部署Django-vue项目路径树形图

pwd显示的目录:/home/edwin/docker_project/quotationBackend
该目录下的大致项目结构:
└── quotationBackend             # 常规Django项目目录
    ├── Dockerfile                      # 构建Django+Uwsgi镜像的Dockerfile
    ├── docker-compose.yml     # 核心编排文件
    ├── manage.py
    ├── quotationBackend          # Django项目配置文件
    │        ├── asgi.py
    │        ├── __init__.py
    │        ├── settings.py
    │        ├── urls.py
    │        └── wsgi.py
    ├── pip.conf                           # 非必需。pypi源设置成国内,加速pip安装
    ├── requirements.txt              # Django项目依赖文件
    ├── start.sh                            # 启动Django+Uwsgi容器后要执行的脚本
    ├── dist                                  # 前端vue打包后的文件
    └── uwsgi.ini                          # uwsgi配置文件
    ├── nginx
    │        ├── Dockerfile              # 构建Nginx镜像所的Dockerfile
    │        ├── log                         # 挂载保存nginx容器内日志log目录
    │        ├── nginx.conf             # Nginx配置文件
    │        ├── ssl                         # 如果需要配置https需要用到

下面正式开始部署:

第一步:编写Nginx镜像和容器所需文件

1、构建Nginx镜像所使用的Dockerfile如下所示:

FROM nginxRUN rm -rf /etc/nginx/conf.d/default.conf && mkdir -p /root/docker_project/frontend
# 第一句删除nginx容器内路径下的default.conf(可不删除)和创建存放前端项目的路径。
# -p 确保目录名称存在,不存在的就建一个。
COPY ./nginx.conf /etc/nginx    # 拷贝当前路径下的配置文件到nginx容器里。

2、Nginx的配置文件如下所示:

user  root root;
worker_processes  1;events {worker_connections  1024;
}http {include       mime.types;access_log /var/log/nginx/access.log;error_log /var/log/nginx/error.log warn;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;upstream django_backend {server django_web:9000;}server {listen       9001;server_name  localhost;   # 不能填宿主机IPcharset utf-8;client_max_body_size 10M; # 限制用户上传文件大小location / {root   /root/docker_project/frontend;index  index.html index.htm;}location /api/{rewrite  ^/api/(.*)$ /$1 break;include   /etc/nginx/uwsgi_params;uwsgi_pass django_backend;}}
}

第二步:编写Web (Django+Uwsgi)镜像和容器所需文件

1、构建Web镜像(Django+Uwsgi)的所使用的Dockerfile如下所示:

FROM python:3.7
# 镜像作者
MAINTAINER zt_9773RUN mkdir -p /root/docker_project/quotationBackendWORKDIR /root/docker_project/quotationBackend  # 指定工作目录,比较重要,一般挂载路径是基于此路径# 可选:设置镜像源为国内,设置后会快很多
COPY pip.conf /root/.pip/pip.conf
# 将当前目录copy到工作目录中(. 表示当前目录)
COPY . /root/docker_project/quotationBackend# 安装项目依赖、给start.sh可执行权限(用于后续启动uwsgi)
RUN pip install -r requirements.txt \&& chmod +x ./start.sh

2、start.sh启动脚本文件内容如下所示

#!/bin/bash
python manage.py makemigrations &&
python manage.py migrate &&
uwsgi --ini uwsgi.ini && tail -f /dev/null# tail空命令防止web容器执行脚本后退出

3、uwsgi.ini配置文件如下所示:文件没有配置python虚拟环境,用的是容器默认的环境,所以可不用配置。

[uwsgi]
socket=0.0.0.0:9000
chdir=/root/docker_project/quotationBackend/
module=quotationBackend.wsgi:application
master=true
processes=4
threads=2
vacuum=true
thunder-lock=true
enable-threads=true
pidfile=uwsgi.pid
daemonize = uwsgi.log

第三步:编写docker-compose.yml文件

定义了2个数据卷,用于挂载容器内动态生成的数据,比如postSQL的存储数据,redis生成的快照这样即使删除容器,容器内产生的数据也不会丢失。

我们还定义了3个网络,分别为nginx_network(用于nginx和web容器间的通信),db_network(用于db和web容器间的通信)和redis_network(用于redis和web容器间的通信)。

整个编排里包含4项容器服务,别名分别为redisdatabasenginx和django_web,接下来我们将依次看看各个容器的Dockerfile和配置文件。

我这里redis和数据库直接使用的官方镜像,没有配置文件,因为可以直接使用,所以就没有单独给redis和数据库编写Dockerfile文件。

version: "3"# 自定义数据卷
volumes:postgres_vol:redis_vol:# 自定义网络(默认桥接), 不使用links通信
networks:nginx_network:driver: bridgedb_network:driver: bridgeredis_network:driver: bridgeservices:redis:image: redisnetworks:- redis_networkvolumes:- redis_vol:/data    # 以数据卷挂载给reids数据备份ports:- "6379:6379"restart: alwaysdatabase:image: postgres:12environment:POSTGRES_DB: quotationBackend    # 数据库名字,不存在会自动创建POSTGRES_USER: postgresPOSTGRES_PASSWORD: 123456networks:- db_networkvolumes:- postgres_vol:/var/lib/postgresql/dataports:- "5432:5432"restart: alwaysdjango_web:build: ./expose:- "9000"volumes:- .:/root/docker_project/quotationBackend  # 挂载项目代码networks:- db_network- redis_network- nginx_networkdepends_on:- database- rediscommand: ./start.sh     # 启动uwsgirestart: alwaysnginx:build: ./nginxports:- "9001:9001"volumes:- ./dist:/root/docker_project/frontend     # 挂载前端vue打包后文件- ./nginx/nginx.conf:/etc/nginx/nginx.conf   # 挂载配置文件- ./logs:/var/log/nginx    # 挂载日志networks:- nginx_networkdepends_on:- django_webrestart: always

第四步:修改Django项目settings.py

主要几项配置需要修改如下:

DATABASES = {'default': {'ENGINE': 'django.db.backends.postgresql_psycopg2','NAME': 'quotationBackend','USER': 'postgres','PASSWORD': '123456','HOST': 'database',    # docker-compose.yml中'PORT': '5432'}
}DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'  # 用处后面问题总结中介绍CACHES = {"default": {"BACKEND": "django_redis.cache.RedisCache","LOCATION": "redis://redis:6379",   # docker-compose.yml中"OPTIONS": {"CLIENT_CLASS": "django_redis.client.DefaultClient",# 连接池数量,如果decode_responses不设置为True的话,# 使用get_redis_connection读取的数据是bytes,# 需要decode为utf-8"CONNECTION_POOL_KWARGS": {"max_connections": 100, "decode_responses": True},# "PASSWORD": "123456",}}
}

第五步:使用docker-compose 构建镜像并启动容器组服务

现在我们可以使用docker-compose命名构建镜像并启动容器组了。

# 进入docker-compose.yml所在文件夹,输入以下命令构建镜像
sudo docker-compose build
# 查看已生成的镜像和已经启动的容器
sudo docker images
sudo docker ps
# 启动容器组服务
sudo docker-compose up

如果一切顺利,此时你应该可以看到四个容器服务都已经成功运行了。此时打开你的浏览器,输入你服务器的ip地址或域名指向地址,你就应该可以访问你的网站拉。

第六步:遇到的问题排错总结

1、Nginx容器排错

Nginx报错nginx: [emerg] "user" directive is not allowed here in /etc/nginx/conf.d/nginx.conf:1。。路径有问题,我开始把nginx的配置文件copy到这里的路径下了。应该放在/etc/nginx路径下面。

nginx排错最重要的是查看Nginx的错误日志,还有重点检查端口,和uwsgi配套检查,基本就不会有问题。

2、Web容器排错

 (1)、上面问题为start.sh格式配置不对,在最前面加上 #!/bin/bash 即可。。另外一个常发生的错误是 docker-compose生成的web容器执行脚本命令后立刻退出(exited with code 0),在start.sh中加入tail -f /dev/null后容器服务可持续运行。

(2)、在运行start.sh迁移数据库时有报警导致容器退出。

django_web_1  | user.User: (models.W042) Auto-created primary
key used when not defining a primary key type,
by default 'django.db.models.AutoField'.
django_web_1  | HINT: Configure the DEFAULT_AUTO_FIELD
setting or the UserConfig.default_auto_field attribute
to point to a subclass of AutoField, e.g. 'django.db.models.BigAutoField'.

在玩新发布的 Django 3.2 时,我注意到一个警告,我以前在从 Django 3.1 迁移的网站上没有看到警告(警告)。models.W042
该警告在 Django 3.2 中引入了一个新功能,该功能允许更改 Django 自动添加的原数默认字段,如果您没有明确定义主字段。官方这样说的。

我的django版本是3.2.8,所以需要在settings.py配置文件中加上这句DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'。

(3)、构建数据库时有个端口占用错误Error starting userland proxy: listen tcp4 0.0.0.0:5432: bind: address already in use。直接在root用户运行netstat -tanlp ,然后找到端口5432的PID。 kill PID即可。

(4)、在requirements.txt中删掉psycopg2包,只需要安装psycopg2-binary且可以不用指定版本直接安装最新版本。

The psycopg2 wheel package will be renamed from release 2.8;
in order to keep installing from binary please use
"pip install psycopg2-binary" instead. 

三、最后小结

1、说一说ports和expose的区别。

  • ports是将端口暴露给宿主机,而expose是将端口暴露给和本容器通信的容器,这里是通过 networks通信。
  • 用法区别,语法格式如下。
ports:- "80:80"      # 绑定容器的80端口到主机的80端口- "9000:8080"  # 绑定容器的8080端口到主机的9000端口- "443"        # 绑定容器的443端口到主机的任意端口,容器启动时随机分配绑定的主机端口号
expose:- "3000"- "8000"  # 将当前容器的端口3000和8000暴露给link到本容器的容器。

2、容器数据卷volumes。

  • 作用就是实现容器和容器之间数据共享,容器和宿主机之间数据备份防止数据丢失
  • 匿名挂载和具名挂载:就是在指定数据卷的时候,不指定容器路径对应的主机路径,这样对应映射的主机路径就是默认的路径/var/lib/docker/volumes/中自动生成一个随机命名的文件夹(默认以id命名)。例如本例中docker-compose.yml中定义的redis_vol和postgres_vol,启动成功后可在宿主机看到挂载的路径/var/lib/docker/volumes 下面。这里命名为redis_vol叫具名挂载。不命名docker会默认以id命名叫匿名挂载。
  • 指定路径挂载:主容器文件所在路径:容器内路径。nginx的几个挂载都是指定路径挂载。
  • 注意:不能通信的两个容器之间不能共享数据

待续

docker-compose+postsql多容器部署django-vue项目相关推荐

  1. Docker部署Django由浅入深系列(中): 双容器部署Django + Uwsgi + Nginx

    本文是使用Docker部署Django由浅入深系列的中篇,我们将构建两个容器,一个容器放Django + Uwsgi,另一个容器放Nginx.我们将了解不同容器间是如何通信的,并学会正确配置uwsgi ...

  2. 新一代微服务全家桶AlibabaCloud+Docker+JDK11阿里云容器部署零基础到项目实战

    新一代微服务全家桶AlibabaCloud+Docker+JDK11阿里云容器部署零基础到项目实战 近年来,微服务架构已经成为企业标配,它以更加灵活的部署方式和高度解耦的架构设计,为企业带来了极大的业 ...

  3. docker项目部署 php_Docker部署PHP+Vue项目

    本文将介绍如何使用docker镜像 快速部署 php+vue 项目.文末提供源码地址 本地创建Docker映射目录 -- vue_demo # Demo项目 -- php_vue -- docker- ...

  4. Jenkins自动化部署前端Vue项目

    Jenkins自动化部署前端Vue项目 前言 安装NodeJs 下载NodeJs 安装NodeJs npm配置 Jenkins配置NodeJs 安装NodeJs插件 配置NodeJs 新建及配置任务 ...

  5. vue请求在退出页面还执行吗_如何用 Cloudbase Framework 部署一个 Vue 项目

    无需修改业务代码,就能将 Vue 应用前后端一键托管部署在云开发平台~ Cloudbase Framework 是云开发官方出品的前后端一体化部署工具.目前已经 开源 . 关于 Cloudbase F ...

  6. 部署springboot+vue项目文档(若依ruoyi项目部署步骤)

    部署springboot+vue项目文档(若依ruoyi项目部署步骤) 一:部署linux + nginx 二:部署windows + tomcat(无nginx) 三:解决调用第三方api如百度地图 ...

  7. 服务器上部署前端Vue项目代码

    服务器上部署前端Vue项目代码 本人自己感觉部署前端代码比部署后端难,主要是我在部署的过程中遇到了各种报错

  8. Windows服务器部署前端vue项目

    阿里云Windows服务器部署前端vue项目 准备工作 下载node.js(略)http://nodejs.cn/download/ 下载Nginx http://nginx.org/en/downl ...

  9. 超详细Docker部署SpringBoot+Vue项目(三更博客项目部署)

    文章目录 1.项目部署规划 2.前置工作 2.1修改后端配置文件ip 2.2修改前端Vue项目运行端口 2.3修改前端对应的服务器ip 2.4后端项目打包 2.4.1解决打包问题 2.4.2项目打包, ...

  10. Docker Compose—简化复杂容器应用的利器

    Compose是用于定义和运行复杂Docker应用的工具.你可以在一个文件中定义一个多容器的应用,然后使用一条命令来启动你的应用,然后所有相关的操作都会被自动完成. 1. 安装Docker和Compo ...

最新文章

  1. 安装使用vmware及vsphere流程介绍
  2. windows7黑屏修复_如何在Windows 10更新后修复黑屏
  3. 对esp和ebp分析来了解函数的调用过程
  4. 高性能开发,别点,发际线要紧!
  5. 【Python】Could not find a version that satisfies the requirement cv2 (from versions: ) 的解决方案
  6. 2017.9.11 海拔 思考记录
  7. spire.pdf系列文章
  8. Kafka 如何保证消息全局有序
  9. 在计算机系统软件中核心软件,在计算机系统软件中的核心软件是()
  10. 商城小程序项目完整源码(微信小程序)
  11. Redhat 7 配置Yum仓库
  12. 视觉SLAM笔记(62) 单目稠密重建
  13. elf文件反编译C语言,ELF文件解析和反汇编
  14. Linux里面qt的可执行文件在命令行中可以打开,双击可执行文件打不开
  15. 【经验】CCF CSP认证问题
  16. 头指针、头节点、首元结点——《王道数据结构》
  17. 【原生JavaWeb】网页前端页面如何调用后端Java程序
  18. 用代码绘制简单的图形
  19. unity,射手游戏
  20. codeforces 571A Lengthening Sticks 组合数学 插板法

热门文章

  1. 项目管理实践——一页纸项目管理
  2. Windows 下Maven安装配置(本地仓库配置)
  3. java matlab绘图_Java 调用Matlab画图实用教程
  4. C#调用Bing的在线翻译接口Translator
  5. Alex 的 Hadoop 菜鸟教程: 第20课 工作流引擎 Oozie
  6. JS将16进制颜色转为rgba格式
  7. GBase数据库事务隔离级别
  8. 暑假学习打卡【4】——北理工乐学第四周作业
  9. 使用Python PyQt5实现一个简单的图像识别软件
  10. 如何学习工业机器人技术