Docker Compose 之 HAProxy + Django + Redis

Docker Compose 是什么?

docker-compose 是用来定义和运行多个Docker容器应用的工具。

Docker Compose 之 HAProxy + Django + Redis_第1张图片
docker和docker-compose

为什么要使用 Docker Compose?

Dockerfile重现一个容器,Compose重现容器的配置集群。使用docker-compose, 你只需要使用一个YAML文件去配置你应用的服务. 然后,运行一个命令,你就可以根据你的配置去创建并启动所有的service。

Docker Compose 之 HAProxy + Django + Redis_第2张图片
docker-compose up 启动所有服务

Docker Compose做了什么?

  • 编排

定义被部署的对象的各组成部分之间的耦合关系,部署流程中各个动作的执行顺序,部署过程所需要依赖文件和被部署文件的存储位置和获取方式,以及如何验证部署成功。这些信息都会在编排工具中以指定的格式来要求运维人员自主定义并保存起来,从而保证这个流程能够随时在全新的环境中有序的重现出来

  • 部署

按照编排所指定的内容和流程,在目标机器上执行编排指定环境初始化,存放指定的依赖和文件,运行指定的部署动作,最终按照编排中的规则来部署。

乐队和指挥家

Docker Compose 之 HAProxy + Django + Redis_第3张图片
乐队和指挥家
  • 编排是一个指挥家,他的大脑里存储了整个乐曲此起彼伏的演奏流程。

  • 部署就是整个乐队,他们严格按照指挥的意图用乐器来完成乐谱的执行。

编排和部署组合

在Compose的世界里,编排和部署的组合结果,就是一朵“容器云”

仅仅使用Compose,能构建自己的容器云吗?

答案是否定的。docker-compose面向单主机部署。docker-compose解决的问题局限在“编排”二字,甚至连“部署”范畴都涉足很少,而在一个能够服务于大众的云平台中,编排与部署也仅仅是其中的一个组成部分而已。

如何在Linux系统里安装docker-compose?

  • Run this command to download the latest version of Docker Compose:
$ sudo curl \
        -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) \
        -o /usr/local/bin/docker-compose
  • Apply executable permissions to the binary:
$ sudo chmod +x /usr/local/bin/docker-compose
  • Test the installation
$ docker-compose --version

如何使用docker-compose?

  • 编写你的应用的Dockerfile。
  • 在docker-compose.yml中定义你的应用所依赖的所有服务,这样它们可以在一个隔离的环境中运行.
  • 运行docker-compose build & docker-compose up来启动和运行你的整个应用.

Docker Compose初体验(Wordpress应用实例)

  • 使用docker-compose
version: '3.3'

services:
   db:
     image: mysql:5.7
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
  • 使用docker cli启动
sudo docker run --name db \
             -d \
             --restart always \
             -e MYSQL_ROOT_PASSWORD=somewordpress \
             -e MYSQL_DATABASE=wordpress \
             -e MYSQL_USER=wordpress \
             -e MYSQL_PASSWORD=wordpress \
             mysql:5.7
             
sudo docker run --name wordpress \
             --restart always \
             --link db \
             -e WORDPRESS_DB_HOST=db:3306 \
             -e WORDPRESS_DB_USER=wordpress \
             -e WORDPRESS_DB_PASSWORD=wordpress \
             -p 8000:80 \
             wordpress:latest
             

从表面上看,好像使用docker cli手动操作也是可以接受的,不外乎多打几行命令,不妨想象一下,如果管理上百个容器的场景该如何应付。

Docker Compose(HAProxy+Django+Redis应用实例)

应用架构

Docker Compose 之 HAProxy + Django + Redis_第4张图片
HAProxy+Django+Redis应用架构图

对应的应用目录结构:

.
├── README.md
├── app
│   ├── Dockerfile
│   └── src
│       └── redisweb
│           ├── db.sqlite3
│           ├── helloworld
│           │   ├── __init__.py
│           │   ├── admin.py
│           │   ├── apps.py
│           │   ├── migrations
│           │   │   └── __init__.py
│           │   ├── models.py
│           │   ├── tests.py
│           │   └── views.py
│           ├── manage.py
│           └── redisweb
│               ├── __init__.py
│               ├── settings.py
│               ├── urls.py
│               └── wsgi.py
├── docker-compose.yml
├── haproxy
│   ├── Dockerfile
│   └── haproxy.cfg
└── redis
    ├── master
    │   ├── Dockerfile
    │   └── redis.conf
    └── slave
        ├── Dockerfile
        └── redis.conf

Redis

首先,我们来看如何使用docker-compose启动redis cluster。

  • 编写redis/master/Dockerfile
FROM redis

ADD redis.conf /redis-config/redis.conf

ENTRYPOINT ["/usr/local/bin/redis-server", "/redis-config/redis.conf"]
  • 编写redis/slave/Dockerfile
FROM redis

ADD redis.conf /redis-config/redis.conf

ENTRYPOINT ["/usr/local/bin/redis-server", "/redis-config/redis.conf"]
  • 编写docker-compose.yml,添加3个service:redis-masterredis-slave1redis-slave2
version: '3'
services:
  redis-master:
    build:
      context: redis/master/.
  redis-slave1:
    build:
      context: redis/slave/.
    depends_on:
      - redis-master
  redis-slave2:
    build:
      context: redis/slave/.
    depends_on:
      - redis-master

通过docker-compose build && docker-compose up启动redis cluster。

APP

redis cluster完成后,就可以开始以来它的APP部分了。

  • 编写app/Dockerfile
FROM django

RUN pip install --upgrade pip && pip install redis

ADD src /app

WORKDIR /app/redisweb

EXPOSE 8001

ENTRYPOINT ["python", "manage.py", "runserver", "0.0.0.0:8001"]

编写docker-compose.yml,添加3个service:app1和app2

version: '3'
services:
  redis-master:
    build:
      context: redis/master/.
  redis-slave1:
    build:
      context: redis/slave/.
    depends_on:
      - redis-master
  redis-slave2:
    build:
      context: redis/slave/.
    depends_on:
      - redis-master
  app1:
    build:
      context: app/.
    depends_on:
      - redis-master
  app2:
    build:
      context: app/.
    depends_on:
      - redis-master

HAProxy

  • 编写haproxy/haproxy.cfg
global
    log         127.0.0.1 local2
    chroot      /usr/local/sbin
    pidfile     /usr/local/sbin/haproxy.pid
    maxconn     4000
    nbproc 4
    daemon

defaults
    mode        http
    timeout connect 10000 # default 10 second time out if a backend is not found
    timeout client 300000
    timeout server 300000

frontend http-in
   bind 0.0.0.0:8001
   default_backend servers

backend servers
   bind-process 2
   server app1 app1:8001 check inter 2000 rise 2 fall 5
   server app2 app2:8001 check inter 2000 rise 2 fall 5
  • 编写haproxy/Dockerfile
FROM haproxy

ADD haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg
  • 编写docker-compose.yml,添加1个service:haproxy
version: '3'
services:
  redis-master:
    build:
      context: redis/master/.
  redis-slave1:
    build:
      context: redis/slave/.
    depends_on:
      - redis-master
  redis-slave2:
    build:
      context: redis/slave/.
    depends_on:
      - redis-master
  app1:
    build:
      context: app/.
    depends_on:
      - redis-master
  app2:
    build:
      context: app/.
    depends_on:
      - redis-master
  haproxy:
    build:
      context: haproxy/.
    ports:
      - 8001:8001
    depends_on:
      - app1
      - app2

通过docker-compose build && docker-compose up haproxy启动整个应用。通过localhost:8001访问应用。

代码>>

你可能感兴趣的:(Docker Compose 之 HAProxy + Django + Redis)