利用docker-compose快速部署Python开发环境(转)
原文地址:http://dockone.io/article/2500
Docker提供了容器级别的资源隔离。由于Python的外部依赖管理中存在的问题,我们通常会使用virtualenv来对不同的项目创建其唯一的依赖环境。这时利用Docker进行Python开发,可以轻松解决不同Python项目之间的依赖隔离问题。
作为应用程序,我们通常需要依赖于多种外部服务,比如数据库、缓存服务等等。Docker-compose就是在Docker容器的基础上,提供了统一的容器编排语言,可以让你更轻松的利用Docker构建你的应用环境。
第一步:编写Dockerfile
使用requirements.txt定义第三方python包依赖
# cat requirements.txt Flask flask-assets redis pymongo
项目目录结构
# tree . ├── docker-compose-flask.yml ├── docker-compose.yml -> docker-compose-flask.yml ├── Dockerfile ├── requirements.txt └── server.py 0 directories, 5 files
Dockerfile文件内容
# cat Dockerfile FROM centos:6.6 ADD . /app WORKDIR /app RUN yum install -y wget RUN wget -q -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo && wget -q -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo RUN yum install -y python-devel python-pip RUN pip install --upgrade pip && pip install -r requirements.txt CMD server.py
server.py内容
# cat server.py from flask import Flask from flask import request import redis import pymongo r=redis.Redis(host='redis',port=6379) r.delete('key') r.set('key','kaixin001') r.expire('key', 10) redis_value = r.get('key') print redis_value #redis_value = "dongsheng" app = Flask(__name__) @app.route('/', methods=['GET', 'POST']) def home(): return '<h1>Home %s</h1>' % redis_value @app.route('/signin', methods=['GET']) def signin_form(): return '''<form action="/signin" method="post"> <p><input name="username"></p> <p><input name="password" type="password"></p> <p><button type="submit">Sign In</button></p> </form>''' @app.route('/signin', methods=['POST']) def signin(): if request.form['username']=='admin' and request.form['password']=='password': return '<h3>Hello, admin!</h3>' return '<h3>Bad username or password.</h3>' if __name__ == '__main__': app.run('0.0.0.0',debug=True)
在Dockerfile中,我们主要目的:通过requirements.txt文件安装第三方的Python库依赖;利用Docker的容器隔离,可以忽略掉很多在本地开发中需要使用的东西,比如virtualenv。
第二步:编排容器
在案例中,应用程序依赖了mongodb作为数据存储服务,以及redis作为缓存服务。在一般情况下,作为开发团队要么我们搭建统一的mongodb;要不就每个人在开发机上单独部署。
而在Docker中,我们则不在需要做这么多无用的事情。 Docker官方提供了大量的基础容器,基本涵盖了日常开发中我们需要的大部分依赖。 在https://hub.docker.com/我们可以搜索到我们需要的基础镜像。
比如mongodb以及redis,在docker-hub上官方都提供了容器话的服务。
以redis容器为例,我们在本地搭建redis服务要做的事情主要包括两步:
docker pull redis:latest
docker run -d -p 6379:6379 redis
这个时候我们就可以通过访问0.0.0.0:6379来访问我们的redis服务器了。
我们也可以通过Docker原生的命令来连接我们的应用容器和redis容器,以使我们的代码能够正常的访问redis服务
docker run --name some-app --line some-redis:redis -d application-that-uses-redis
而事实上,我们可以使用更加简化的方式来定义我们的容器组合管理,使用Docker-compose来定义我们的容器组合关系。
# cat docker-compose.yml web: build: . ports: - 5000:5000 links: - redis - mongo working_dir: /app volumes: - .:/app command: python server.py redis: image: redis:latest mongo: image: mongo
这里我们定义了3个容器web、redis、mongo。 其中,web容器是通过当前目录的Dockerfile进行构建,同时将当前目录挂在到/app目录。 而redis和mongo则直接使用官方进行。
通过使用links,我们可以在web容器中通过 ‘redis:6379’以及’mongo:21707’直接访问相应的服务。
第三步:开始coding
docker-compose up -d
Docker会根据当前的目录下得Dockerfile构建基础镜像,并且使用python server.py运行程序,并且运行redis以及mongo服务。
同时由于使用了volumes挂载了本地目录到/app,此时如果我们是开启的Debug模式,我们就可以直接在本地使用你喜欢的文本编辑器去编写代码,并且更新的代码能够实时被重新加载。
当然在使用Docker中最漫长的过程就是,下镜像,下镜像&下镜像。
第四步:效果展示
出处:http://www.cnblogs.com/madsnotes/
声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。