Docker 搭建 Django+Mariadb 环境

栏目: Python · 发布时间: 6年前

内容简介:先通读全文后,再自行决定需要实践的步骤。后文总是有更简洁更快更好的实践。不过,新人建议从头到尾实践,也不失为“笨办法学 Docker ”的美谈一桩。本文思路:

一、阅读建议

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

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

本文思路:

直接拉取 Mariadb 镜像,搭建数据库

手动 Build Django 镜像:

python 2.7 为基础镜像

让我们做的更好:以 Python2.7-slim 为基础镜像的优化

"docker -v"&&"docker --link"

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

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

二、正文

环境之“Docker-Mariadb”搭建

参考:在 Mac 中直接安装 Maridb(不推荐),Mac 中 MariaDB 数据库的安装步骤( https://www.jb51.net/article/93202.htm

首先,把你的宿主机 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 <kangcunhua@git.com.cn> # 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 <kangcunhua@git.com.cn> # 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<none>              <none>              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

安装和卸载 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时默认配置的还是 sqlite 3,所以又生成了。

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 <kangcunhua@git.com.cn> # 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

访问

当前文件目录

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

51Reboot 最新课程招生信息

docker + k8s

此课程为网络直播课程,一共 10 个课时,每周上一个全天,历时两个多月。附加:录播视频+笔记+除课堂外的答疑时间(7次+)2019-1-13 开课,原价 5800 ,现在周年活动 100 定金抵 800(活动马上结束)

Docker 搭建 Django+Mariadb 环境
Docker 搭建 Django+Mariadb 环境

课程主讲师

GY 老师:

10年一线软件开发经验,先后经历了传统安全公司,以及多家互联网公司;在安全开发方面,曾开发过 Linux 防火墙、web 应用防火墙、Linux 安全内核加固,基于大流量的 Web 安全威胁分析等项目;在互联网公司工作时,曾基于 DPDK 高性能网络开发框架开发过基于全流量的网络流量分析平台和基于 Sflow 网络流量分析平台,基于 Golang 开发 SmartDNS 等;开发语言也是从C -> python -> golang 的转变过程?现从事基于 K8S 和 Docker在私有云平台建设方面的研发工作;具备丰富的Linux系统开发经验、网络开发经验以及项目管理经验;目前开发工作90+% 都在用 Golang,Golang 是一门简洁、高效、强大且灵活的编程语言。

关于课程的具体内容想要了解的, 扫码加小助手咨询

Docker 搭建 Django+Mariadb 环境

扫码咨询,备注“公开课,来源简书”


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

High Performance Python

High Performance Python

Micha Gorelick、Ian Ozsvald / O'Reilly Media / 2014-9-10 / USD 39.99

If you're an experienced Python programmer, High Performance Python will guide you through the various routes of code optimization. You'll learn how to use smarter algorithms and leverage peripheral t......一起来看看 《High Performance Python》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器