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

在这里插入图片描述

🤵‍♂️ 个人主页: @计算机魔术师
👨‍💻 作者简介:CSDN内容合伙人,全栈领域优质创作者。
🌐 推荐一款找工作神器网站: 点击跳转牛客网登陆注册 |笔试题库|面试经验|实习招聘内推|

该文章收录专栏
—【Django | 项目开发】从入门到上线 专栏—

一、准备工作

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

镜像加速源

镜像加速器镜像加速器地址
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

在这里插入图片描述

二、部署 Django & Mysql

在这里插入图片描述

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

我们在开发项目中,往往是使用django自带的sqlite进行快速开发测试,后面部署再使用mysql,这里也是一样的,个人建议部署到服务器可以先使用带过去的sqlite进行测试(且此时数据库是有数据的), 进行真正上线则使用mysql(没有数据)

ALLOWED_HOSTS = [ '*']


DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

# 部署用数据库配置
# DATABASES = {
#     'default': {
#         'ENGINE': 'django.db.backends.mysql',
#         'NAME': 'django_recruitment',
#         'USER': 'root',
#         'PASSWORD': '123456',
#         'HOST': 'db',
        # 'HOST': '127.0.0.1',
#         'PORT': '3306',
#         '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会报错!

在这里插入图片描述

  1. 进入mysql终端,设置忽略外键 和 删除 auth_permissiondjango_content_type 表 ( 由于在数据迁移过程中这两个表数据默认生成)
    在这里插入图片描述
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命令查看。
  • 61
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 95
    评论
### 回答1: Docker部署Django的web项目的步骤如下: 1. 创建Dockerfile文件 2. 创建并运行Docker容器 3. 在容器中安装Django需要的依赖 4. 将Django项目代码复制到容器中 5. 运行Django项目 6. 将容器映射到主机端口以便外部访问. ### 回答2: 随着云计算的发展,Docker容器化技术成为了云计算核心技术之一。Docker是一种轻量级的容器技术,旨在让应用程序在不同的环境中运行的隔离环境中,可以更加高效地部署、测试和发布。在Docker容器中运行的应用程序自带其依赖关系和运行环境,因此可以避免了传统部署方式中出现了的版本冲突、环境配置等问题。 本文将介绍如何使用Docker部署Django的Web项目。 第一步:创建Django项目 在使用Docker前,需要先创建一个Django项目。可以使用Django的命令行工具来创建一个新项目。假设项目名称为myproject,请执行以下命令: ``` $ django-admin startproject myproject ``` 此时,会在当前目录下创建一个myproject目录,包含一个manage.py的文件和一个myproject目录。 第二步:编写Dockerfile 在Django项目目录下,创建一个名为 Dockerfile 的文件,并按以下内容进行编写: ``` # 设置基础镜像为 Python3.7 FROM python:3.7 # 设置工作目录为 /app WORKDIR /app # 将当前目录下的所有文件拷贝到 /app 下 COPY . /app # 安装依赖 RUN pip install -r requirements.txt # 启动命令 CMD python manage.py runserver 0.0.0.0:8000 ``` 此Dockerfile文件使用了基础镜像为Python3.7,并设置了工作目录为/app。接着拷贝当前目录下的所有文件到/app下,然后安装requirements.txt中的依赖。最后启动Django的内置服务器。 第三步:构建镜像 通过docker build 命令构建自己的镜像, 假设镜像名称为 myprojectimage,请执行以下命令: ``` $ docker build -t myprojectimage . ``` 此命令是指使用当前目录下的Dockerfile文件创建一个名为myprojectimage的镜像。另外记得再次提醒 在执行上述命令前 先确保你的本地安装了 docker。 第四步:运行容器 通过docker run 命令运行一个容器,假设容器名称为myprojectcontainer,并将容器的8000端口映射到主机的8000端口,请执行以下命令: ``` $ docker run -p 8000:8000 --name=myprojectcontainer myprojectimage ``` 此命令是指运行myprojectimage镜像,并将容器的8000端口映射到主机的8000端口,同时将容器命名为myprojectcontainer。此时,Django的内置服务器会监听主机的8000端口。 完成以上四步,打开浏览器,访问 http://localhost:8000/ 就能看到Django项目的欢迎页面,这意味着你已经成功用 Docker 部署Django 的 Web 项目。 总结 Docker可以帮助我们更加高效地部署、测试和发布应用程序。使用Docker部署Django的Web项目并不是一个复杂的过程,只需要按照上述步骤完成即可。当然,我们还可以通过Docker Compose来管理复杂的部署环境,更加灵活地管理容器部署。 ### 回答3: Docker是一种容器化技术,可以将应用程序和所有的依赖项打包在一起。DjangoPython Web框架,可以快速开发Web应用程序。在这篇文章中,我们将介绍如何使用Docker部署Django Web项目。 步骤1:创建一个Django项目 要开始,我们需要创建一个Django项目。使用以下命令创建一个新的Django项目: ``` django-admin startproject myproject ``` 在这个例子中,我们将Django项目保存在名为`myproject`的目录中。您可以根据需要更改项目的名称。 步骤2:创建Dockerfile 创建名为`Dockerfile`的文件,并在其中添加以下内容: ``` # 使用官方的 Python 运行时作为镜像 FROM python:3.9-slim-buster # 创建应用程序文件夹 RUN mkdir /app # 将当前工作目录设置为 /app WORKDIR /app # 将主机上的当前目录复制到容器中的 /app 目录中 COPY . /app # 运行 terminal 命令行以使用 Pip 安装 Flask 应用程序的依赖项 RUN pip install --no-cache-dir -r requirements.txt # 使容器的端口号可通过 Docker 网络被发现 EXPOSE 8000 # 定义环境变量 # 这对于在使用 Docker 镜像设置时提供输入非常有用。 ENV NAME myproject # 运行应用程序 CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"] ``` 步骤3:准备requirements.txt 在项目的根目录下创建一个新文件`requirements.txt`,并将以下内容添加到文件中: ``` Django>=3.0 ``` 步骤4:构建Docker镜像 使用以下命令将Docker镜像构建为`myproject`: ``` docker build -t myproject . ``` 此步骤需要一些时间,它将创建一个新的Docker镜像并将代码打包在Docker容器中。 步骤5:运行Docker容器 使用以下命令在Docker容器中运行Django应用程序: ``` docker run -p 8000:8000 myproject ``` 现在您可以在Web浏览器中打开`http://localhost:8000`,即可看到您的Django应用程序正在运行。如果您使用的是Docker桌面,则端口映射应在自动完成。否则,您可能需要执行ipconfig/ ifconfig命令来查找主机的IP地址。 结论: 使用Docker部署Django应用程序非常简单。将代码打包在一个容器中,只需要几个命令就可以启动它。Docker有助于解决场景依赖性问题,包括团队成员电脑和服务器上的不同环境变量。它还有助于创建自动化部署工作流程,并提供一种简单的方法来在多个环境中运行应用程序。
评论 95
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

计算机魔术师

在校大二学生,请多多指教

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值