我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Django-Docker容器化部署:

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Django-Docker容器化部署:

上一章我们成功搭建了容器化的 Django 项目,用到的数据库为默认的 Sqlite。Sqlite 虽然简单易用,但是线上部署时通常会选择更高效、更可靠的数据库,比如 MySQL。

本章将在上一章的基础上,修改并构建 Docker + Django + MySQL 的容器项目。

Docker-compose

我们在学习面向对象的编程语言时,会想方设法把功能独立的模块给独立出来,方便复用和维护。

容器也是一样的。虽然理论上可以把所有组件塞到同一个容器中去,但更好的做法是各模块在单独容器中,只要保持必要的通信就可以了。

也就是说,本教程中现在需要两个容器了:

  • 名称叫 app 的 Django 容器
  • 名称叫 db 的 MySQL 容器

所以如何构建 MySQL 镜像?别担心,这么常用的镜像官方已经帮你构建好了,只需要把它从仓库拉取到本地就可以了。

修改上一章写的 docker-compose.yml ,增加 MySQL 容器:

version: "3"
services:
  app:
    restart: always
    build: .
    command: bash -c "python3 manage.py migrate && python3 manage.py runserver 0.0.0.0:8000"
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db
  db:
    image: mysql:5.7
    volumes:
      - "./mysql:/var/lib/mysql"
    ports:
      - "3306:3306"
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=mypassword
      - MYSQL_DATABASE=django_app

app 容器的 command 指令做了修改,让其在运行前先执行数据迁移;新增了配置 depends_on ,意思是此容器需要等待 db 容器启动完毕才能够启动。

分析一下新添加的 db 容器:

  • image :从仓库拉取 MySQL 5.7 。最新版本为 MySQL 8,不过很坑的是新版本修改了用户登录的验证方法,导致很容易出现无法通过身份验证的问题。教程为了简单起见选用 5.7 版本。后期会在教程示例代码中添加[mysql-8]()分支并给出操作方法,有兴趣的读者可以查看。
  • volumes :定义卷(这里实际是挂载),上一章已经讲过了,它实现了宿主机和容器目录的映射。功能是将容器中的 MySQL 数据映射到宿主机。
  • ports :MySQL 默认通信端口为 3306 。
  • environment :定义容器的环境变量,设置了 MySQL 的 root 用户的密码、数据库的名称。

这里为什么要用?就让数据在容器中、保持隔离不好吗?把数据保存在容器中,理论上确实是可以的,但有一个致命的问题,即数据和容器的生命周期挂钩了:万一哪天手贱把容器给删了,连同里面的数据随风而逝,你就是全公司那个删库跑路的传奇人物了。要知道容器的生命周期可能会非常短暂,删除指令也相当顺滑(docker-compose down)。将数据映射到宿主机,容器即使被删除掉,但数据还是安全的躺在你的服务器中的。换句话说,容器内部非常适合运行无状态的应用;涉及到如数据之类有状态的东西,一定要谨慎思考。

Dockerfile

接下来修改 Dockerfile

FROM python:3.7
ENV PYTHONUNBUFFERED 1

# 添加这两行
RUN apt-get update
RUN apt-get install python3-dev default-libmysqlclient-dev -y

RUN mkdir /code
WORKDIR /code
RUN pip install pip -U
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/

增加的两行代码在系统中安装了 MySQL 的连接器,具体解释见官方文档。

其他配置

修改 requirements.txt ,增加 MySQL 驱动:

django==2.2
mysqlclient==1.3.14

然后还需要修改 django_app/settings.py ,将数据库设置为 MySQL:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django_app',
        'USER': 'root',
        'PASSWORD': 'mypassword',
        'HOST': 'db',
        'PORT': '3306',
        'OPTIONS': {'charset': 'utf8mb4'},
    }
}

注意 HOST 填写的是容器的名称,即 db 。

这就可以啦。接下来测试。

测试

测试之前,请先确认没有其他程序占用了 3306 端口,比如宿主机安装的 MySQL。

重新生成镜像:

$ docker-compose build

生成并启动容器:

$ docker-compose up

Creating network "django_app_default" with the default driver
Creating django_app_db_1 ... done
Creating django_app_app_1 ... done
Attaching to django_app_db_1, django_app_app_1
db_1   | 2019-10-06T12:24:57.183860Z 0 [Note] mysqld (mysqld 5.7.27) starting as process 1 ...

...

db_1   | 2019-10-06T12:24:58.120480Z 0 [Note] mysqld: ready for connections.
db_1   | Version: '5.7.27'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)

app_1  | Operations to perform:
app_1  |   Apply all migrations: admin, auth, contenttypes, sessions
app_1  | Running migrations:
app_1  |   Applying contenttypes.0001_initial... OK
...
app_1  |   Applying sessions.0001_initial... OK

app_1  | Watching for file changes with StatReloader
app_1  | Performing system checks...
app_1  | 
app_1  | System check identified no issues (0 silenced).
app_1  | October 06, 2019 - 12:24:58
app_1  | Django version 2.2, using settings 'django_app.settings'
app_1  | Starting development server at http://0.0.0.0:8000/
app_1  | Quit the server with CONTROL-C.

打开浏览器访问 127.0.0.1:8000 ,又能看到 Django 小火箭啦。

注意:第一次启动容器时可能会出现无法连接 MySQL 的错误,这是由于虽然 db 容器已经启动,但初始化并未完成;重新启动容器之后就可以正常工作了。若多次启动都无法正常工作,那就是别的原因了,好好检查吧。

总结

本章加入了 MySQL 容器,并实现了多容器协同工作。

下一章将实现正式部署的 Docker + Django + MySQL + Nginx + Gunicorn 项目。


  • 有疑问请在杜赛的个人网站留言,我会尽快回复。
  • 教程示例代码:django-docker-tutorial
  • 或Email私信我:dusaiphoto@foxmail.com

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Django-Docker容器化部署:

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Django-Docker容器化部署:

上一章我们成功搭建了容器化的 Django 项目,用到的数据库为默认的 Sqlite。Sqlite 虽然简单易用,但是线上部署时通常会选择更高效、更可靠的数据库,比如 MySQL。本章将在上一章的基础上,修改并构建 Docker + Dja
2023-01-31

docker容器化怎么部署

要将应用程序容器化并部署到Docker中,可以按照以下步骤进行操作:编写Dockerfile:创建一个Dockerfile文件来定义容器的构建步骤。Dockerfile包含了基础镜像、安装依赖、复制应用程序代码等指令。构建镜像:使用Dock
2023-10-27

在 Docker 容器中部署 Django 的时区问题

我们期望着通过在 settings.py 中配置以后,Django 就能正确地获取本地时间,但是实际上却事与愿违,我们看一看这两个设置有什么作用。

架构设计:Docker容器化部署

在现代软件开发和部署中,Docker 容器化技术已经成为一种重要的解决方案。它不仅简化了应用程序的构建和部署过程,还提供了跨环境一致性、可移植性和高效性。

Docker容器Consul部署概述

这篇文章主要介绍了Docker容器Consul部署概述,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
2022-11-13

Docker容器如何部署consul

小编给大家分享一下Docker容器如何部署consul,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Consul简介Consul 是一个支持多数据中心分布式高可用
2023-06-29

docker怎么部署django应用

要部署Django应用程序,可以使用Docker进行容器化。下面是一些步骤:1. 创建Django项目:首先,在本地开发计算机上创建Django项目。确保项目可以在本地正常运行,并且所有依赖项都已安装。2. 创建Dockerfile: 在项
2023-08-16

docker怎么部署django项目

要部署Django项目,可以使用Docker进行容器化部署。以下是一些基本的步骤:1. 首先,确保已经在本地安装了Docker和Docker Compose。2. 在你的Django项目根目录下,创建一个名为`Dockerfile`的文件,
2023-10-09

MyBatis视图在Docker容器化部署中的优化策略

在Docker容器化部署中,MyBatis视图的优化策略主要集中在提高性能、安全性和资源利用率上。以下是一些关键策略:优化MyBatis视图性能批量操作优化:使用MyBatis-Plus的saveBatch方法进行批量插入,可以有效提高性
MyBatis视图在Docker容器化部署中的优化策略
2024-10-14

docker容器部署到云服务器

部署到云服务器的方式有很多,其中最简单的方式是使用Docker镜像。这种方式通常是直接将Docker镜像部署到云服务器上的容器中,因此只需要将云服务器与Docker镜像文件连接即可进行部署。下面是一些常见的Docker容器部署方式:镜像部署:将云服务器上的镜像文件复制到容器的DockerHub中,然后将容器的配置文件与镜像文件进行关联,以便在部署云服务器时可以自动选择最佳的配置路径。容器启
2023-10-26

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录