【云原生| Docker】 部署 Django & mysql 项目
🤵♂️ 个人主页: @计算机魔术师👨💻 作者简介:CSDN 内容合伙人,全栈领域优质创作者。🌐 推荐一款找工作神器网站: 点击跳转牛客网登陆注册 |笔试题库|面试经验|实习招聘内推|
该文章收录专栏✨---【Django | 项目开发】从入门到上线 专栏---✨
@[toc]
一、准备工作
镜像加速源
二、部署 Django & Mysql
1) .Dockignore
创建.dockignore
文件
2) Dockfile
使用
pip freeze > requirements.txt
命令打包好项目的依赖包列表(这种方式只适合在虚拟环境中导出虚拟环境中的包,如果不是在虚拟环境下就会导出全局环境的 python 的环境包)要想在全局环境中导出我们项目的依赖包,可以利用 python 包
pipreqs
创建
dockfile
文件
FROM
python:3.7 指令从仓库拉取一个包含 python 3.7 的 Linux 操作系统环境(Linux 版本为 Debian)。RUN
和WORKDIR
指令都是针对容器的,功能是在容器里创建目录、并将其设置为工作目录。注意宿主机是没有这个目录的。ADD
指令出现了两次。ADD requirements.txt /code/
意思是将宿主机当前目录(即Dockerfile
所在目录)的requirements.txt
文件复制到容器的/code
目录中。ADD . /code/
意思是把当前目录所有内容复制到容器/code/
目录,注意中间那个点。
3) docker-compose.yml
version
代表 docker-compose.yml 的版本,目前最新版为 3,不需要改动它。
从整体上看,我们定义了二个容器,分别是app
、db
,容器之间通过定义的端口进行通讯。定义了网络db_network
,只有处在同一网络下的容器才能够互相通讯。不同网络之间是隔离的,即便采用同样的端口,也无法通讯。
定义了一个名叫 app 的容器。后面的内容都是 app 容器的相关配置:
restart
:除正常工作外,容器会在任何时候重启,比如遭遇 bug、进程崩溃、docker 重启等情况。build
:指定一个包含Dockerfile
的路径,并通过此Dockerfile
来构建容器镜像。注意那个 "." ,代表当前目录。command
:容器运行时需要执行的命令。这里就是我们很熟悉的运行开发服务器了。volumes
:卷,这是个很重要的概念。前面说过容器是和宿主机完全隔离的,但是有些时候又需要将其连通;比如我们开发的 Django 项目代码常常会更新,并且更新时还依赖如 Git 之类的程序,在容器里操作就显得不太方便。所以就有卷,它定义了宿主机和容器之间的映射:"." 表示宿主机的当前目录,":" 为分隔符,"/code" 表示容器中的目录。即宿主机当前目录和容器的 /code 目录是连通的,宿主机当前目录的 Django 代码更新时,容器中的 /code 目录中的代码也相应的更新了。这有点儿像是在容器上打了一个洞,某种程度上也是实用性和隔离性的一种妥协。
严格意义上讲,这里用到的 .:/code 并不是卷,而是叫挂载,它两是有区别的,只不过 docker-compose 允许将挂载写到卷的配置中。
expose
:暴露容器的 8000 端口供其他容器访问,宿主机和外界无法访问networks
:能够访问db_network
depends_on
: 意思是此容器需要等待 db 容器启动完毕才能够启动。
分析一下 db 容器:
image
:从仓库拉取 MySQL 5.7 。volumes
:这里出现的 static-volume 叫卷。它的使用方式像这样:static-volume:/code/collected_static ,冒号后面还是容器内的目录,但冒号前的却不是宿主机目录、仅仅是卷的名称而已。从本质上讲,数据卷也是实现了宿主机和容器的目录映射,但是数据卷是由 Docker
进行管理的,你甚至都不需要知道数据卷保存在宿主机的具体位置。
相比挂载,数据卷的优点是由于是 Docker
统一管理的,不存在由于权限不够引发的挂载问题,也不需要在不同服务器指定不同的路径;缺点是它不太适合单配置文件的映射。和挂载一样,数据卷的生命周期脱离了容器,删除容器之后卷还是存在的。下次构建镜像时,指定卷的名称就可以继续使用了。
ports
:MySQL 默认通信端口为 3306 。environment
:定义容器的环境变量,设置了 MySQL 的 root 用户的密码、数据库的名称。network
:只能够访问 db_network。添加 db 容器后记得的修改 Django 里的数据库设置。
4)修改项目 settings.py
我们在开发项目中,往往是使用
django
自带的sqlite
进行快速开发测试,后面部署再使用 mysql,这里也是一样的,个人建议部署到服务器可以先使用带过去的sqlite
进行测试(且此时数据库是有数据的), 进行真正上线则使用mysql
(没有数据)
5)生成表 &数据迁移
由于我们所配置的数据是空的,此时我们需要生成表和数据迁移
5.1 生成表
进入到sh
命令窗口
5.2 数据迁移
django
先连接回原来的数据库,
导出数据,并修改文件编码! 不然后面
loaddata
会报错!
进入
mysql
终端,设置忽略外键 和 删除auth_permission
和django_content_type
表 ( 由于在数据迁移过程中这两个表数据默认生成)
回到项目容器终端
进入到sh
命令窗口
部署命令
运行命令docker-compose build
构造镜像,再使用docker-compose up
即可启用服务。
下面附上一下经常用到的命令:
停止容器,
docker-compose down
后台运行 docker 容器:
docker-compose up -d
只想启动其中的一个容器:
docker-compose up -d db
或者docker-compose up -d app
即可启动 db 容器或 app 容器。进入容器:
docker exec -it container_id /bin/bash
上面的container_id
如果不知道如何获取可以通过docker ps
命令查看。
评论