设为首页 收藏本站
查看: 1061|回复: 0

[经验分享] Docker 搭建 Django+Mariadb 环境

[复制链接]

尚未签到

发表于 2019-2-20 08:45:55 | 显示全部楼层 |阅读模式
阅读建议
  先通读全文后,再自行决定需要实践的步骤。后文总是有更简洁更快更好的实践。
  不过,新人建议从头到尾实践,也不失为“笨办法学 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 ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
77de3a6bf3fe        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 bash
root@77de3a6bf3fe:/# mysql -uroot -p1q2w
Welcome 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 级的,依赖于 Projec t的 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/web
ADD . /usr/local/web/
# 安装 app 所需依赖
RUN pip install --no-cache-dir -r requirements.txt
创建 requirements.txt

Django==1.11.3
MySQL-python
宿主机当前目录结构

ChinaDreams:autodeploy kangcunhua$ tree
.
├── readme.md
├── z-dev
│   ├── Dockerfile
│   └── requirements.txt
└── z-pub
└── Dockerfile
2 directories, 4 files
Build 镜像
  当前目录:~\workspace\autodeploy

cd z-dev && docker build -t mydjango:latest .
查看镜像

ChinaDreams:z-dev kangcunhua$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mydjango            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/bash
0b0e757708c29d0aa1799c14b6cd1f19a48e7cd748223064a0ab9205432ed23a
ChinaDreams:z-dev kangcunhua$ docker exec -it web /bin/bash
root@9326b308aacd:/usr/local/web#
  清理和验证环境
清理多余文件

root@9326b308aacd:/usr/local/web# ls
requirements.txt
root@9326b308aacd:/usr/local/web# rm *
  验证

root@9326b308aacd:/usr/local/web# python --version
Python 2.7.13
root@9326b308aacd:/usr/local/web# python -m django --version
1.11.3
脚手架生成项目,启动 web 服务

root@26ad1dfb070f:/usr/web# django-admin startproject autodeploy
root@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# exit
exit
ChinaDreams: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
└── Dockerfile
3 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/bash
2bf0f6d17f1d103a37a7992393e1f97483034cdadb01df6cf49ab4e1d8746f62
ChinaDreams: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/web
ADD . /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 images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mydjango            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 contrib
deb http://mirrors.aliyun.com/debian/ jessie-proposed-updates main non-free contrib
deb-src http://mirrors.aliyun.com/debian/ jessie main non-free contrib
deb-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 directory
error: 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 images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mydjango            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 --version
python manage.py -m django --version
./manage.py dbshell
./manage.py shell
创建管理员
  先 migrate 数据库,在创建管理员

ChinaDreams:z-dev kangcunhua$ docker exec -it web /bin/bash
root@e309fd9e718f:/usr/src/web# cd autodeploy/
root@e309fd9e718f:/usr/src/web/autodeploy# python manage.py migrate
root@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/web
ADD . /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/bash
root@e309fd9e718f:/usr/local/web# cd autodeploy/
root@e309fd9e718f:/usr/local/web/autodeploy# python manage.py migrate
root@e309fd9e718f:/usr/local/web/autodeploy# python manage.py createsuperuser
校验环境变量

root@e309fd9e718f:/usr/local/web/autodeploy# python manage.py dbshell
show 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_web1”,指定为 autoploy 后,应该会变成”autodeploy__web_1”。

COMPOSE_PROJECT_NAME=autodeploy docker-compose up
docker-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
└── Dockerfile
4 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 + k8s
  此课程为网络直播课程,一共 10 个课时,每周上一个全天,历时两个多月。附加:录播视频+笔记+除课堂外的答疑时间(7次+)2019-1-13 开课,原价 5800 ,现在周年活动 100 定金抵 800



课程主讲师:GY 老师
  10 年一线软件开发经验,先后经历了传统安全公司,以及多家互联网公司;在安全开发方面,曾开发过 Linux 防火墙、web 应用防火墙、Linux 安全内核加固,基于大流量的 Web 安全威胁分析等项目;在互联网公司工作时,曾基于 DPDK 高性能网络开发框架开发过基于全流量的网络流量分析平台和基于 Sflow 网络流量分析平台,基于Golang 开发SmartDNS 等;开发语言也是从C -> python -> golang 的转变过程?现从事基于 K8S 和 Docker在私有云平台建设方面的研发工作;具备丰富的Linux系统开发经验、网络开发经验以及项目管理经验;目前开发工作90+% 都在用 Golang,Golang 是一门简洁、高效、强大且灵活的编程语言。
  关于课程的具体内容想要了解的, 添加加小助手WeChat:17812796384 咨询了解
  本文由作者:蛮大人  授权发布
链接:https://opsdev.fun/2017/07/17/O1-8-02-Docker%E6%90%AD%E5%BB%BADjango-Mariadb%E7%8E%AF%E5%A2%83/
著作权归作者所有。
转载请联系作者获得授权。




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-674649-1-1.html 上篇帖子: 循序渐进Docker(一)docker简介、安装及docker image管理 下篇帖子: Docker中无法停止或删除容器服务问题处理
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表