系统:CentOS 7.2
准备一个Django Demo,运行后效果如下:
这是Django官网上的一个简单的投票demo,是使用NginX + supervisord + gunicorn + venv来部署的。现在要做的是把它制作成docker镜像,然后以容器的方式运行它。
步骤如下:
安装docker
我使用的是云主机,已配置yum源,可以直接
1 | yum install docker |
因已安装docker,提示更新如下(更新后原有镜像被删除了):
yum源配置如下:
/etc/yum.repos.d/CentOS-Base.repo文件:
1 | [extras] |
/etc/yum.repos.d/CentOS-Epel.repo文件:
1 | [epel] |
示例应用根目录是mysite2
,如下:
1 | | |-- mysite2 |
为了方便制作docker镜像,重新组织成了下面的样子:
1 | [root@lzzeng docker_demo]# tree -L 3 . |
application
目录下的文件docker-compose.yml
、Dockerfile
等7个文件是新增的。作用如下:
docker-compose.yml:通过docker-compose启动容器的配置,定义了多个容器的启动参数,及容器关联等
Dockerfile:制作Docker镜像的脚本编排,类似于Makefile、SPEC文件等
mysite2_nginx.conf:事先写好的NginX配置文件
mysite2_supervisord.ini:事先写好的Supervisord配置文件
requirements.txt:记录制作docker镜像需要安装的依赖,Dockerfile中用到
start_script: 容器启动入口,Dockerfile中定义了此脚本为启动入口
wait-for-it.sh:等待其它容器(服务)启动完毕的脚本
编写Dockerfile
1 | # 基于centos:7 |
构建镜像:
构建成功:
测试容器:
mysite2
应用中用到了数据库,需要先启动mysql容器:
1 | docker run --name db -d -e MYSQL_ROOT_PASSWORD=qwerasdf -e MYSQL_DATABASE=mysite2_db -v /root/mysite2_db:/var/lib/mysql mysql:5.7 |
通过mysql:5.7
镜像创建mysql容器时,会自动创建名为mysite2_db
的数据库,并设置数据库密码为qwerasdf
,以备连接。容器中的/var/lib/mysql
目录会同步到数据卷/root/mysite2_db
。
执行后如下:
然后,通过已制作好的镜像zeng/docker_demo_gunicorn:0.3
来启动mysite2
:
启动成功:
浏览器访问:
因为mysite2
没有处理这个请求路径,改为:
对接mysql时,用户名、密码是在django settings里有如下配置:
1 | DATABASES = { |
start_script
:
1 |
|
mysite2/fixtures/superuser.json:
1 | [ |
其中的password生成方式如下:
1 | [root@lzzeng mysite2]# export DJANGO_SETTINGS_MODULE=mysite2.settings.server |
以root:qwerasdf
登录admin页面添加polls记录后,效果如下:
以上完成了docker镜像制作(未上传到远程镜像库),然后使用镜像运行mysite2的过程。
使用docker-compose
上面启动了两个容器,比较麻烦。可以使用docker-compose来编排容器,实现微服务架构部署方式。
编写docker-compose.yml
:
1 | web: |
先停止、删除正在运行的容器:
docker-compose up
:
启动成功:
停止:docker-compose stop
参考文档
(End)