Docker Compose多容器部署(五)

为什么要有Docker Compose多容器部署

为了多快好省,总结起来就是为了偷懒

在使用 docker Compose之前,我们是怎么部署多个容器的APP应用的呢???

  1. 要从Dockerfile build image 或者 Dockerhub 拉取image
  2. 要创建多个container
  3. 要管理这些container(启动停止删除)

多容器部署的APP太恶心了(每次都这么多步骤)

docker Compose到底是什么

  • Docker Compose 是一个命令行工具
  • 这个工具可以通过一个yml文件定义多个容器的docker应用
  • 通过一条命令就可以根据yml文件的定义去创建或者管理这些容器

docker yml 文件有一个默认在名字叫docker-compose.yml,其中有三个重要的概念:

  • Services
  • Networks
  • Volumes

Services

  • 一个Services代表一个container,这个container可以从dockerhub registory的image来创建,或者从本地的Dockerfile build 出来的image来创建
  • Service的启动类似docker run,我们可以给其指定network和volume,所以可以给service指定network和Volume的引用
#docker-compose.yml文件内容示例
services:
    db:     #APP NAME
        images:postgres:9.4     #使用的镜像
        volumes:    #数据卷映射名为db-data
            - "db-data:/var/lib/postgresql/data"
        networks:   #docker network 使用back-tier
            - back-tier

以上内容等同于:docker run -d --network back-tier -v db-data:/var/lib/postgresql/data postgres:9.4

Volumes

Networks

接下来看一个实际的应用例子

version: '3'    #docke compose版本
services:
  wordpress:    #App name
    image: wordpress    #使用镜像
    ports:      #端口映射
      - 8080:80
    environment:    #容器环境变量配置
      WORDPRESS_DB_HOST: mysql
      WORDPRESS_DB_PASSWORD: root
    networks:   # docker 网卡
      - my-bridge
  mysql:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: wordpress
    volumes:    #数据卷名mysql-data,对应备份容器中/var/lib/mysql所有内容
      - mysql-data:/var/lib/mysql
    networks:
      - my-bridge
volumes:    #声明
  mysql-data:
networks:   #声明
  my-bridge:
    driver: bridge  # 使用drive为bridge

Docker Compose 的安装

具体安装过程可以参考:docker docs-安装Docker Compose

Docker 水平扩展和负载均衡

docker-compose up -d    #以后台方式启动运行
docker-compose ps   # 查看启动的服务App
docker-compose up --help
docker-compose down  #关闭删除
docker-compose build    #

以下面这个docker-compose.yml文件为例:

version: "3"
services:
  redis:
    image: redis
  web:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - 8080:5000
    environment:
      REDIS_HOST: redis

scale 可以把一个服务扩展成多个,但是如果以上面这个文件启动的话docker-compose up --scale web=3 -d,会发现报错:

原因是因为ports: - 8080:5000重复绑定了,删除即可

我们来看一个负载均衡的例子

#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.yml
version: "3"
services:
  redis:
    image: redis
  web:
    build:      #指定的镜像需要build
      context: .    #build的路径
      dockerfile: Dockerfile    #要build的dockerfile文件名
    environment:
      REDIS_HOST: redis
  lb:
    image: dockercloud/haproxy  #负载均衡的镜像
    links:      #连接到上面的service名为web的App
      - web
    ports:
      - 8080:80
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock 

结构调用图

实践-部署一个复杂的Application

Voting App 用于投票,redids Queue用来保存投票结果,Java worker实时获取redis 中的数据插入PG database数据库中,Result app 实时从PG database中获取数据展示到页面。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券