Docker-compose介绍

前几篇文章和小伙伴们,分享了使用Dockerfile来构建镜像,使用docker run等命令来手动启动镜像、docker stop停止镜像、docker kill杀死镜像进程。这种情况只适用于镜像服务不多的情况。然而,现实情况是我们可能同时启停操作成百上千的服务,而且还要在启动之前分析各个服务之间的前后依赖关系,如果此时还是使用手动的方式来操作显然是不现实的。于是docker-compose应运而生。接下来我们就来看看docker-compose。

什么是docker-compose

Compose 是用于定义和运行多容器 Docker应用程序的工具。通过Compose,我们可以使用YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

简单来说,就是在一个叫做YML文件中,将你的镜像服务按照一定的规则,进行定义、排列、配置。然后使用compose提供的命令,一键启动整个服务群的工具。

安装

执行如下命令进行安装docker-compose,此命令会根据你的系统匹配合适的docker-compose

curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

给安装的脚本赋予执行权限

chmod +x /usr/local/bin/docker-compose 

检查安装结果

docker-compose --version

终端输出如下内容表示安装成功

docker-compose version 1.26.2, build eefe0d31

❝

MacOs和windows的小伙伴不用单独安装Compose,因为安装docker桌面版的时候已经自带了docker-compose

❞

docker-compose命令

docker-compose和docker一样也有自己的一套命令,下面我们就经常用到的进行说明。

  • docker-compose up`: 启动所有容器(在docker-compose中定义)

❝

参数说明 docker-compose up -d:在后台启动所有容器

​ docker-compose -f docker-compose模板 up -d:指定 docker-compose 并在后台启动

❞

  • docker-compose ps: 查看项目中运行着的容器

  • docker-compose stop : 停止正在运行的容器

  • docker-compose start:启动stop了的容器

  • docker-compose down: 停止并删除容器、网络、卷、镜像

❝

参数说明 docker-compose down-v: 删除已经在compose文件中定义的和匿名的附在容器上的数据卷

❞

  • docker-compose logs: 查看服务容器输出的日志
  • docker-compose restart: 重启项目中的服务
  • docker-compose rm: 删除所有(停止状态的)服务容器

❝

强调:首先需要执行docker-compose stop,将服务停止后,在执行该命令

❞

  • docker-compose config: 查看项目配置
  • docker-compose version: 打印版本信息

compose版本

下图是在docker官网中的一张compose和docker版本对应图,大家可以看到不同的docker引擎的版本对应不同的Compose版本,那么这个有什么用呢?这个在我们编写docker-compose.yml文件大有用处。

何为服务编排

Compose允许用户通过一个docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project),即将不同服务通过一个模本文件组装为一个项目。

Compose模板文件是一个定义服务、网络和卷的YAML文件

Docker-Compose标准模板文件应该包含version、services、networks三大部分

编写模板文件

上文提到,一个标准的docker-compose文件,应该包含version、services、networks三大部分,下来看一个docker-compose.yml样例。下文样例是借助极客时间专栏es作者阮一鸣老师的模板,我稍加改造后的。下篇文章我们会编写自己的docker-compose.yml文件,编排我们自己的服务。

version: '3.8'
services:
  cerebro:
    image: lmenezes/cerebro:0.8.3
    container_name: cerebro
    ports:
      - "9000:9000"
    command:
      - -Dhosts.0.host=http://elasticsearch:9200
    networks:
      - es7net
  kibana:
    image: docker.elastic.co/kibana/kibana:7.8.0
    container_name: kibana7
    environment:
      - I18N_LOCALE=zh-CN
      - XPACK_GRAPH_ENABLED=true
      - TIMELION_ENABLED=true
      - XPACK_MONITORING_COLLECTION_ENABLED="true"
    ports:
      - "5601:5601"
    networks:
      - es7net
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.8.0
    container_name: es7_01
    environment:
      - cluster.name=triumphxx
      - node.name=es7_01
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - discovery.seed_hosts=es7_01,es7_02
      - cluster.initial_master_nodes=es7_01,es7_02
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - es7data1:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - es7net
  elasticsearch2:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.8.0
    container_name: es7_02
    environment:
      - cluster.name=triumphxx
      - node.name=es7_02
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - discovery.seed_hosts=es7_01,es7_02
      - cluster.initial_master_nodes=es7_01,es7_02
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - es7data2:/usr/share/elasticsearch/data
    networks:
      - es7net
      
volumes:
  es7data1:
    driver: local
  es7data2:
    driver: local

networks:
  es7net:
    driver: bridge

❝

可以看到,这个模板文件的主体部分包含:version: 兼容docker版本的Compose文件格式版本, services:需要编排的服务 volumes:数据卷挂载路径设置 networks:网络定义。

service下首先需要指定,服务的名称,服务所用到的镜像以及定义启动容器的名称、映射端口、容器启动后执行的命令和连接的网络。

elasticsearch服务配置稍微复杂一些,还设置了运行环境,包括:集群名称、节点名称、jvm参数、以及ES集群配置,限制设置,这部分我们会在在讨论es的文章中专题讨论,小伙伴们,没有明白也不用着急。

volumes定义了俩个数据卷挂载路径,分别给俩个es服务使用

networks定义网络模式为bridge名称为es7net的网络,启动的四个服务都会连接上这个网络

❞

启动项目

docker-compose.yml文件编写完成后,我们就可以执行进入到yml文件目录下执行docker-compose up目命令来启动项目。

❝

在启动的过程中,Compose会检查本地是否有项目中使用的镜像,如果没有,会自动去docker hub拉取镜像。

❞

小结

好啦,小伙伴们,本文我们介绍了,说明是docker-compose以及常用的命令,并且分析了一个Compose文件应该怎么书写。希望大家有所收获。下篇文章进行实战,将一个SpringCloud的服务进行编排。欢迎持续关注。

你该知道的Docker-compose的更多相关文章

  1. 什么,容器太多操作不过来?我选择Docker Compose梭哈

    接上一篇:面试官:你说你精通 Docker,那你来详细说说 Dockerfile 吧 一.容器之间通信 1.单向通信 1.1.什么意思 mysql和tomcat是两个独立的容器,但是tomcat需要和 ...

  2. 每个JavaScript开发人员应该知道的33个概念

    每个JavaScript开发人员应该知道的33个概念 介绍 创建此存储库的目的是帮助开发人员在JavaScript中掌握他们的概念.这不是一项要求,而是未来研究的指南.它基于Stephen Curti ...

  3. PHP开发者该知道的5个Composer小技巧

    Composer 是新一代的PHP依赖管理工具.本文介绍使用Composer的五个小技巧,希望能给你的PHP开发带来方便. 1. 仅更新单个库 只想更新某个特定的库,不想更新它的所有依赖,很简单 co ...

  4. Docker深入浅出系列 | Docker Compose多容器实战

    目录 前期准备 Docker Compose是什么 为什么要用Docker Compose Docker Compose使用场景 Docker Compose安装 Compose Yaml文件结构 C ...

  5. Sentry 监控 - 私有 Docker Compose 部署与故障排除详解

    内容整理自官方开发文档 系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentry-CLI - 30 秒上手 Source Map ...

  6. Docker从入门到精通(八)——Docker Compose

    恭喜大家,学到这里,对于 docker 的基础玩法大家应该都会了,下面会介绍 docker的一些编排工具. 1.为什么需要 Docker Compose? 官网镇楼:https://www.runoo ...

  7. 5种常见的Docker Compose错误

    在构建一个容器化应用程序时,开发人员需要一种方法来引导他们正在使用的容器去测试其代码.虽然有几种方法可以做到这一点,但 Docker Compose 是最流行的选择之一.它让你可以轻松指定开发期间要引 ...

  8. 程序员必须要知道的Hadoop的一些事实

    程序员必须要知道的Hadoop的一些事实.现如今,Apache Hadoop已经无人不知无人不晓.当年雅虎搜索工程师Doug Cutting开发出这个用以创建分布式计算机环境的开源软...... 1: ...

  9. 【转载】在IT界取得成功应该知道的10件事

     在IT界取得成功应该知道的10件事 2011-08-11 13:31:30 分类: 项目管理 导读:前面大多数文章都是Jack Wallen写的,这是他的新作,看来要成为NB程序员还要不停的自我总结 ...

  10. Docker compose学习笔记

    一.compose compose 作用 你的应用可能需要很多个服务,比如web服务,数据库服务,缓存服务等等.我们可以把这些服务放到单独的容器里面,如果手工去配置这些服务会有些麻烦,docker c ...

随机推荐

  1. µDoo持有者将分享我们广告总收入的10%,并以BTC支付!

    Jason8th October 2019 在数字化世界中,去中心化将是未来,Howdoo的社交媒体和内容交付理念为在新经济中使用的核心用户提供了公平.透明的奖励回报.随着Howdoo上的内容创作者有 ...

  2. SpringCloud组件的停更和替换说明

    SpringCloud的Hoxton版本,和之前的版本相比,用新的组件替换掉了原来大部分的组件,老的组件现在处于 停更不停用 的状况. 详情见下图(× 的表示之前的组件,现在停更了的:√ 的表示新的替 ...

  3. 浏览器如何解析css选择器?

    浏览器会『从右往左』解析CSS选择器. 我们知道DOM Tree与Style Rules合成为 Render Tree,实际上是需要将Style Rules附着到DOM Tree上, 因此需要根据选择 ...

  4. 谈谈你对 TCP 三次握手和四次挥手的理解

    TCP三次握手: 1.客户端发送syn包到服务器,等待服务器确认接收. 2.服务器确认接收syn包并确认客户的syn,并发送回来一个syn+ack的包给客户端. 3.客户端确认接收服务器的syn+ac ...

  5. three.js 几何体(二)

    上一篇简单的介绍了几何体的构造体参数,这一篇郭先生就更加详细的说一说(十分简单的几何体我就不说了). 1. ShapeGeometry形状几何体 形状几何体方便我们从一个或多个路径形状中创建一个单面多 ...

  6. linux常用命令(自己感觉常用的)

    常用命令 常用指令 ls 显示文件或目录 -l 列出文件详细信息l(list) -a 列出当前目录下所有文件及目录,包括隐藏的a(all) shutdown -r 重启 -h 关机 reboot 重启 ...

  7. python数据处理(九)之自动化与规模化

    1 前沿 1.1 适合自动化的任务 每周二输出一些新的分析结果,编制一份报告,并发送给相关方 其他部门或同事需要能够在没有你的指导和支持下运行报告工具和清洗工具 每周进行一次数据下载.清洗和发送 每次 ...

  8. 网上一些sql题目的解决(网上答案+自己答案)

    此篇博客内容引自“MySQL经典练习题及答案” 废话不不多说!!! 建表.插入数据. --建表 --学生表 CREATE TABLE Student( s_id VARCHAR(20), s_name ...

  9. CentOS7 源码编译安装Nginx

    源码编译安装nginx     1.下载nginx源码包(这里以nginx-1.18.0为例) wget http://nginx.org/download/nginx-1.18.0.tar.gz 2 ...

  10. vue 应用 :关于 ElementUI 的 message 组件

    我们知道,这个东西的基本用法是这样的: this.$message({ message: '恭喜你,这是一条成功消息', type: 'success' }); 但是我觉得这样还是有点麻烦,所以我决定 ...