docker进阶_docker-compose


Docker-compose

为什么使用docker-compose

官方介绍

? Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。使用 Compose,您可以使用 YAML 文件来配置应用程序的服务。然后,使用一个命令,您可以从您的配置中创建并启动所有服务。Compose 适用于所有环境:生产、登台、开发、测试以及 CI 工作流程。

Compose 具有用于管理应用程序整个生命周期的命令:

  • 启动、停止和重建服务
  • 查看运行服务的状态
  • 流式传输正在运行的服务的日志输出
  • 在服务上运行一次性命令

需求分析

? 当你需要启动多个容器并且将容器有机的组合成一个整体,你需要一个一个的run ,每个都配置网络,每个都配置数据卷,并且停止的时候也需要每个都停止,极其不方便;例如启动一个webapp 包含python app.py 使用的是redis 这是你就需要手动启动两个容器,并且在将他们配置到同一个网络,如果应用中不是两个而是需要二十个容器呢?这就会使一个很大的任务量

docker-compose的功能

多数应用通过多个更小的服务互相协同来组成 一个完整可用的应用。比如一个简单地示例应用可能由如下四个服务组成

  • web前端
  • 订单管理
  • 品类管理
  • 后台数据库

? 以上服务组织在一起,就是一个可用的应用,部署和管理繁多的服务是困难的。而这正是docker compose要解决的问题,docker compose并不是通过脚本和冗长的docker命令来将应用组件组织起来,而是通过一个声明式的配置文件描述整个应用,从而使用一条命令完成部署

? Docker-Compose 是用来管理容器的,我们有N多台容器或者应用需要启动的时候,有了 Docker-Compose 只需要一个配置文件就可以帮我们搞定,但是 Docker-Compose 只能管理当前主机上的 Docker,不能去管理其他服务器上的服务。意思就是单机环境

安装docker-compose

# 本机环境ubuntu
apt-get update
apt-get install docker-compose
# 安装完成后查看docker-compose版本
beginner@beginner-virtual-machine:~$ docker-compose -v
docker-compose version 1.25.0, build unknown

docker-compose文件格式简介

? 使用yaml文件来定义多服务的应用。默认文件名为docker-compose.yml,用户也可以使用-f参数指定具体文件,文件的框架大致如下

version: '3'
services:
  服务1:
  	xxxxx
  服务2:
  	xxxxx
volumes:
  数据卷1:
  	xxxxx
networks:
  网络1:
  	xxxxx

四个一级key:version、services、networks、volumes。

  • version:必须指定,而且位于文件第一行。定义了compose文件格式的版本。

  • service用于定义不同的应用服务(比如一个项目中使用pythonflask 做web redis做数据库 这就产生了两个服务 web、redis)

  • networks用于指引docker创建新的网络。默认情况创建bridge模式的网络

  • volumes用于指引docker文件创建新的数据卷

docker-compose.yml配置指令参考

[]: https://www.runoob.com/docker/docker-compose.html "菜鸟教程"

docker-compose搭建示例

[]: https://docs.docker.com/compose/gettingstarted/ "docker官方文档"

docker-compose常用命令

注意:使用以下命令时都要和yml文件在同一个目录下

docker-compose up # 启动定义的一组容器 
docker-compose -f xxxx.yml up # 使用自定义的yml文件名
docker-compose up -d # 后台启动

docker-compose ps # 查看该组容器的状态

docker-compose top # 列出各个容器中正在运行的进程

docker-compose stop # 停止该组容器

docker-compose rm # 删除该组容器

docker-compose down # 停止和删除(stop和rm的组合)该组容器(停止容器--->删除容器--->删除网络) 但是不会删除卷!!!因为卷是和容器生命周期解耦的,卷用做持久化存储

docker-compose 实例分析

shell脚本 在主机创建目录 下面的docker-compose.yml会用到这些目录 作为指定路径挂载的主机目录

for port in $(seq 1 6); \
do \
mkdir -p ~/redis/node-${port}/conf
touch ~/redis/node-${port}/conf/redis.conf
cat << EOF > ~/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 192.168.2.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done

上面是创建目录 创建配置文件的过程

docker-compose.yml

version: '3.5'
services:
  redis1:
    image: redis:6.2.6     # 采用redis:6.2.6镜像
    container_name: redis-1  # 起个名
    restart: always          # 除非你stop容器 不然每次随着docker自启动
    networks:
      redis_net:
        ipv4_address: 192.168.2.11  # 采用redis_net的自定义网络  ip地址为192.168.2.11
    volumes:  # 采用指定路径挂载开启两个数据卷 redis/node-1/conf/redis.conf上面已经初始好了
      - ~/redis/node-1/conf/redis.conf:/etc/redis/redis.conf 
      - ~/redis/node-1/data:/data
    command: ["redis-server", "/etc/redis/redis.conf"] # 启动redis服务
    ports:             # 开启两个端口映射 主机端口:容器端口
      - "6371:6379"
      - "16371:16379"
  redis2:
    image: redis:6.2.6
    container_name: redis-2
    restart: always
    networks:
      redis_net:
        ipv4_address: 192.168.2.12
    volumes:
      - ~/redis/node-2/conf/redis.conf:/etc/redis/redis.conf 
      - ~/redis/node-2/data:/data
    command: ["redis-server", "/etc/redis/redis.conf"]
    ports:
      - "6372:6379"
      - "16372:16379"
      
  redis3:
    image: redis:6.2.6
    container_name: redis-3
    restart: always
    networks:
      redis_net:
        ipv4_address: 192.168.2.13
    volumes:
      - ~/redis/node-3/conf/redis.conf:/etc/redis/redis.conf 
      - ~/redis/node-3/data:/data
    command: ["redis-server", "/etc/redis/redis.conf"]
    ports:
      - "6373:6379"
      - "16373:16379"
      
  redis4:
    image: redis:6.2.6
    container_name: redis-4
    restart: always
    networks:
      redis_net:
        ipv4_address: 192.168.2.14
    volumes:
      - ~/redis/node-4/conf/redis.conf:/etc/redis/redis.conf 
      - ~/redis/node-4/data:/data
    command: ["redis-server", "/etc/redis/redis.conf"]
    ports:
      - "6374:6379"
      - "16374:16379"

  redis5:
    image: redis:6.2.6
    container_name: redis-5
    restart: always
    networks:
      redis_net:
        ipv4_address: 192.168.2.15
    volumes:
      - ~/redis/node-5/conf/redis.conf:/etc/redis/redis.conf 
      - ~/redis/node-5/data:/data
    command: ["redis-server", "/etc/redis/redis.conf"]
    ports:
      - "6375:6379"
      - "16375:16379"

  redis6:
    image: redis:6.2.6
    container_name: redis-6
    restart: always
    networks:
      redis_net:
        ipv4_address: 192.168.2.16
    volumes:
      - ~/redis/node-6/conf/redis.conf:/etc/redis/redis.conf 
      - ~/redis/node-6/data:/data
    command: ["redis-server", "/etc/redis/redis.conf"]
    ports:
      - "6376:6379"
      - "16376:16379"
      
networks:
  redis_net:
    driver: bridge # 驱动为bridge模式
    ipam:
     config:
       - subnet: 192.168.2.0/24 # 设置网络

开启6个redis服务容器

docker-compose up -d #注意此条命令应该和docker-compose.yml文件在同一路径下

随机进入一个容器开启集群 docker exec -it redis-1 /bin/bash

root@409d076630b2:/# redis-cli --cluster create 192.168.2.11:6379 192.168.2.12:6379 192.168.2.13:6379 192.168.2.14:6379 192.168.2.15:6379 192.168.2.16:6379 --cluster-replicas 1

以集群方式连接redis以及查看集群状态

root@409d076630b2:/# redis-cli -c -h 192.168.2.11 -p 6379 #以集群方式连接节点进入节点
#进入节点后可以使用以下两个命令查看相关信息 检测redis集群是否搭建完成
cluster info 查看集群信息
cluster nodes 查看节点信息