内容简介:先通读全文后,再自行决定需要实践的步骤。后文总是有更简洁更快更好的实践。不过,新人建议从头到尾实践,也不失为“笨办法学 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 欢迎界面
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
访问
-
因为加载了之前的数据库文件,所以之前的仍旧能用:
-
账号是之前创建好的 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
51Reboot 最新课程招生信息
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 是一门简洁、高效、强大且灵活的编程语言。
关于课程的具体内容想要了解的, 扫码加小助手咨询
扫码咨询,备注“公开课,来源简书”
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Hyperledger Fabric环境搭建及环境测试(Mac环境)
- CV 环境很重要,各种环境搭建大全
- Openstack Queens 环境搭建(一)环境准备
- Python 环境搭建
- 1 - 搭建开发环境
- 搭建 Android 内核环境
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
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》 这本书的介绍吧!