完整项目请查看Github:连接python
或经过gitbook在线查看: 连接mysql
经过以前的案例咱们也实现了Docker的多容器部署,可是有没有以为仍然很麻烦,咱们开发程序更习惯讲配置信息写到配置文件里再继续操做,那么Docker有没有实现这样的功能呢?答案是有的。git
Docker Compose是一个工具,它支持经过yml文件来定义和配置多个容器,并且在定义好容器以后咱们能够经过跟简单的命令快速的搭建起一个基于Docker的多容器应用。 默认状况下咱们是建立一个docker-compose.yml文件,在这个文件中咱们会定义三个比较重要的东西。github
其实咱们在最开始的Docker初体验里就已经使用过这个Docker Compose了,不知道你们还记不记得,咱们这里再回顾一下。 web
通常状况下在mac和windows上安装Docker时会自动安装docker-compose,Linux上须要手动安装。 首先经过命令redis
docker-compose --version
复制代码
查看你的服务器是否已经安装好了Docker Compose。若没有安装则继续阅读如下安装步骤。 sql
在建立好docker-compose.yml
文件后,能够经过这个命令将文件中定义的容器都启动起来,在docker compose中咱们更习惯于将每个容器叫作service。docker
docker-compose up
复制代码
命令后会自动接一个默认值-f docker-compose.yml
,也就是默认是使用docker-compose.yml文件的。咱们也能够给文件起名为docke-test.yml
,这样在使用时指定文件名,可是为了符合规范,仍是统一为docker-compose.yml
。flask
docker-compose up -f docer-test.yml
复制代码
可是直接经过这种方式的话会直接将启动时的输出打印到终端,因此咱们常会加上-d
参数。windows
docker-compose up -d
复制代码
接下来能够查看一下咱们建立的service状态
docker-compose ps
复制代码
如何中止已经运行的services呢,可使用如下两个命令
docker-compose stop
docker-compose down
复制代码
其中stop是直接中止services,而down则会中止并删除建立的service,volume和network。
那么如何进入容器呢
docker-compose exec mysql bash
复制代码
exec后面接的就是咱们要进入具体的service的名字,名字后面就是咱们要执行的命令。
咱们在以前是使用docker的命令将flask和redis进行链接,详情见flask-redis实战
接下来咱们使用docker-compose的方式实现一样的功能。
首先编辑好一个python文件,app.py
from flask import Flask
from redis import Redis
import os
import socket
app = Flask(__name__)
redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)
@app.route('/')
def hello():
redis.incr('hits')
return 'Hello Container World! I have been seen %s times and my hostname is %s.\n' % (redis.get('hits'),socket.gethostname())
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000, debug=True)
复制代码
FROM python:2.7
LABEL maintaner="Peng Xiao xiaoquwl@gmail.com" COPY . /app WORKDIR /app RUN pip install flask redis EXPOSE 5000
CMD [ "python", "app.py" ] 复制代码
version: "3"
services:
redis:
image: redis
web:
build:
context: .
dockerfile: Dockerfile
environment:
REDIS_HOST: redis
复制代码
能够看到在文件中咱们定义了两个service,一个叫作redis,一个叫作web,并且web的镜像常见方式是build。
docker-compose up -d
复制代码
能够看到这里咱们也并无像以前同样使用--link
命令,是由于咱们经过docker-compose up
启动后会默认建立一个network。
咱们再具体看一下网络中的具体内容,能够看到咱们建立的两个service确实是链接到这个network中的。因此他们两个之间是能够直接通讯的。
接下来咱们访问一下,能够看到效果和以前是同样的
如今的需求是这样的,咱们刚才建立的那个flask-redis服务由于访问的人多如今须要拓展几个容器来同时提供服务,以平衡单个容器的访问压力,咱们如何实现这个需求呢?
咱们先来看一下如今的状况
Docker Compose有一个scale参数,经过这个参数能够实现容器的水平拓展。
docker-compose up --scale web=3 -d
复制代码
咱们再经过命令查看一下如今的容器状态
如今能够看到咱们有了三个web服务,这三个web会同时对外提供服务,以减轻访问单个容器的压力。
可是如今这样还有一个问题就是咱们每一个容器都是暴露出本身的端口5000,并且由于本地服务器只有一个8080端口,咱们无法让多个容器都绑定上去,那咱们如何经过访问服务器的地址来自动的映射到其余容器呢?
这时咱们就须要haproxy来支持。
HAProxy是一个免费的负载均衡软件,能够运行于大部分主流的Linux操做系统上。
HAProxy提供了L4(TCP)和L7(HTTP)两种负载均衡能力,具有丰富的功能。HAProxy的社区很是活跃,版本更新快速(最新稳定版1.7.2于2017/01/13推出)。最关键的是,HAProxy具有媲美商用负载均衡器的性能和稳定性。
由于HAProxy的上述优势,它当前不只仅是免费负载均衡软件的首选,更几乎成为了惟一选择。
dokcer-compose.yml
文件。version: "3"
services:
redis:
image: redis
web:
build:
context: .
dockerfile: Dockerfile
ports: ["8080"]
environment:
REDIS_HOST: redis
lb:
image: dockercloud/haproxy
links:
- web
ports:
- 80:80
volumes:
- /var/run/docker.sock:/var/run/docker.sock
复制代码
from flask import Flask
from redis import Redis
import os
import socket
app = Flask(__name__)
redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)
@app.route('/')
def hello():
redis.incr('hits')
return 'Hello Container World! I have been seen %s times and my hostname is %s.\n' % (redis.get('hits'),socket.gethostname())
if __name__ == "__main__":
app.run(host="0.0.0.0", port=80, debug=True)
复制代码
FROM python:2.7
LABEL maintaner="Peng Xiao xiaoquwl@gmail.com" COPY . /app WORKDIR /app RUN pip install flask redis EXPOSE 80
CMD [ "python", "app.py" ] 复制代码
docker-compose up -d
复制代码
docker-compose up --scale web=3 -d
复制代码
咱们先看一下service的具体状况
如今来访问一下服务
能够看到咱们在访问的过程当中是近乎轮询式的,经过这样的方式来减轻单个服务器的压力,实现负载均衡。
欢迎你们关注咱们的公众号:知识沉淀部落。