zoukankan      html  css  js  c++  java
  • 10-Docker之Docker-Compose

    一 Docker Compose 简介

    1.1 Docker Compose介绍

    •Docker Compose是一个能一次性定义和管理多个Docker容器的工具。

    •详细地说:

    Compose中定义和启动的每一个容器都相当于一个服务(service)

    Compose中能定义和启动多个服务,且它们之间通常具有协同关系

    •管理方式:

    使用YAML文件来配置我们应用程序的服务。

    使用单个命令(docker-compose up),就可以创建并启动配置文件中配置的所有服务。
    

    1.2 Docker Compose 工作原理

    image-20200331011006843

    1.3 Docker Compose安装

    # Docker for Mac与Docker for Windows自带docker-compose
    # Linux下需要单独安装:
    # 第一步: sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    # 第二步:sudo chmod +x /usr/local/bin/docker-compose
    # 终端中使用docker-compose --version查看安装的版本
    这里示例安装版本是1.21.2,很可能您看到这里时,已经出现更新的版本,因此建议换成最新版本。
    # 访问github可能网络原因下载失败,可以使用国内镜像
    curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
    chmod +x /usr/local/bin/docker-compose
    

    1.4 Docker Compose CLI

    利用docker-compose --help查看
    对比后会发现:Docker Compose CLI的很多命令的功能和Docker Client CLI是相似的。最主要的区别就是前者能一次性运行管理多个容器,后者只能一次管理一个。
    

    二 了解 Docker Compose File

    2.1Docker Compose File版本

    Docker Compose File 有多个版本,基本是向后兼容的,但也有极个别配置项高版本中没有。

    •在docker-compose.yml一开始就需要利用version关键词标明当前file使用的版本

    image-20200703203240766

    2.2 Docker Compose File TOP配置参数概览

    Docker Compose File 顶级配置项:

    •version:指定Docker Compose File版本号

    •services:定义多个服务并配置启动参数

    •volumes:声明或创建在多个服务中共同使用的数据卷对象

    •networks:定义在多个服务中共同使用的网络对象

    •configs:声明将在本服务中要使用的一些配置文件

    •secrets:声明将在本服务中要使用的一些秘钥、密码文件

    •x-***:自定义配置。主要用于复用相同的配置。

    # version:有1,2,3版本,目前都用"3"
     # 一个service代表一个container,这个container可以从dockerhub的image来创建,或者从本地dockerfilebuild的image来创建
     # service的启动类似docker run,可以指定network和volume,所有可以给servier指定network和volume
    

    2.3 docker-compose命令

    # 启动管理容器
    docker-compose up  # 会自动搜索当前路径下的 docker-compose.yml文件
    docker-compose -f 指定文件 up
    docker-compose up -d  # 后台执行,一般我们看日志输出,不用这个
    
    docker-compose stop  # 停止,不会删除容器和镜像
    docker-compose down # 停止,并删除关联的容器
    docker-compose start  # 启动yml文件管理的容器
    docker-compose ps    # 正在运行的容器
    docker-compose images # docker-compose管理的容器
    
    docker-compose exec yml文件中写的service /bin/bash  # 进入到容器内
    

    image-20200331011654608

    2.3 docker-compose案例

    案例一

    services:
      db:
        image: mysql:5.7
        volumes:
          - "db-data:/var/lib/mysql"
        networks:
          - my-bridge
    # 等同于
    # docker run -d --network my-bridge -v db-data"/var/lib/mysql mysql:5.7
    

    三 Docker Compose 部署应用,水平扩展

    3.1 使用Docker Compose部署一个wordpress

    # 第一步:docker-compose.yml
    version: '3'
    services:
      wordpress:
        image: wordpress
        ports:
          - 8080:80
        depends_on:
          - mysql
        environment:
          WORDPRESS_DB_HOST: mysql
          WORDPRESS_DB_PASSWORD: root
        networks:
          - my-bridge
    
      mysql:
        image: mysql:5.7
        environment:
          MYSQL_ROOT_PASSWORD: root
          MYSQL_DATABASE: wordpress
        volumes:
          - mysql-data:/var/lib/mysql
        networks:
          - my-bridge
    
    volumes:
      mysql-data:
    
    networks:
      my-bridge:
        driver: bridge
          
          
    # 第二步:docker-compose up
    

    3.2 Docker Compose 案例一 小型web服务项目搭建

    # 第一步:编写dDockerfile
    FROM python:3.6
    COPY . /app
    WORKDIR /app
    RUN pip install flask redis
    EXPOSE 5000
    CMD [ "python", "app.py" ]
    
    #第二步:编写docker-compose.yml
    version: "3"
    
    services:
    
      redis:
        image: redis
    
      web:
        build:
          context: .
          dockerfile: Dockerfile
        ports:
          - 8080:5000
        environment:
          REDIS_HOST: redis
     # 第三步:编写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 '你好! 查看 %s 次, hostname 是 %s.
    ' % (redis.get('hits'),socket.gethostname())
    
    
    if __name__ == "__main__":
        app.run(host="0.0.0.0", port=5000, debug=True)
    # 第四步:运行
    docker-compose up
    

    3.3 docker-compose水平扩展

    # 把flask_redis项目扩展成三个
    docker-compose up --help
    # scale SERVICE=NUM设置成三个
    docker-compose up --scale web=3   # 执行有问题,因为8080端口已经被映射了
    # 删除docker-compose.yml中的port
    # 在启动
    docker-compose up --scale web=3
    docker-compose start
    docker-compose ps  # 可以看到三个web启动了
    
    # 前面加一个负载均衡器HAProxy
    # HAProxy和Nginx的区别?万能的百度
    
    # app.py 改成监听的端口为80
    # Dockerfile不需要改
    # docker-compose.yml
    version: "3"
    
    services:
    
      redis:
        image: redis
    
      web:
        build:
          context: .
          dockerfile: Dockerfile
        environment:
          REDIS_HOST: redis
    
      lb:
        image: dockercloud/haproxy
        links:
          - web
        ports:
          - 8080:80
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock 
    #启动,从浏览器查看
    docker-compose up
    # 把web扩展为3个从浏览器查看
    docker-compose up --scale web=3 -d
    # 减掉为1个
    docker-compose up --scale web=1 -d
    

    3.4 docker-compose部署一个复杂的应用

    image-20200628153906975

    # 项目地址:https://pan.baidu.com/s/1lzfaza5kO-jbRLsEFrslIg  提取码: 加群获 830644110
    # 第一步,下载项目,解压,cd进入(内部自带项目,Dockerfile,docker-compose.yml)
    # docker-compose.yml如下
    services:
      voting-app:
        build: ./voting-app/.
        volumes:
         - ./voting-app:/app
        ports:
          - "5000:80"
        links:
          - redis
        networks:
          - front-tier
          - back-tier
    
      result-app:
        build: ./result-app/.
        volumes:
          - ./result-app:/app
        ports:
          - "5001:80"
        links:
          - db
        networks:
          - front-tier
          - back-tier
    
      worker:
        build: ./worker
        links:
          - db
          - redis
        networks:
          - back-tier
    
      redis:
        image: redis
        ports: ["6379"]
        networks:
          - back-tier
    
      db:
        image: postgres:9.4
        volumes:
          - "db-data:/var/lib/postgresql/data"
        networks:
          - back-tier
    
    volumes:
      db-data:
    
    networks:
      front-tier:
      back-tier:
    # 第二步:部署
    docker-compose up  # 时间很久
    
    # 补充:9a37
    docker-compose build # 如果yml文件中有需要先build的image,会先构建,然后再up,节约时间(并不会节约)
    

    3.5 docker-compose单机环境ELK系统

    image-20200331011825994

    # 第一步:编写docker-compose.yml(ELK镜像地址:https://www.docker.elastic.co/)
    
    # 第二步:运行
    docker-compose up
    # 官方提供的
    version: '2.2'
    services:
      es01:
        image: docker.elastic.co/elasticsearch/elasticsearch:7.5.2
        container_name: es01
        environment:
          - node.name=es01
          - cluster.name=es-docker-cluster # 集群名称
          - discovery.seed_hosts=es02,es03 # 指定集群
          - cluster.initial_master_nodes=es01,es02,es03 # 设置集群发现
          - bootstrap.memory_lock=true # 存锁,限制es不会无限制使用内存
          - "ES_JAVA_OPTS=-Xms512m -Xmx512m" # jvm内存使用
        ulimits: # 跟上方bootstrap.memory_lock关联
          memlock:
            soft: -1
            hard: -1
        volumes:
          - data01:/usr/share/elasticsearch/data
        ports:
          - 9200:9200
        networks:
          - elastic
      es02:
        image: docker.elastic.co/elasticsearch/elasticsearch:7.5.2
        container_name: es02
        environment:
          - node.name=es02
          - cluster.name=es-docker-cluster
          - discovery.seed_hosts=es01,es03
          - cluster.initial_master_nodes=es01,es02,es03
          - bootstrap.memory_lock=true
          - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
        ulimits:
          memlock:
            soft: -1
            hard: -1
        volumes:
          - data02:/usr/share/elasticsearch/data
        networks:
          - elastic
      es03:
        image: docker.elastic.co/elasticsearch/elasticsearch:7.5.2
        container_name: es03
        environment:
          - node.name=es03
          - cluster.name=es-docker-cluster
          - discovery.seed_hosts=es01,es02
          - cluster.initial_master_nodes=es01,es02,es03
          - bootstrap.memory_lock=true
          - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
        ulimits:
          memlock:
            soft: -1
            hard: -1
        volumes:
          - data03:/usr/share/elasticsearch/data
        networks:
          - elastic
    
    volumes:
      data01:
        driver: local
      data02:
        driver: local
      data03:
        driver: local
    
    networks:
      elastic:
        driver: bridge
    
  • 相关阅读:
    Tiddlywiki 维基程序使用手册
    Codeigniter 3.0 相关文档 part two
    css hack
    sql入门基础
    nodejs如何储存一个GBK编码的文件
    PHP 代码片段记录
    javascript 数字进制转换
    子网掩码计算题
    Trace文件过量生成问题解决
    PHP Header下载文件在IE文件名中文乱码问题
  • 原文地址:https://www.cnblogs.com/heirenxilou/p/13566125.html
Copyright © 2011-2022 走看看