利用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中最漫长的过程就是,下镜像,下镜像&下镜像。

第四步:效果展示

 

posted @ 2017-08-02 14:53  每天进步一点点!!!  阅读(7300)  评论(0编辑  收藏  举报