详解如何使用Docker部署Django+MySQL8开发环境

前一段时间重装了系统,然后我还没有备份,导致电脑里的开发环境全都没有了。

一想到又要装 Python 环境,还要装数据库,然后安装过程中还可能报一堆错就头疼。

最近正在学习 Docker,这不正好解决了我当前的痛点了吗?而且,不止这次重装系统,以后再重装都不怕了,只要拿着 Dockerfile 和 docker-compose 文件,不管到什么环境,一条命令轻松跑起来。

之前部署 Python 开发环境,都是用的 virtualenv,或者是 Pipenv。这次使用 Docker 之后,对比下来,还是 Docker 更加方便,下面就来详细介绍。

Dockerfile

FROM python:3.6.8

ENV PYTHONUNBUFFERED 1

RUN mkdir -p /code
COPY ./requirements.txt /code

WORKDIR /code

RUN sed -i "s/archive.ubuntu./mirrors.aliyun./g" /etc/apt/sources.list
RUN sed -i "s/deb.debian.org/mirrors.aliyun.com/g" /etc/apt/sources.list

RUN apt-get clean && apt-get -y update && \
 apt-get -y install libsasl2-dev python-dev libldap2-dev libssl-dev libsnmp-dev
RUN pip3 install --index-url https://mirrors.aliyun.com/pypi/simple/ --no-cache-dir -r requirements.txt

COPY ./* /code/

使用 Dockerfile 来创建镜像,Python 版本是 3.6.8,将源代码拷贝到容器中 /code 目录。

docker-compose

version: '3'

services:
 web:
 build:
  context: .
  dockerfile: Dockerfile
 image: web
 container_name: web
 hostname: web
 restart: always
 command: python /code/manage.py runserver 0.0.0.0:8000
 volumes:
  - .:/web
 ports:
  - "8000:8000"
 depends_on:
  - mysql 

 mysql:
 image: mysql
 container_name: mysql
 hostname: mysql
 restart: always
 command: --default-authentication-plugin=mysql_native_password --mysqlx=0
 ports:
  - 3306:3306
 volumes:
  - ./db:/var/lib/mysql
 environment:
  - MYSQL_HOST=localhost
  - MYSQL_PORT=3306
  - MYSQL_DATABASE=dev
  - MYSQL_USER=dev
  - MYSQL_PASSWORD=123456
  - MYSQL_ROOT_PASSWORD=123456

使用 docker-compose 来编排容器,一共启两个服务,web 服务就是后台的 Django 服务,mysql 是数据库服务。

有三点需要注意:

  • web 服务使用 depends_on 命令,表示依赖于 mysql 服务。
  • mysql 服务一定要加 --default-authentication-plugin=mysql_native_password 命令。因为从 MySQL 8.0 开始,默认的加密规则使用的是 caching_sha2_password,而我们的客户端并不支持。之前使用的是 mysql_native_password。
  • 使用 volumes 来持久化数据,否则容器删除之后,数据就都丢了。

requirements

Django==2.2.11
mysqlclient==1.4.6

启动 Django 需要的 pip 包,Django 版本至少要 2.0,否则会报错。

Django settings
DATABASES = {
 'default': {
  'ENGINE': 'django.db.backends.mysql',
  'NAME': 'dev',
  'USER': 'dev',
  'PASSWORD': '123456',
  'HOST': 'mysql',
  'PORT': '3306'
 }
}

在 Django settings 文件中配置数据库信息,内容需要与 docker-compose 中一致。

有一点需要注意,HOST 一定要配置成 docker-compose 中的服务名称,在我这里是 mysql。配置成其他,比如 localhost 或者 127.0.0.1 会报错。

因为 Docker 启动时会设置一个本地网络,可以将 mysql 解析到对应服务的容器,而对应的服务并不在 localhost 上。

Run

使用如下命令创建镜像。

$ docker-compose -f ./docker-compose.yml build

也可以省略上一步,直接使用如下命令启动服务,如果没有镜像,会先创建镜像,然后再启动服务。

$ docker-compose -f ./docker-compose.yml up

排错

在部署过程中,可能会碰到如下这些错误,基本都是配置错误造成的。如果发生了,一定要仔细检查配置,只要和文中相同,是不会有问题的。

  • 'Plugin caching_sha2_password could not be loaded: /usr/lib/x86_64-linux-gnu/mariadb19/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory'
  • django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
  • django.db.utils.OperationalError: (2002, "Can't connect to MySQL server on 'db' (115)")
  • django.db.utils.OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)")
  • django.db.utils.OperationalError: (2002, "Can't connect to MySQL server on '127.0.0.1' (115)")
  • django.db.utils.OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)")

我还遇到一个比较坑的问题是这个:

[Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.

我以为是我的密码设置不正确,检查了好久都没发现问题,后来在网上找到了解释,直接忽略就行了。

That is just a warning printed by during database file initialization (mysqld --initialize-insecure). The root user with password is created later while the database is listening only on the unix socket.

参考文档:

http://fusionblender.net/django-and-mysql-8-using-docker/
https://github.com/docker-library/mysql/issues/307
https://www.jianshu.com/p/4eafa4f87fd5

到此这篇关于详解如何使用Docker部署Django+MySQL8开发环境的文章就介绍到这了,更多相关Docker部署Django+MySQL8内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Docker安装MySQL8的方法步骤

    一.下载镜像 docker Hub官网URL:https://hub.docker.com/_/mysql/ 下载最新版本:docker pull mysql 下载指定版本:docker pull mysql:verison(8.0.11,8.0,8) 二.启动镜像 复制代码 代码如下: docker run  -d --name mysql -v /data/datadir:/var/lib/mysql -v /etc/mysql/my.cnf:/etc/mysql/my.cnf -p 330

  • Docker版的MySQL5.7升级到MySQL8.0.13,数据迁移

    1.备份旧的MySQL5.7的数据 记得首先要备份旧的数据,防止升级失败导致数据丢失.备份的方式有两种,一种是在宿主机直接执行导出命令,另外一种是先进入Docker环境下进行操作.主要的导出命令如下: #方式一,直接在宿主机器进行数据备份 # 0df568 是docker的id ;-uroot -p123456 是用户名和密码;dbA dbB是要备份的数据,--databases 后面可以接多个数据库名,导出的sql到/root/all-databases3306.sql docker exec

  • Docker安装MySQL8.0的实现方法

    环境:MacOS_Cetalina_10.15.1.Mysql8.0.18.Docker_2.0.0.3 1.docker仓库搜索mysql docker search mysql 2.docker仓库拉取mysql8.0 docker pull mysql:8.0 备注: docker pull mysql //默认拉取最新版本 3.查看本地仓库镜像是否下载成功 docker images mysql:8.0 4.安装运行mysql8.0容器 docker run -p 3307:3306 -

  • 详解如何使用Docker部署Django+MySQL8开发环境

    前一段时间重装了系统,然后我还没有备份,导致电脑里的开发环境全都没有了. 一想到又要装 Python 环境,还要装数据库,然后安装过程中还可能报一堆错就头疼. 最近正在学习 Docker,这不正好解决了我当前的痛点了吗?而且,不止这次重装系统,以后再重装都不怕了,只要拿着 Dockerfile 和 docker-compose 文件,不管到什么环境,一条命令轻松跑起来. 之前部署 Python 开发环境,都是用的 virtualenv,或者是 Pipenv.这次使用 Docker 之后,对比下来

  • 详解springboot项目docker部署实践

    网上查了下大部分boot项目部署都是在linux和docker hub环境下完成的,由于本人开发环境在windows下面,并且docker容器也是使用的docker tools,而且也没有做docker hub的加速.所以就尝试在windows环境下利用阿里云docker仓库完成部署. 1.在docker tools 中新建文件夹,并且找到位置,然后把打包好的boot jar文件放入新建的文件夹中 在该文件夹下面新建一个Dockerfile文件,示例如下: FROM daocloud.io/ja

  • 详解Windows下运用Docker部署Node.js开发环境

    开始 在windows下部署nodejs开发环境着实遍地坑,每遇到一个问题都要去google原因再试图解决.而且如果你想把你写好的应用交给别人跑跑看,他可能同样需要折腾很久才能真正在他的环境下运行起来.被坑了好些时日最终还是放弃,转战Docker. 文章开头先明确一下我们希望实现的效果: 1.依然在Windows下编辑源代码,在Docker容器中运行代码,最后在Windows的浏览器中看到运行结果,方便后续debug. 2.可以将我开发完成的程序和运行环境一起打包制作成Docker的image,

  • 详解如何使用Docker部署一个web项目并打包成镜像文件

    docker基本入门以后,可以试试打包docker镜像与dockerfile了 docker镜像 docker hub仓库有2类仓库,用户仓库和顶层仓库,用户仓库由docker用户创建的,顶层仓库由docker内部的人来管理的.仓库里存放的是镜像文件,那么问题来了 ,怎么去创建镜像呢? how to create image 构建docker镜像的有2种方法: 1.使用docker commit命令. 2.使用docker build 命令和Dockerfile文件.在这里并不推荐使用docke

  • 详解如何利用docker快速构建MySQL主从复制环境

    在学习MySQL的过程中,常常会测试各种参数的作用.这时候,就需要快速构建出MySQL实例,甚至主从. 考虑如下场景: 譬如我想测试mysqldump在指定--single-transaction参数的情况下,对于myisam表的影响. 本来想在现成的测试环境中进行,但测试环境中,有大量的数据,执行mysqldump进行全备,产生的SQL文件,很难基于表进行搜索. 这个时候,就特别渴望能有一套干净的实例进行测试. 此刻,快速构建能力就显得尤为必要,很多童鞋可能会问,通过脚本不就能实现么?为什么要

  • 详解基于webpack和vue.js搭建开发环境

    前言 在对着产品高举中指怒发心中之愤后,真正能够解决问题的是自身上的改变,有句话说的好:你虽然改变不了全世界,但是你有机会改变你自己.秉承着"不听老人言,吃亏在眼前"的优良作风,我还是决定玩火自焚. 问题所在 之前的项目总结为以下内容: 1.AMD模块规范开发,使用requirejs实现,使用rjs打包,最终导致的结果是,输出的项目臃肿,肿的就像一坨狗不理--不忍直视 2.使用gulp进行打包,这一点貌似没有可吐槽的地方,毕竟都是被grunt折磨过来的-- 3.数据的渲染使用模板引擎,

  • 详解用Webpack与Babel配置ES6开发环境

    安装 Webpack 安装: # 本地安装 $ npm install --save-dev webpack webpack-cli # 全局安装 $ npm install -g webpack webpack-cli 在项目根目录下新建一个配置文件-- webpack.config.js 文件: const path = require('path'); module.exports = { mode: 'none', entry: './src/index.js', output: { f

  • 详解如何用webpack4从零开始构建react开发环境

    项目文件准备: 执行npm init,然后创建如下图所示的文件. 在index.html里面添加 <!DOCTYPE html> <html> <head> <title>The Minimal React Webpack Babel Setup</title> </head> <body> <div id="app"></div> <script src="./

  • 使用docker部署django技术栈项目的方法步骤

    随着Docker的普及成熟,已经逐渐成为部署项目的首选,今天来和大家分享下如何使用docker部署django技术栈项目. 我们这里说的Django技术栈为:python3.6.Django2.2.redis.mysql.celery.gunicorn和nginx.在实际的生产项目中,这些组件分布在集群的不同机器,如Nginx.redis和Mysql可能会有单独的团队或部门负责.涉及的部署架构和容器的编排会更为复杂,本文暂不去深究.本文主要介绍,如何使用 docker-compose 来编排这些

  • Docker 部署Django项目的方法示例

    使用docker部署django项目也很简单,挺不错,分享下 环境 默认你已安装好docker环境 django项目大概结构 (p3s) [root@opsweb]# tree opsweb opsweb ├── apps ├── logs ├── manage.py ├── media ├── opsweb ├── README.md ├── requirements.txt └── static 编写Dockerfile 这里指定 Python 版本为docker官方提供的 "0.0.0.0

随机推荐