Docker Compose 之 HAProxy + Django + Redis

Docker Compose 是什么?

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

docker和docker-compose

为什么要使用 Docker Compose?

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

docker-compose up 启动所有服务

Docker Compose做了什么?

  • 编排

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

  • 部署

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

乐队和指挥家

乐队和指挥家
  • 编排是一个指挥家,他的大脑里存储了整个乐曲此起彼伏的演奏流程。

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

编排和部署组合

在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应用实例)

应用架构

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访问应用。

代码>>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,099评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,473评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,229评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,570评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,427评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,335评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,737评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,392评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,693评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,730评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,512评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,349评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,750评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,017评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,290评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,706评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,904评论 2 335

推荐阅读更多精彩内容

  • Docker-Compose简介安装使用 [TOC] 1 简介 Github源码官方文档和示例 Compose i...
    小小少年Boy阅读 16,456评论 0 6
  • 世上无难事,只怕有心人。万事开头难,加油,坚持!
    优优泽泽阅读 78评论 0 0
  • 如果这世界上 曾经有那个人出现过 那么其他人都会变成将就 但我不愿将就
    嘿JR阅读 101评论 0 1
  • 1 凌晨,被三十年前的一部电影惊艳。 被剧情,被思想,更被人。 故事简单的不能再简单:一位日本男军官爱上一名英国男...
    周莫阅读 1,526评论 0 0