这篇文章主要讲解了“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。请各位参考。
参考:在Mac中直接安装Maridb(不推荐),Mac中MariaDB数据库的安装步骤
首先,把你的宿主机mac或linux装上tree命令。没有也没关系,下文有相关的换成ls即可;
docker pull mariadb
映射数据库数据文件和配置文件
新建~/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)
很意外,翻了翻官方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
直接使用Python2.7基础镜像,简单粗暴省事,适合想快速体验的孩子:
# 基础镜像 FROM python:2.7 # 维护者信息 MAINTAINER kang.cunhua <kangcunhua@git.com.cn> # app 所在目录 WORKDIR /usr/local/web ADD . /usr/local/web/ # 安装 app 所需依赖 RUN pip install --no-cache-dir -r 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
当前目录:~\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
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.
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
到此为止,此容器使命已经完成:生成项目初始化目录,删了即可;
ChinaDreams:autodeploy kangcunhua$ docker stop web && docker rm 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"
http://localhost:8000
It worked! Congratulations on your first Django-powered page.
欢庆吧,少年!
我们此时还未使用到Mariadb,默认使用的是SqlLite数据库。接下来我们看看,从web容器中如何访问数据库;
我们默认使用的是Python的基础库,安装完django体积达到了惊人的近700M。
在docker pull安装镜像时,简直是龟速:由于众所周知的原因
在pip install 安装python模块是,也和龟速差不多了:由于众所周知的原因
我们能不能做的更好?答案是,必须能!
# 基础镜像 FROM python:2.7-slim # 维护者信息 MAINTAINER kang.cunhua <kangcunhua@git.com.cn> # 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
注释已经不少了,对于新增的内容,还有些解释如下:
改用更小的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 <none> <none> 90a25c587400 About an hour ago 699MB
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
同样使用的是阿里云的python pip源,安装时指定阿里云的源,并信任即可即可:
-i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
是因为“python manage.py dbshell”命令需要。此命令可以方便操作数据库,并自动加载了一些环境变量;开发环境还是用得到的;生成环境可以移除;若不安装,执行命令python manage.py dbshell
时,会提示
CommandError: You appear not to have the 'mysql' program installed or on your path.
因为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
是因为“python manage.py shell”进入交互式命令行会用到。不安装不方便。如果你安装了ipython 会自动用它们的界面。ipython是一套增强交互式Shell,用过的都说好;当然:生产环境可以不用安装。
ChinaDreams:autodeploy kangcunhua$ docker exec -d my-mariadb mysql -uroot -p1q2w -e "create database mydeploy;"
删除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', } }
当前目录:~\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
这时,就不得不提“--link”命令的使用了:
—link name:alias
name是我们连接容器的名字,alias是link的别名。比如我们连接了数据库容器的web容器,就可以拿alias来配置数据库连接了。见下文:我们在启动容器时link数据库:
不加这个link,你在web容器中,是连不上127.0.0.1:3306的。即使暴露了3306端口;
此时我们数据库应该是启动的,如果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
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容器中,执行
python manage.py runserver 0:8000
在宿主机上访问
http://localhost:8000
就可以看到传说中的Django欢迎页:“It works!”。查看数据库,也有对应的表创建了。
登录后台,也可以看到对应自动生成好的页面
http://localhost:8000/admin
对了,mac下MySQL或Mariadb客户端,推荐Sequel Pro,免费且超级好用,比Oracle官方的都好用。
答案是:能,必须能!比如我们可以引进docker compose来创建几个微服务,整合指挥整个系统架构;
docker-compse是我们容器集群的众多微服务管理利器。
不使用文件的方式更新源,改为在dockfile中直接用命令写入阿里云的源,方便在git中管理版本。
来一份完整的dockerfile参考:
# 基础镜像 FROM python:2.7-slim # 维护者信息 MAINTAINER kang.cunhua <kangcunhua@git.com.cn> # 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
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
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 # 查看微服务群容器状态
如果不指定,默认容器服务的name是"当前目录_service_number",比如"zdev_web_1",指定为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
参考:Start a mariadb
server instance,强烈推荐。
参考: docker(6):使用dokcer 构建 mariadb 数据库
使用一个最简单的办法安装了mariadb。并且将数据放到了宿主机的/data/mysql/data 目录下面了。 方便数据备份,数据迁移,同时暴露了3306端口对外。 使用docker还是非常的方便的,比起yum安装配置简单多了。 配置文件也可以通过目录映射的方式修改。 而且完全的拆分了服务,存储,接口。真的是一个集装箱了。
参考:mac tree命令及参数
$ brew install tree
Getting Started
Writing your first Django app, part 1
Writing your first Django app, part 2
感谢各位的阅读,以上就是“Docker怎么搭建Django+Mariadb环境”的内容了,经过本文的学习后,相信大家对Docker怎么搭建Django+Mariadb环境这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。