动手学Docker-第五弹-Docker多容器部署

完整项目请查看Github:连接python

或经过gitbook在线查看: 连接mysql


经过以前的案例咱们也实现了Docker的多容器部署,可是有没有以为仍然很麻烦,咱们开发程序更习惯讲配置信息写到配置文件里再继续操做,那么Docker有没有实现这样的功能呢?答案是有的。git

Docker Compose

Docker Compose是一个工具,它支持经过yml文件来定义和配置多个容器,并且在定义好容器以后咱们能够经过跟简单的命令快速的搭建起一个基于Docker的多容器应用。 默认状况下咱们是建立一个docker-compose.yml文件,在这个文件中咱们会定义三个比较重要的东西。github

  1. services:里面对应的每一个service表明一个容器,容器对应的镜像能够经过DockerHub拉取,也能够经过build命令构建。而且在建立时咱们还能够指定对应的network和volume。
  2. volumes:对应以前Docker持久化存储那里的-v参数
  3. networks:对应以前Docker网络那里的-net参数

其实咱们在最开始的Docker初体验里就已经使用过这个Docker Compose了,不知道你们还记不记得,咱们这里再回顾一下。 web

在这里插入图片描述

Docker Compose安装

通常状况下在mac和windows上安装Docker时会自动安装docker-compose,Linux上须要手动安装。 首先经过命令redis

docker-compose --version
复制代码

查看你的服务器是否已经安装好了Docker Compose。若没有安装则继续阅读如下安装步骤sql

在这里插入图片描述

Docker Compose基本使用

在建立好docker-compose.yml文件后,能够经过这个命令将文件中定义的容器都启动起来,在docker compose中咱们更习惯于将每个容器叫作service。docker

docker-compose up
复制代码

命令后会自动接一个默认值-f docker-compose.yml,也就是默认是使用docker-compose.yml文件的。咱们也能够给文件起名为docke-test.yml,这样在使用时指定文件名,可是为了符合规范,仍是统一为docker-compose.ymlflask

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的名字,名字后面就是咱们要执行的命令。

flask-redis Docker Compose实战

咱们在以前是使用docker的命令将flask和redis进行链接,详情见flask-redis实战

接下来咱们使用docker-compose的方式实现一样的功能。

编写python文件

首先编辑好一个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)
复制代码

编写Dockerfile

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" ] 复制代码

编写docker-compose

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 
复制代码

修改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=80, debug=True)
复制代码

修改Dockerfile

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的具体状况

在这里插入图片描述

如今来访问一下服务

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

能够看到咱们在访问的过程当中是近乎轮询式的,经过这样的方式来减轻单个服务器的压力,实现负载均衡。


欢迎你们关注咱们的公众号:知识沉淀部落。

知识沉淀部落
相关文章
相关标签/搜索