后端开发之光!Django应用的容器化部署实践~
在此之前,我一直用uwsgi+virtualenv+nginx方式进行应用部署,操作起来比较麻烦,而且依赖于服务器上的Python版本,服务的管理方面单纯uwsgi + pid算不上特别麻烦但总没有docker compose方便,无奈原本的服务器是32位系统的用不上docker,现在又增加了一个新服务器,所以赶紧把docker安排上~ 不得不说真的太简单太方便了,全程傻瓜式操作,也基本没像之前uwsgi部署那样遇到一些坑,真棒!
安装
最好是在开发机装上docker和compose,方便本机测试,安装方法直接参考官网,本文不再赘述。
编写Dockerfile
首先是要给Django应用写一个Dockerfile来构建服务镜像。
我的Dockerfile内容如下,每一行都有注释,供各位参考:
FROM python:3.7
# 设置 python 环境变量
ENV PYTHONUNBUFFERED 1
# 创建 code 文件夹并将其设置为工作目录
RUN mkdir /code
WORKDIR /code
# 更新 pip
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pip -U
# 设置清华源
RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
# 将 requirements.txt 复制到容器的 code 目录
ADD requirements.txt /code/
# 安装库
RUN pip install -r requirements.txt
# 将当前目录复制到容器的 code 目录
ADD . /code/
写完之后可以直接运行docker run构建镜像,之后进入container的命令行执行python manage.py runserver 0.0.0.0 8000测试能否正常启动服务器(当然没有暴露端口前是没办法访问到的)
使用compose编排服务
Docker Compose是一个用来定义和运行复杂应用的Docker工具。一个使用Docker容器的应用,通常由多个容器组成。使用Docker Compose不再需要使用shell脚本来启动容器。
Compose 通过一个配置文件来管理多个Docker容器,在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景。
官方文档:https://docs.docker.com/compose/overview/
注意compose版本需要和docker版本正确对应才能正常运行,docker更新很快,安装最好从官网最新版本进行~
下面附上我的docker-compose.yml文件,后面会对配置项目进行介绍
version: "3"
services:
mongo:
image: mongo
expose:
- 27017
restart: on-failure # 退出代码指示出现故障错误时重启
postgres:
image: postgres
expose:
- 5432
restart: on-failure
environment:
- POSTGRES_PASSWORD=password
web:
restart: always # 除正常工作外,容器会在任何时候重启,比如遭遇 bug、进程崩溃、docker 重启等情况。
build: .
environment:
- ENVIRONMENT=docker
command: python3 manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "9000:8000"
depends_on:
- postgres
- mongo
可以看到我这个项目里面使用到了PostgreSQL和MongoDB,使用compose把他们整合在一起,并且暴露端口给web(也就是Django应用)使用。
编写完docker-compose.yml文件之后,执行docker-compose up就可以自动构建各个镜像并且运行服务了,非常方便。
如果需要后台运行则使用:docker-compose up -d
重新构建镜像使用:docker-compose up --build
删除使用:docker-compose down
启动和停止:docker-compose start、docker-compose stop
compose配置
官网上有非常详细的配置文档,本文中我只介绍几个我常用的配置项。
build
build 可以指定包含构建上下文的路径,比如前面docker-compose.yml里的:
web:
build: .
volumes配置
注意web节点下有个volumes配置。
从前面Dockerfile可以看到,Django应用的代码是在构建时静态复制到容器中的,即通过Dockerfile文件中的ADD . /code/命令实现物理主机中的源码复制到容器中,这样在后续物理主机src目录中代码的更改不会反应到容器中。
可以通过volumes 关键字实现物理主机目录挂载到容器中的功能(这时可以删除Dockerfile中的ADD . /code/命令了,不需要创建镜像时将代码打包进镜像,而是通过volums动态挂载,容器和物理host共享数据卷,这样还是实现程序的热更新)
links 和 depends_on
这两个差不多其实,不过前者官网文档说已经不建议使用了,所以用depends_on吧,作用就是把多个服务中的容器链接起来,比如本文例子中,我的Django应用需要用到postgresql数据库和MongoDB,所以我把他们链接起来,并且暴露端口(但要注意的是,在docker中,每一个镜像都是单独的一个主机,所以这三个服务相当于是三个不同的虚拟机,不能通过 localhost:port 访问),这样在Django服务里需要使用 postgres:5432 这样的形式使用。
其中postgres是我们写在depends_on里面的服务名称,当然可以设置别名,比如 postgres:db,那么就是通过 db:5432去访问了~
通过这个名称去访问服务器的原理相当于本地DNS吧,或者说是host文件~
数据库迁移
当Django应用在服务器上部署之后,还面临一个数据库迁移的问题,其实很好解决,要不就直接进docker环境执行命令,或者使用docker-compose run来执行,如下:
docker-compose run web python3 manage.py makemigrations
docker-compose run web python3 manage.py migrate
其他需要执行的命令同理~
command
这个command是要在一个服务里面的镜像构建完启动之后执行的命令,一般来说只能执行一条,不过也能执行多条(不推荐)
看了一眼Stack Overflow,大体两种方法:
第一种:
web:
command: python a.py && python b.py
第二种,利用管道:
web:
command:
- /bin/sh
- -c
- |
python a.py
python b.py
大概就说这么多啦,因为其实真的太简单了,更多操作参考官网文档吧~
参考资料
- https://blog.csdn.net/pushiqiang/article/details/78682323
- https://juejin.im/post/5d9c7b285188253f5447bcfa
后端开发之光!Django应用的容器化部署实践~的更多相关文章
- spring boot本地开发与docker容器化部署的差异
spring boot本地开发与docker容器化部署的差异: 1. 文件路径及文件名区别大小写: 本地开发环境为windows操作系统,是忽略大小写的,但容器中区分大小写 2. docker中的容器 ...
- 谈谈surging引擎的tcp、http、ws协议和如何容器化部署
1.前言 分布式已经成为了当前最热门的话题,分布式框架也百花齐放,群雄逐鹿.从中心化服务治理框架,到去中心化分布式服务框架,再到分布式微服务引擎,这都是通过技术不断积累改进而形成的结果.esb,网关, ...
- 1. 容器化部署一套云服务 第一讲 Jenkins(Docker + Jenkins + Yii2 + 云服务器))
容器化部署一套云服务系列 1. 容器化部署一套云服务之Jenkins 一.购买服务器 服务器
- Flask容器化部署原理与实现
本文将介绍Flask的部署方案:Flask + Nginx + uWSGI,并使用docker进行容器化部署,部署的实例来源 Flask开发初探,操作系统为ubuntu. Flask系列文章: Fla ...
- .NET Core+MySql+Nginx 容器化部署
.NET Core容器化@Docker .NET Core容器化之多容器应用部署@Docker-Compose .NET Core+MySql+Nginx 容器化部署 GitHub-Demo:Dock ...
- 浅谈surging服务引擎中的rabbitmq组件和容器化部署
1.前言 上个星期完成了surging 的0.9.0.1 更新工作,此版本通过nuget下载引擎组件,下载后,无需通过代码build集成,引擎会通过Sidecar模式自动扫描装配异构组件来构建服务引擎 ...
- angular应用容器化部署
angular 应用容器化部署 Intro 我自己有做一个个人主页,虽然效果不怎么样(不懂设计的典型程序猿...),但是记录了我对于前端框架及工具的一些实践, 从开始只有一个 angularjs 制作 ...
- Ubuntu系统下容器化部署gitlab
容器化部署gitlab 获取镜像文件 1. 下载镜像文件 docker pull beginor/gitlab-ce:-ce. 2. 创建GitLab 的配置 (etc) . 日志 (log) .数据 ...
- Jaeger容器化部署
概述 Jaeger是由Uber开源的分布式追踪系统,一套完整的Jager追踪系统包括Jaeger-client.Jaeger-agent.Jaeger-collector.Database和Jaege ...
- Gogs的Docker容器化部署流程遇到的问题
Gogs的Docker容器化部署流程遇到的问题 最近在学习CI/CD的一些方案,个人比较青睐容器化轻量级.CI方面一开始是想使用gitlab的,但是发现我自己买的服务器配置太低,内存根本不够(大写 ...
随机推荐
- cgroup的入门资料
近期在准备特性的设计文档,按照评审专家的建议,需要排查现有产品中算力资源比如CPU.内存的分配方案,确认现有的硬件款型是否具备充足的资源来启用本特性. 依据前辈提供的建议,检查了产品的部署脚本,发现当 ...
- Docker安装 配置
Docker的技术原理: 1. Linux 命名空间(Namespaces) 进程命名空间:使得每个容器拥有独立的进程空间,互相隔离,不受其他容器影响. 网络命名空间:提供独立的网络栈,每个容器有自己 ...
- dfs之迭代加深
为什么要用迭代加深 \(dfs\) 每次会选择搜索树的一个分支,不断深入,直到达到递归边界条件:但这种搜索策略带有一定的缺陷性: 如果搜索树的某一个分支中的节点个数特别多,但是答案并不在这棵子树里面, ...
- three.js中场景模糊、纹理失真的问题
目录 1. 概述 2. 方案 2.1. 开启反走样 2.2. 开启HiDPI设置 3. 结果 4. 参考 1. 概述 在three.js场景中,有时会遇到场景模糊,纹理失真的现象,似乎three.js ...
- CANN 6.0来了,硬核技术抢先看
摘要:在华为全联接大会2022期间,华为正式官宣昇腾AI异构计算架构CANN 6.0版本将在年底正式发布. 本文分享自华为云社区<昇腾AI异构计算架构CANN 6.0全新开放升级,全面释放AI生 ...
- 华为云数据库GaussDB(for Influx)揭秘第二期:解密GaussDB(for Influx)的数据压缩
摘要:物联网设备产生的数据是典型的时序数据,而时序数据库是存储时序数据的专业数据库系统,因此数据压缩对时序数据库来说是一项必不可少的能力. 本文分享自华为云社区<华为云数据库GaussDB(fo ...
- 什么是 A/B 实验,为什么要开 A/B 实验?
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 1.什么是 A/B 实验 A/B 实验也被称为 A/B 测试,实验的基本思路是在线上流量中取出一小部分(较低风险) ...
- 一文快速了解火山引擎 A/B 测试平台
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 一. 概述 A/B Testing 作为因果推断的「黄金标准」,是效果评估的利器. 火山引擎 A/B 测试(Dat ...
- Linux 堡垒机命令行中如何上传下载文件(SecureCRT - SFTP)
通过堡垒机进入的 Linux 操作系统,无法直接使用 WinSCP 等工具进行文件的上传下载. 可使用 SecureCRT 先进入命令行模式 配置 配置 Linux 堡垒机的连接方式 连接 选择要进入 ...
- Kubernetes(K8S) 安装Nacos,报 No DataSource set
原因,数据库为 MySQL 5.7 需要在yaml加上参数 mysql.db.param: "characterEncoding=utf8&connectTimeout=1000&a ...