千家信息网

Docker怎么搭建Django+Mariadb环境

发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,这篇文章主要讲解了"Docker怎么搭建Django+Mariadb环境",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Docker怎么搭建Django
千家信息网最后更新 2024年09月22日Docker怎么搭建Django+Mariadb环境

这篇文章主要讲解了"Docker怎么搭建Django+Mariadb环境",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Docker怎么搭建Django+Mariadb环境"吧!

Docker搭建Django+Mariadb环境

阅读建议

先通读全文后,再自行决定需要实践的步骤。后文总是有更简洁更快更好的实践。

不过,新人建议从头到尾实践,也不失为"笨办法学Docker"的美谈一桩。

本文思路:

直接拉取Mariadb镜像,搭建数据库手动Build Django镜像:        以python2.7为基础镜像        让我们做的更好:以Python2.7-slim为基础镜像的优化        "docker -v"&&"docker --link"

源码:git@github.com:AnInputForce/autodepopy.git

基本上是边学边实验,关键步骤都有commit。请各位参考。

环境之"Docker-Mariadb"搭建

参考:在Mac中直接安装Maridb(不推荐),Mac中MariaDB数据库的安装步骤

首先,把你的宿主机mac或linux装上tree命令。没有也没关系,下文有相关的换成ls即可;

下载Mariadb数据库镜像

docker pull mariadb

启动并配置DB

  • 映射数据库数据文件和配置文件

    • 新建~/mariadb/data 、~/mariadb/custom目录

    • -v ~/mariadb/data:/var/lib/mysql 映射数据文件出来

    • -v ~/mariadb/custom:/etc/mysql/conf.d 映射配置文件出来

    • 指定数据库编码utf8mb4,参考:mysql使用utf8mb4经验吐血总结

$ mkdir -p ~/mariadb/data ~/mariadb/custom$ docker run --name my-mariadb -v ~/mariadb/data:/var/lib/mysql   -v ~/mariadb/custom:/etc/mysql/conf.d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1q2w -d mariadb:latest --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

测试验证

$ docker psCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES77de3a6bf3fe        mariadb:latest      "docker-entrypoint..."   2 minutes ago       Up About a minute   0.0.0.0:3306->3306/tcp   my-mariadb$ docker exec -it my-mariadb bashroot@77de3a6bf3fe:/# mysql -uroot -p1q2wWelcome to the MariaDB monitor.  Commands end with ; or \g.....MariaDB [(none)]> show databases;+--------------------+| Database           |+--------------------+| information_schema || mysql              || performance_schema |+--------------------+3 rows in set (0.02 sec)

环境之"Docker-Django"搭建

很意外,翻了翻官方hub 镜像,有如下提示:

This image is officially deprecated in favor of the standard python image;

大致意思是:这个镜像已被标准python镜像取代。该镜像不能直接带来Django环境,仅有的价值是提供一些Django依赖如mysql-client等。或许因为Django是APP级的,依赖于Project的requirements.txt,like this:

只能自己动手,丰衣足食了。正好练练刚学习到的知识。

准备项目目录

  • workspace 工作空间,所有项目大本营:自己习惯

  • autodeploy 自动部署项目的目录:自己习惯

  • z-dev 存放开发环境dockerfile及相关信息:自己习惯

  • z-pub 存放生产环境dockerfile及相关信息:自己习惯

  • .dockerignore 存放不被镜像build时关注的文件:来自Vscode。linux下不可见,具体内容详见此项目github;

$ mkdir -p ~/workspace/autodeploy && cd ~/workspace/autodeploy && mkdir z-dev z-pub

创建Dockerfile

直接使用Python2.7基础镜像,简单粗暴省事,适合想快速体验的孩子:

# 基础镜像FROM python:2.7# 维护者信息MAINTAINER kang.cunhua  # app 所在目录WORKDIR /usr/local/webADD . /usr/local/web/# 安装 app 所需依赖RUN pip install --no-cache-dir -r requirements.txt

创建requirements.txt

Django==1.11.3MySQL-python

宿主机当前目录结构

ChinaDreams:autodeploy kangcunhua$ tree.├── readme.md├── z-dev│   ├── Dockerfile│   └── requirements.txt└── z-pub    └── Dockerfile2 directories, 4 files

Build镜像

当前目录:~\workspace\autodeploy

cd z-dev && docker build -t mydjango:latest .

查看镜像

ChinaDreams:z-dev kangcunhua$ docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEmydjango            latest              90a25c587400        23 seconds ago      699MB

启动运行&进入容器

后台启动:-d 参数,不加就进入bash交互界面了。此处为演示,先run -d后台,再exec进入;

ChinaDreams:z-dev kangcunhua$ docker run --name web -it -p 8000:8000 -d mydjango /bin/bash0b0e757708c29d0aa1799c14b6cd1f19a48e7cd748223064a0ab9205432ed23aChinaDreams:z-dev kangcunhua$ docker exec -it web /bin/bashroot@9326b308aacd:/usr/local/web#

清理和验证环境

清理多余文件

root@9326b308aacd:/usr/local/web# lsrequirements.txtroot@9326b308aacd:/usr/local/web# rm *

验证

root@9326b308aacd:/usr/local/web# python --versionPython 2.7.13root@9326b308aacd:/usr/local/web# python -m django --version1.11.3

脚手架生成项目,启动web服务

root@26ad1dfb070f:/usr/web# django-admin startproject autodeployroot@26ad1dfb070f:/usr/web# cd autodeploy && python manage.py runserver 0:8000

浏览器访问

http://localhost:8000,不出意外,你可以看到传说中的Django欢迎页面:

It worked!Congratulations on your first Django-powered page.

把项目框架copy出来

CONTROL-C退出webserver;然后退出容器:

root@9326b308aacd:/usr/local/web/autodeploy# exitexitChinaDreams:z-dev kangcunhua$ cd ~/workspace && docker cp web:/usr/local/web/autodeploy . && cd autodeploy && rm -rf db.sqlite3 && tree.├── autodeploy│   ├── __init__.py│   ├── __init__.pyc│   ├── settings.py│   ├── settings.pyc│   ├── urls.py│   ├── urls.pyc│   ├── wsgi.py│   └── wsgi.pyc├── manage.py├── readme.md├── z-dev│   ├── Dockerfile│   └── requirements.txt└── z-pub    └── Dockerfile3 directories, 13 files

删除容器web

到此为止,此容器使命已经完成:生成项目初始化目录,删了即可;

ChinaDreams:autodeploy kangcunhua$ docker stop web && docker rm web

新启容器web,挂载本地目录

本地目录优先覆盖容器目录,然后就实时同步了。PS:所以一开始想把容器内某目录挂载出来,比较难。不如先copy出来,清空。然后从本地挂载上去。

"run -d"后台启动,exec执行命令启动web server

ChinaDreams:autodeploy kangcunhua$  docker run --name web -d -it -p 8000:8000 -v ~/workspace:/usr/local/web  mydjango /bin/bash2bf0f6d17f1d103a37a7992393e1f97483034cdadb01df6cf49ab4e1d8746f62ChinaDreams:autodeploy kangcunhua$ docker exec -it web /bin/bash -c "cd autodeploy&&python manage.py runserver 0:8000"

运行,收获Django欢迎界面

http://localhost:8000

It worked!Congratulations on your first Django-powered page.

欢庆吧,少年!

让我们做的更好

需要清醒的是,还有以下问题

  • 我们此时还未使用到Mariadb,默认使用的是SqlLite数据库。接下来我们看看,从web容器中如何访问数据库;

  • 我们默认使用的是Python的基础库,安装完django体积达到了惊人的近700M。

  • 在docker pull安装镜像时,简直是龟速:由于众所周知的原因

  • 在pip install 安装python模块是,也和龟速差不多了:由于众所周知的原因

  • 我们能不能做的更好?答案是,必须能!

改进我们的Dockerfile

# 基础镜像FROM python:2.7-slim# 维护者信息MAINTAINER kang.cunhua  # app 所在目录WORKDIR /usr/src/webADD . /usr/src/web# 安装 app 所需依赖,做一些清理工作RUN     buildDeps='gcc'; \         deveDeps='mysql-client'; \         set -x \        && cp /etc/apt/sources.list /etc/apt/sources.list.backup \        && mv sources.list /etc/apt/sources.list \        && apt-get update && apt-get install -y libmysqlclient-dev $buildDeps $deveDeps \        # When using Python 2.7, please install IPython 5.x LTS Long Term Support version.        && pip install --no-cache-dir -r requirements.txt ipython==5.4.1 \        -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com  \        && rm -rf requirements.txt \        # 移除gcc        && apt-get purge -y --auto-remove $buildDeps

注释已经不少了,对于新增的内容,还有些解释如下:

python:2.7-slim

改用更小的slim镜像。一是减小构建镜像大小,二是可以从精简版折腾开始,复习巩固Dockerfile的知识。

比对下前后两个构建完毕的镜像打下,安装了一大堆工具,镜像减小了1/2的体积。之所以第二个镜像repository:tag都为none,是因为我们这次打包的镜像也使用了mydjango:latest。

ChinaDreams:z-dev kangcunhua$ docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEmydjango            latest              8fee1723a96c        2 minutes ago       355MB                            90a25c587400        About an hour ago   699MB

sources.list

python的镜像使用的Debian,版本是jessie。找到了国内阿里云的加速镜像。

deb http://mirrors.aliyun.com/debian/ jessie main non-free contribdeb http://mirrors.aliyun.com/debian/ jessie-proposed-updates main non-free contribdeb-src http://mirrors.aliyun.com/debian/ jessie main non-free contribdeb-src http://mirrors.aliyun.com/debian/ jessie-proposed-updates main non-free contrib

mirrors.aliyun.com

同样使用的是阿里云的python pip源,安装时指定阿里云的源,并信任即可即可:

-i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

安装mysql-client

是因为"python manage.py dbshell"命令需要。此命令可以方便操作数据库,并自动加载了一些环境变量;开发环境还是用得到的;生成环境可以移除;若不安装,执行命令python manage.py dbshell时,会提示

CommandError: You appear not to have the 'mysql' program installed or on your path.

安装和卸载gcc

因为MySQL-python的安装依赖gcc。网上也有说安装MySQL-devel包就能解决,暂不需要,也有提示把这些python-devel mysql-devel zlib-devel openssl-devel,都安装上就好了,太多了。只安装gcc,用完之后再卸载即可。

不安装gcc在build时编译MySQL-python报错:

unable to execute 'gcc': No such file or directoryerror: command 'gcc' failed with exit status 1

安装ipython==5.4.1

是因为"python manage.py shell"进入交互式命令行会用到。不安装不方便。如果你安装了ipython 会自动用它们的界面。ipython是一套增强交互式Shell,用过的都说好;当然:生产环境可以不用安装。

开始重新构建

准备:创建数据库

ChinaDreams:autodeploy kangcunhua$ docker exec -d my-mariadb mysql -uroot -p1q2w -e "create database mydeploy;"

准备:修改DB配置

删除db.sqlite3,之前虽然copy时删除了,但是运行webserver时默认配置的还是sqlite3,所以又生成了。

cd ~/workspace/autodeploy && rm db.sqlite3

进入web容器,修改/autodeploy/autodeploy/settings.py中DATABASES配置:

docker exec -it web /bin/bash

因为我们已经做了本地映射,直接用Vscode修改对应配置文件也是有效的;

注意'HOST': 'db'中,db就是我们在link中配置的别名。

DATABASES = {      'default': {          'ENGINE': 'django.db.backends.mysql',          'NAME': 'mydeploy',          'USER': 'root',          'PASSWORD': '1q2w',          'HOST': 'db',          'PORT': '3306',      }  }

Build镜像

当前目录:~\workspace\autodeploy

cd z-dev && docker build -t mydjango:latest .

查看镜像

ChinaDreams:z-dev kangcunhua$ docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEmydjango            latest              90a25c587400        23 seconds ago      699MB

Web容器访问Mariadb数据库

这时,就不得不提"--link"命令的使用了:

-link name:alias

name是我们连接容器的名字,alias是link的别名。比如我们连接了数据库容器的web容器,就可以拿alias来配置数据库连接了。见下文:我们在启动容器时link数据库:

不加这个link,你在web容器中,是连不上127.0.0.1:3306的。即使暴露了3306端口;

后台启动数据库(-d)

此时我们数据库应该是启动的,如果docker ps发现没有启动,没关系,敲如下命令启动:

docker run --name my-mariadb -v ~/mariadb/data:/var/lib/mysql   -v ~/mariadb/custom:/etc/mysql/conf.d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1q2w -d mariadb:latest --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

为项目创建数据库mydeploy,如果有错误,先查日志

docker exec -d my-mariadb mysql -uroot -p1q2w -e "create database mydeploy;" docker logs my-mariadb

启动web容器link数据库容器

docker run --name web  --link=my-mariadb:db -it -p 8000:8000 -v ~/workspace:/usr/src/web  -d mydjango:latest /bin/bash e309fd9e718faf6629ce668860d5c9392c52da4f649f4307abf632a15b67285c

验证环境命令

分别是:检查python版本、检查django版本、进入dbshell操作数据库、进入ipython;

python --versionpython manage.py -m django --version./manage.py dbshell./manage.py shell

创建管理员

先migrate数据库,在创建管理员

ChinaDreams:z-dev kangcunhua$ docker exec -it web /bin/bashroot@e309fd9e718f:/usr/src/web# cd autodeploy/root@e309fd9e718f:/usr/src/web/autodeploy# python manage.py migrateroot@e309fd9e718f:/usr/src/web/autodeploy# python manage.py createsuperuser

启动web服务器

在web容器中,执行

 python manage.py runserver 0:8000

在宿主机上访问

http://localhost:8000

就可以看到传说中的Django欢迎页:"It works!"。查看数据库,也有对应的表创建了。

登录后台,也可以看到对应自动生成好的页面

http://localhost:8000/admin

MySql客户端推荐

对了,mac下MySQL或Mariadb客户端,推荐Sequel Pro,免费且超级好用,比Oracle官方的都好用。

能不能做的更好

答案是:能,必须能!比如我们可以引进docker compose来创建几个微服务,整合指挥整个系统架构;

让我们引入docker-compose

docker-compse是我们容器集群的众多微服务管理利器。

修订dockerfile

不使用文件的方式更新源,改为在dockfile中直接用命令写入阿里云的源,方便在git中管理版本。

来一份完整的dockerfile参考:

# 基础镜像FROM python:2.7-slim# 维护者信息MAINTAINER kang.cunhua  # app 所在目录WORKDIR /usr/local/webADD . /usr/local/web# 安装 app 所需依赖,做一些清理工作RUN     buildDeps='gcc'; \         deveDeps='mysql-client'; \         set -x \        && mv /etc/apt/sources.list /etc/apt/sources.list.bak  \    && echo "deb http://mirrors.aliyun.com/debian/ jessie main non-free contrib" >/etc/apt/sources.list \    && echo "deb http://mirrors.aliyun.com/debian/ jessie-proposed-updates main non-free  contrib" >>/etc/apt/sources.list \    && echo "deb-src http://mirrors.aliyun.com/debian/ jessie main non-free contrib" >>/etc/apt/sources.list \    && echo "deb-src http://mirrors.aliyun.com/debian/ jessie-proposed-updates main non-free contrib" >>/etc/apt/sources.list \        && apt-get update && apt-get install -y libmysqlclient-dev $buildDeps $deveDeps \        # When using Python 2.7, please install IPython 5.x LTS Long Term Support version.        && pip install --no-cache-dir -r requirements.txt ipython==5.4.1 \        -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com  \        && rm -rf requirements.txt \        # 移除gcc        && apt-get purge -y --auto-remove $buildDeps

dockercompose.yml

version: '2'services:  db:    image: mariadb    expose:      - "3306"    volumes:      - ~/mariadb/data:/var/lib/mysql      - ~/mariadb/custom:/etc/mysql/conf.d    environment:      - MYSQL_DATABASE=mydeploy      - MYSQL_ROOT_PASSWORD=1q2w        - ON_CREATE_DB="mydeploy"      - COMPOSE_PROJECT_NAME=autodeploy    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci  web:    build:        context: .     image: mydjango:latest    volumes:      - ~/workspace:/usr/local/web    ports:      - "8000:8000"    links:      - db    command: python ./autodeploy/manage.py runserver 0.0.0.0:8000

启动并访问

 docker-compose up

migrateDB、创建管理员

ChinaDreams:z-dev kangcunhua$ docker exec -it zdev_web_1 /bin/bashroot@e309fd9e718f:/usr/local/web# cd autodeploy/root@e309fd9e718f:/usr/local/web/autodeploy# python manage.py migrateroot@e309fd9e718f:/usr/local/web/autodeploy# python manage.py createsuperuser

校验环境变量

root@e309fd9e718f:/usr/local/web/autodeploy# python manage.py dbshellshow variables like 'character_set_database';show variables like 'collation_%';

排错命令

基本上docker 能用的命令,docker-compose也能用

docker-compose up -d # 后台启动docker-compose logs                # 查看微服务群日志docker-compose ps          # 查看微服务群容器状态

指定Project名启动

如果不指定,默认容器服务的name是"当前目录_service_number",比如"zdev_web_1",指定为autoploy后,应该会变成_"autodeploy__web_1"。

COMPOSE_PROJECT_NAME=autodeploy docker-compose updocker-compose -p autodeploy up

访问

  • http://localhost:8000

  • http://localhost:8000/admin

    • 因为加载了之前的数据库文件,所以之前的仍旧能用:

    • 账号是之前创建好的 admin/root8888

当前文件目录

ChinaDreams:workspace kangcunhua$ tree.└── autodeploy    ├── autodeploy    │   ├── __init__.py    │   ├── __init__.pyc    │   ├── settings.py    │   ├── settings.pyc    │   ├── urls.py    │   ├── urls.pyc    │   ├── wsgi.py    │   └── wsgi.pyc    ├── manage.py    ├── readme.md    ├── z-dev    │   ├── Dockerfile    │   ├── docker-compose.yml    │   ├── requirements.txt    │   └── sources.list    └── z-pub        └── Dockerfile4 directories, 15 files

参考列表

Mariadb在Docker下安装配置

参考:Start a mariadb server instance,强烈推荐。

参考: docker(6):使用dokcer 构建 mariadb 数据库

使用一个最简单的办法安装了mariadb。并且将数据放到了宿主机的/data/mysql/data 目录下面了。 方便数据备份,数据迁移,同时暴露了3306端口对外。 使用docker还是非常的方便的,比起yum安装配置简单多了。 配置文件也可以通过目录映射的方式修改。 而且完全的拆分了服务,存储,接口。真的是一个集装箱了。

Mac tree命令

参考:mac tree命令及参数

$ brew install tree

Django 文档

  • Getting Started

    • Writing your first Django app, part 1

    • Writing your first Django app, part 2

感谢各位的阅读,以上就是"Docker怎么搭建Django+Mariadb环境"的内容了,经过本文的学习后,相信大家对Docker怎么搭建Django+Mariadb环境这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

数据 镜像 数据库 容器 目录 环境 命令 配置 文件 项目 参考 服务 基础 后台 信息 生成 管理 验证 内容 宿主 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 西山区创新软件开发价格走势 邯郸市中拓网络技术有限公司 数据库中创建用户名和密码 舟山学软件开发项目 网络安全等级测评公司好做吗 PUBG亚服服务器在哪儿 腾讯会议服务器链接异常 网络安全知识科普题库小学 南京汽车电子基础软件开发 传奇2怎么防止服务器被人攻击 网络安全构建原则 数据库查询表格中的日期格式 锐捷无法认证服务器 flask 数据库同步 网络安全系统年度总结大纲 网络安全工程师前景 笔记本安装数据库时可以合上吗 日本人负责网络安全吗 数据库课程设计牙医诊所 普陀区口碑好的软件开发诚信为本 服务器主板点不亮是怎么回事 数据库连接输入不了中文 网络安全总结汇报 吉林特色软件开发生产厂家 江苏数字化管理软件开发 rds实例中用户创建几个数据库 工业组态数据库标准点类型有 gui查询数据库 赢时胜软件开发中心北京分部 社区发布网络安全审查
0