【云原生| Docker】 部署 Django & mysql 项目

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: 【云原生| Docker】 部署 Django & mysql 项目

文章目录

一、准备工作

图片.png

图片.png

图片.png

镜像加速源

镜像加速器 镜像加速器地址
Docker 中国官方镜像 https://registry.docker-cn.com
DaoCloud 镜像站 http://f1361db2.m.daocloud.io
Azure 中国镜像 https://dockerhub.azk8s.cn
科大镜像站 https://docker.mirrors.ustc.edu.cn
阿里云(需要注册,建议 https://<your_code>.mirror.aliyuncs.com
七牛云 https://reg-mirror.qiniu.com
网易云 https://hub-mirror.c.163.com
腾讯云 https://mirror.ccs.tencentyun.com

图片.png

二、部署 Django & Mysql

图片.png

1) .Dockignore

创建.dockignore文件

.git
settings/local.py
**/__pycache__

2) Dockfile

  1. 使用pip freeze > requirements.txt命令打包好项目的依赖包列表(这种方式只适合在虚拟环境中导出虚拟环境中的包,如果不是在虚拟环境下就会导出全局环境的python的环境包)
  2. 要想在全局环境中导出我们项目的依赖包,可以利用python包pipreqs
# 进入到项目所在目录,在执行下面的命令
$> pip install pipreqs
$> pipreqs . --encoding=utf8 --force
# “.” 指的是将导出依赖包的文件放在当前目录下
# “--encoding=utf8” 指的是存放文件的编码为utf-8,否则会报错
# “--force”  --force 强制执行,当 生成目录下的requirements.txt存在时强子覆盖
  1. 创建dockfile文件
# 指定基础镜像
FROM python:3.7
#ENV server.params=
# updata太慢 设置镜像源
RUN sed -i s@/deb.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list \
&& apt-get clean  \
    && apt-get update  \
    && apt-get install python3-dev default-libmysqlclient-dev -y
# 创建 code 文件夹并将其设置为工作目录
RUN mkdir /code
WORKDIR /code 
# 将 requirements.txt 复制到容器的 recruitment 目录
ADD requirements.txt /code/
# 更新 pip 并 安装依赖库
RUN pip install pip -U && pip install -r requirements.txt
# COPY 是不解压的
ADD . /code/
# CMD [ "/bin/sh", "/code/start.local.bat" ]
  • FROM python:3.7 指令从仓库拉取一个包含 python 3.7 的 Linux 操作系统环境(Linux 版本为 Debian)。
  • RUNWORKDIR 指令都是针对容器的,功能是在容器里创建目录、并将其设置为工作目录。注意宿主机是没有这个目录的。
  • ADD 指令出现了两次。ADD requirements.txt /code/ 意思是将宿主机当前目录(即 Dockerfile 所在目录)的 requirements.txt 文件复制到容器的 /code 目录中。ADD . /code/ 意思是把当前目录所有内容复制到容器 /code/ 目录,注意中间那个点。

3) docker-compose.yml

version: "3"
services:
  #  设置应用 容器
  app:
    restart: always
    build: .   # todo 根据当前项目 dockerfile生成,相当于 docker build -t="ouruser/sinatra:v2" .   # bash shell窗口 -c命令行 默认迁移 和 运行
    command: bash -c "python manage.py runserver 0.0.0.0:8080"   # bash -c "python manage.py runserver 0.0.0.0:8080"
    volumes:
      - .:/code
    ports:
      - "8080:8080"
    depends_on:
      - db
    networks:
      - db_network
  # 设置数据库 容器
  db:
    image: mysql:8  # 版本一定要对应! 
    volumes:
     - "./mysql/data:/var/lib/mysql"  # 设置timestamp 可为 null   #  设置字符集 (不是utf8会报错 #   collation 这是排序规则
#      - "./mysql/conf/my.cnf:/etc/mysql/my.cnf"
    command: "mysqld --user=root --explicit_defaults_for_timestamp --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci"
#      - -character-set-server=utf8mb4  # 设置默认字节
#      - -collation-server=utf8mb4_general_ci #   设置排序
#      - -explicit_defaults_for_timestamp=true # 设置可为 null
    #      --default-authentication-plugin=mysql_native_password # 使用 5.7 版本的密码验证
    #    "mysqld --user=root --explicit_defaults_for_timestamp --character-set-server=utf8mb4"
    ports:
      - "3307:3306"
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=123456  # 一定要配置
      - MYSQL_DATABASE=django_recruitment
    networks:
      - db_network
# 设置网络
networks:
  db_network:
    driver: bridge
  • version 代表 docker-compose.yml 的版本,目前最新版为 3,不需要改动它。

从整体上看,我们定义了二个容器,分别是appdb,容器之间通过定义的端口进行通讯。定义了网络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

ALLOWED_HOSTS = ["127.0.0.1", '*']
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django_recruitment',
        'PASSWORD': '123456',
        'PORT': '3306',
        'USER': 'root',
        'HOST': 'db',
        # 'HOST': '127.0.0.1',
        'OPTIONS': {'charset': 'utf8mb4'},
    },  # todo 注意:这里使用的是db别名,docker会自动解析成ip  部署!

5)生成表&数据迁移

由于我们所配置的数据是空的,此时我们需要生成表数据迁移

5.1 生成表

进入到sh命令窗口

bash
python manage.py migrate

5.2 数据迁移

  1. django先连接回原来的数据库,
python manage.py dumpdata > data.json
  1. 导出数据,并修改文件编码! 不然后面 loaddata会报错!

图片.png

  1. 进入mysql终端,设置忽略外键 和 删除 auth_permissiondjango_content_type 表 ( 由于在数据迁移过程中这两个表数据默认生成)图片.png
set foreign_key_checks=0;
truncate table django_content_type;
truncate table auth_permission;
set foreign_key_checks=1;
  1. 回到项目容器终端

进入到sh命令窗口

bash
python manage.py loaddata data.json   # mysql版本一定要一样 不然报错

部署命令

运行命令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命令查看。

文章知识点与官方知识档案匹配,可进一步学习相关知识




相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
5月前
|
关系型数据库 应用服务中间件 nginx
Docker一键安装中间件(RocketMq、Nginx、MySql、Minio、Jenkins、Redis)
本系列脚本提供RocketMQ、Nginx、MySQL、MinIO、Jenkins和Redis的Docker一键安装与配置方案,适用于快速部署微服务基础环境。
|
2月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
368 5
kde
|
2月前
|
存储 关系型数据库 MySQL
MySQL Docker 容器化部署全指南
MySQL是一款开源关系型数据库,广泛用于Web及企业应用。Docker容器化部署可解决环境不一致、依赖冲突问题,实现高效、隔离、轻量的MySQL服务运行,支持数据持久化与快速迁移,适用于开发、测试及生产环境。
kde
468 4
|
3月前
|
关系型数据库 MySQL 分布式数据库
阿里云PolarDB云原生数据库收费价格:MySQL和PostgreSQL详细介绍
阿里云PolarDB兼容MySQL、PostgreSQL及Oracle语法,支持集中式与分布式架构。标准版2核4G年费1116元起,企业版最高性能达4核16G,支持HTAP与多级高可用,广泛应用于金融、政务、互联网等领域,TCO成本降低50%。
|
4月前
|
关系型数据库 MySQL 数据库
为什么 MySQL 不推荐用 Docker 部署?
本文探讨了MySQL是否适合容器化的问题,分析了Docker容器在数据安全、性能瓶颈、状态管理及资源隔离等方面的挑战,并指出目前主流分布式数据库如TDSQL和OceanBase仍倾向于部署在物理机或KVM上。
261 0
|
8月前
|
关系型数据库 MySQL Linux
在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾
以上就是在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾的步骤。这个过程就像是一场接力赛,数据从MySQL数据库中接力棒一样传递到备份文件,再从备份文件传递到其他服务器,最后再传递回MySQL数据库。这样,即使在灾难发生时,我们也可以快速恢复数据,保证业务的正常运行。
375 28
|
8月前
|
Ubuntu 关系型数据库 MySQL
在Ubuntu系统的Docker上安装MySQL的方法
以上的步骤就是在Ubuntu系统的Docker上安装MySQL的详细方法,希望对你有所帮助!
856 12
|
运维 Java Devops
阿里云云效操作报错合集之部署docker时遇到报错,该怎么办
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
运维 Kubernetes 前端开发
【云原生】阿里云服务器部署 Docker Swarm集群
阿里云服务器 一键部署 Docker Swarm 集群!
970 0
【云原生】阿里云服务器部署 Docker Swarm集群
|
弹性计算 数据可视化 关系型数据库
使用阿里云部署基于docker的mysql云服务
本篇文章将介绍如何使用阿里云安装docker、部署mysql服务,并远程连接至远端mysql
937 1
使用阿里云部署基于docker的mysql云服务

热门文章

最新文章

推荐镜像

更多