关于Docker的一些事之docker-compose

名词简介

Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。

Docker-Compose将所管理的容器分为三层:

分别是工程(project),服务(service)以及容器(container)。

一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖;一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡。

Docker-Compose的工程配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。 使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。

简单概况就是

  • Docker Compose是一个工具,用于定义和运行多容器应用程序的工具;
  • Docker Compose通过yml文件定义多容器的docker应用;
  • Docker Compose通过一条命令根据yml文件的定义去创建或管理多容器;
  • Docker Compose 是用来做Docker 的多容器控制,是一个用来把 Docker 自动化的东西。有了 Docker Compose 你可以把所有繁复的 Docker 操作全都一条命令,自动化的完成。
结构图

它为什么会存在

Docker帮助我们解决服务的打包安装的问题,随着而来的问题就是服务过多的带来如下问题,

  1. 多次使用Dockerfile Build Image或者DockerHub拉取Image;
  2. 需要创建多个Container,多次编写启动命令;
  3. Container互相依赖的如何进行管理和编排;

当我们服务数量增多的时候,上面三个问题就会更加的被放大,如果这三个问题不解决,其实从虚拟机到容器化除了机器减少一些浪费以外,好像没有更多的变化。Docker有没有什么好的方法,可以让我们通过一个配置就搞定容器编排和运行呢?这个时候它存在的价值就体现出来了。

它有怎样的能力

  1. 提供工具用于定义和运行多个docker容器应用;
  2. 使用yaml文件来配置应用服务(docker-compse.yml);
  3. 可以通过一个简单的命令docker-compse up可以按照依赖关系启动所有服务;
  4. 可以通过一个简单的命令docker-compose down停止所有服务;
  5. 当一个服务需要的时候,可以很简单地通过--scale进行扩容;

它具有的特征

更高的可移植性

Docker Compose仅需一个docker-compse up可以完成按照依赖关系启动所有服务,然后使用docker-compose down轻松将其拆解。帮助我们更轻松地部署复杂的应用程序;

单个主机上的多个隔离环境

Compose可以使用项目名称将环境彼此隔离,这带可以在一台计算机上运行同一环境的多个副本,它可以防止不同的项目和服务相互干扰;

Docker-Compose版本介绍

Docker Compose版本与引擎的对应关系如下,可以看到中间主要有两个版本2和版本3两种格式,目前大家使用比较多也就是这两种,对于这两个版本的差别给大家介绍一下:

  1. v3 版本不支持 volume_from 、extends、group_add等属性;
  2. cpu 和 内存属性的设置移到了 deploy 中;
  3. v3 版本支持 Docker Swarm,而 v2 版本不支持;
版本参考

Docker-Compose部署

一般有两种部署方式,一种为系统自带软件仓部署(apt-get、yum)另外一种则是二进制部署

1、二进制部署

# 下载二进制包并部署到系统目录/usr/local/bin/
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 给予可执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 查看是否部署成功
docker-compose --version

2、系统自带软件仓部署

# 乌班图系统部署
apt-get install python-pip
pip install --upgrade pip
apt-get -y install docker-compose

# 红帽系Linux、Centos使用以下命令安装
yum -y install epel-release # 安装依赖
yum -y install python-pip
pip install --upgrade pip
yum -y install docker-compose

# 检查是否部署成功
docker-compose --version

Docker-Compose常见命令

其实,Docker Compose命令本质上与Docker相差不大,主要就是对Docker Compose生命周期控制、日志格式等相关命令。

#构建建启动nignx容器
docker-compose up -d nginx                     

#进入nginx容器中
docker-compose exec nginx bash            

#将会停止UP命令启动的容器,并删除容器
docker-compose down                             

#显示所有容器
docker-compose ps                                   

#重新启动nginx容器
docker-compose restart nginx                   

#构建镜像
docker-compose build nginx      

#不带缓存的构建
docker-compose build --no-cache nginx 

#查看nginx的日志
docker-compose logs  nginx                      

#查看nginx的实时日志
docker-compose logs -f nginx
   
#暂停nignx容器
docker-compose pause nginx                 

#恢复ningx容器
docker-compose unpause nginx             

#删除容器
docker-compose rm nginx                       

#停止nignx容器
docker-compose stop nginx                    

#启动nignx容器
docker-compose start nginx    

如果实在忘记,还可以通过docker-compose --help进行帮助哦。

# docker-compose命令查询帮助
docker-compose --help

# docker-compose 子命令查询帮助
docker-compose stop --help

Docker-Compose模板介绍

模板文件是使用 Compose 的核心,涉及到的指令关键字也比较多。默认的模板文件名称为 docker-compose.yml,格式为 YAML 格式,下面是一个比较基础的骨架

Basic

version: "3"

services:
  webapp:
    image: mysql
    ports:
      - "80:80"
    volumes:
      - "/data"

其中image代表使用Docker仓库中已经存在的镜像,我们之前使用都需要先构建一个镜像,然后在文件里面指定这个镜像才可以运行。

Build

通过Docker-compose在启动容器之前根据dockerfile构建镜像,然后根据镜像启动容器

version: '3'
services:

  webapp:
    build: ./dir

command

覆盖容器启动后默认执行的命令

command: echo "hello world"

depends_on

解决容器的依赖、启动先后的问题。以下例子中会先启动 mysql再启动 tomcat最后启动redis,不会等到被依赖服务完全启动再启动。

version: '3'

services:
  web:
    build: ./
    depends_on:
      - mysql
      - tomcat
      - redis

  tomcat:
    image: tomcat01

  mysql:
    image: mysql01

ports

暴露端口,指定宿主机到容器的端口映射,或者只指定容器的端口,则表示映射到主机上的随机端口,一般采用主机:容器的形式来映射端口

ports:
  - 8081:8080/tcp

至于其他关键字可以去官网上寻找到想要的答案

 

Docker-Compose模板范例

version: '3.0'

networks:
  docker-compose-demo-net:
    driver: bridge
    ipam:
      config:
        - subnet: 192.168.1.0/24
          gateway: 192.168.1.1


services:
  docker-compose-demo01:
    build:
      #构建的地址
      context: /usr/local/docker-compose-demo
      dockerfile: Dockerfile
    image: docker-compose-demo
    container_name: docker-compose-demo01
    #选择网络
    networks:
      - docker-compose-demo-net
    #选择端口
    ports:
      - 8081:8080/tcp
    restart: always

  docker-compose-demo02:
    build:
      #构建的地址
      context: /usr/local/docker-compose-demo
      dockerfile: Dockerfile
    image: docker-compose-demo
    container_name: docker-compose-demo02
    #选择网络
    networks:
      - docker-compose-demo-net
    #选择端口
    ports:
      - 8082:8080/tcp
    restart: always

  nginx:
    image: nginx:latest
    container_name: nginx-demo
    networks:
      - docker-compose-demo-net
    ports:
      - 80:80/tcp
    restart: always
    volumes:
      - /usr/local/docker-compose-demo/nginx.conf:/etc/nginx/nginx.conf:rw


volumes:
  docker-compose-demo-volume: {}

最后结语

其实Docker-Compose有点类似我们目前熟悉的Kubernetes容器编排技术,两者各有特色,有希望深耕容器云方面的可以深入研究一下它,对于了解容器编排的具体含义是很有帮助的。


已有 0 条评论

    欢迎您,新朋友,感谢参与互动!