前言

Docker可以将应用程序及环境很方便的以容器的形式启动,但当应用程序依赖的服务比较多,或是遇到一个大系统拆分的服务很多时,如果还一个一个的根据镜像启动容器,那就有点累人了,到这有很多小伙伴会说:弄个脚本就搞定啦;要的就是这个思路,Docker提供了一个叫Docker Compose的工具,一键启动相关服务。

举个例:比如开发一个Web项目,需要有数据库、Redis、MongoDB、配置中心等等,如果将其进行容器化,可以有两种选择,第一种就是把所有的服务依赖和应用程序全部构建为一个镜像,然后以一个容器运行,即这个容器里面包含了Web应用程序、数据库、Redis、MongoDB、配置中心等;另一种方式就各自服务单独启动为一个容器服务,比较独立,一般可以一个一个的启动容器,然后通过网络连接起来就行;显然第二种方式是小伙伴们更多的选择,如果能配上一个批量操作那就完美了,而Docker Compose就是来干这个事的。

正文

1. 概述

Docker Compose 是一个用于定义和运行多个容器服务的 Docker 应用程序工具;搭配使用 YAML 文件来配置应用程序服务,然后运行Docker Compose命令,一键启动所有容器服务

2. 安装

Docker默认安装环境下是不包含Docker Compose工具的,需要单独安装。Docker Compose工具搭配Docker才有意义,所以安装Docker Compose之前需要安装Docker。以下演示平台为Linux,其他平台请参照文档:https://docs.docker.com/compose/install/

2.1 下载文件

其实Docker Compose是一个可执行文件,直接下载对应文件即可,执行如下命令:

# 下载Docker Compose文件, 这个地址下载比较慢
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 curl -L "https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

如下图:

2.2 授予执行权限

下载下来的文件默认是没有执行权限的,后续需要执行,所以得授予执行权限,执行如下命令即可:

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

看看权限结果分配如下:

这样docker-compose就安装完啦。

2.3 卸载

如果需要卸载,直接删除即可,执行如下命令即可:

sudo rm /usr/local/bin/docker-compose

3. 使用

Docker Compose需要搭配YAML文件使用,YAML 是一种人类友好的数据序列化语言,适用于所有编程语言,后缀名为.yml

所以在进行实操前,需要大概的了解一下YAML的语法,不要慌,语法和Json的思路很像,大概了解一下,后续用到查文档就行啦。

3.1 简单说说语法

YAML文件内容是通过空格的缩进来代表层次,常用的数据类型有如下:

  • 对象:键值对集合;

    # yaml 对象语法
    testKey:testValue
    # Json 语法
    {"testKey":"testValue"}
    # yaml 嵌套对象
    testKey:{testKey1:testValue1,testKey2:testValue2}
    # Json 语法
    {"testKey":{"testKey1":"testValue1","testKey2":"testValue2"}}
  • 数组:一组按次序排列的数据;用-前缀表示。

    # yaml 数组语法
    -value1
    -value2
    -value3
    # Json 数组语法
    ["value1","value2","value3"]
    # yaml 数组行内语法
    testKey:[value1,value2]
    # Json 语法
    {"testKey":['value1','value2']}
  • 纯量:不可再分的值,包括字符串、整数、浮点数、日期、布尔值等。

    # yaml
    testKey:666
    # Json
    {testKey:666}
    # yaml
    isbool:true
    # Json
    {isbool:true}

常规的基本语法格式约定如下:

  • 大小写敏感
  • 使用空格缩进表示层级关系
  • 缩进不允许使用tab,只允许空格
  • 缩进的空格数不重要,只要相同层级的元素左对齐即可
  • '#'表示注释

大概了解上面这些,关于日常Docker Compose用到的文件基本上够用了,如果有需要进阶的,可以去查查对应的语法。传送门:

https://yaml.org/spec/1.2.2/

https://www.runoob.com/w3cnote/yaml-intro.html

关于YAML文件内容中配置的命令和Dockerfile的命令差不多是一一对应的,稍后会简单说说。

3.2 实操撸文件

这里还是以一个WebApi为例,例中需要依赖Redis服务。

  • 创建项目,编写例子

    这里只是引入了一个Redis的缓存包,通过构造函数注入之后就可以直接用啦;编写了一个API接口TestCache。

    这里还需要在Startup文件中注入相关服务,并指定Redis的连接地址,如下:

    运行起来测试一下效果,如下:

    Redis中也有值了,这里需要注意:存入Redis中的类型是Hash。

  • 编写Dockerfile文件

    在项目根目录创建一个Dockerfile文件,内容如下:

    关于Dockerfile中的内容这里就不细说了,之前有一篇文章专门分享的(点这里)。 这里的Dockerfile目的就是将我们的WebApi项目构建为镜像,和Redis没有关系,不过这里不是通过执行命令构建,而是通过Compose文件一起构建。

    注:这里记得将Dockerfile文件通过右键->属性->设置为始终复制,保证编译后的文件有最新文件

  • 编写Compose文件

    在项目根目录下创建docker-compose.yml文件,内容如下:

    有了这个项目就可以一键启动了,这里需要稍微改一下我们原来的代码,如下:

    注:这里记得将docker-compose.yml文件通过右键->属性->设置为始终复制,保证编译后的文件有最新文件。

3.3 体验一键启动
  • 将项目先发布,并拷贝到对应的服务器上,如下:

    这里用的是我的阿里云服务器,拷贝文件如下:

  • 一键启动

    在docker-compose.yml所在的目录下执行如下命令:

    docker-compose up

    下面是执行docker-compose up内部执行的步骤:

    先是构建我们的程序,然后拉取依赖的Redis服务,并启动,最后启动我们的程序。(执行顺序和依赖有关系);启动之后就可以根据docker-compose.yml文件中映射的端口访问了,如下:

  • 看看启动的容器名

    通过docker ps -n 2 查看最近启动的容器,容器的名字规则是: 目录名_Compose文件中定义的服务名_序号,那小伙伴肯定会好奇为什么程序能通过myredis名字连接到redis,可以通过docker inspect composetest_myredis_1查看容器详情:

    同样可以查看到API服务对应的容器也是用的composetest_default这个网络,这个网络是一个桥接模式,可以通过docker network ls看到,如下:

  • docker compose常用命令

    docker-compose build:构建或者重新构建服务

    docker-compose up:构建、启动容器,加上-d选项代表后台运行。

    docker-compose ps:列出所有通过Compose运行的容器

    docker-compose logs:打印相关日志信息

    docker-compose stop/start/restartd:可以指定服务停止、开始和重新启动

    docker-compose命令和docker的命令基本是一样的。

  • docker-compose.yml文件内容常用属性

    version:指定 docker-compose.yml 文件的版本,一般都是用version 3;

    services:定义多个容器集合,有多少写多少;

    build:构建镜像,和docker build一样功效;

    environment:配置环境变量,和Dockerfile中ENV 关键字功能一样;

    # 设置环境变量
    environment:
    RACK_ENV: development
    SHOW: 'true'

    expose:暴露端口,和Dockerfile中的EXPOSE 关键字功能一样;

    expose:
    - "80"
    - "9999"

    ports:配置端口映射,和docker run -p一样功效

    ports:
    - "8080:80"
    - "6379:6379"

    volumes:指定卷挂载路径,与Dockerifle中的VOLUME 关键字功能一样

    volumes:
    - /var/lib/mysql
    - /opt/data:/var/lib/mysql

    command:覆盖容器启动后默认执行的命令,和Dockerfile文件中的CMD命令一样;

    command: bundle exec thin -p 3000

    image:指定要用的镜像,构建的时候会拉取。

    # 指定要使用redis镜像
    image: redis

上面列出了一些比较常用的,具体的可以参考官网:https://docs.docker.com/compose/compose-file/compose-file-v3/

代码地址如下:https://gitee.com/CodeZoe/microservies-demo/tree/main/DockerComposeDemo

总结

上文只是演示了Docker Compose的使用,详细的Compose文件内容还需要在实际应用过程中根据实际需要查阅,后续在说集群的时候还会说到。

关注“Code综艺圈”,和我一起学习吧;

Docker小白到实战之Docker Compose在手,一键足矣的更多相关文章

  1. Docker小白到实战之Docker网络简单了解一下

    前言 现在对于Docker容器的隔离性都有所了解了,但对容器IP地址的分配.容器间的访问等还是有点小疑问,如果容器的IP由于新启动导致变动,那又怎么才能保证原有业务不会被影响,这就和网络有挂钩了,接下 ...

  2. Docker小白到实战之容器数据卷,整理的明明白白

    前言 上一篇把常用命令演示了一遍,其中也提到容器的隔离性,默认情况下,容器内应用产生的数据都是由容器本身独有,如果容器被删除,对应的数据文件就会跟着消失.从隔离性的角度来看,数据就应该和容器共存亡:但 ...

  3. Docker小白到实战之Dockerfile解析及实战演示,果然顺手

    前言 使用第三方镜像肯定不是学习Docker的最终目的,最想要的还是自己构建镜像:将自己的程序.文件.环境等构建成自己想要的应用镜像,方便后续部署.启动和维护:而Dockerfile就是专门做这个事的 ...

  4. Docker小白到实战之开篇概述

    前言 "不对啊,在我这运行很正常啊",这句话小伙伴们在前几年应该听得很多:每次一到安装.部署时总有一堆问题,毕竟操作系统版本.软件环境.硬件资源.网络等因素在作怪,此时难免会导致开 ...

  5. Docker小白到实战之常用命令演示,通俗易懂

    前言 上一篇大概认识了Docker,主要是从概念.架构.优点及流程方面进行阐述,并进行安装和体验: 接下来就开始进行实操学习,在演示过程中会针对关键的知识点进行归纳和总结,这里先从常用命令说起,来吧, ...

  6. Docker小白从零入门到实战系列【二】

    1.安装好Centos 7 2.关闭SELINUX sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/configsetenfo ...

  7. Docker小白从零入门实战

    环境:Centos 6.9 0.查看是否满足安装需求. 先检查服务器环境,docker要求操作系统CentOS6以上,kernel 版本必须2.6.32-431或更高,即>=CentOS 6.5 ...

  8. 一个小白的测试环境docker化之路

    本文来自网易云社区 作者:叶子 学习docker搭建测试环境断断续续也有三个多月了,希望记录一下这个过程.常言道,总结过去,展望未来嘛~文章浅显,还望各位大神路过轻拍. 按照国际惯例,先说一下背景: ...

  9. 云计算Docker全面项目实战(Maven+Jenkins、日志管理ELK、WordPress博客镜像)

    2013年,云计算领域从此多了一个名词“Docker”.以轻量著称,更好的去解决应用打包和部署.之前我们一直在构建Iaas,但通过Iaas去实现统一功  能还是相当复杂得,并且维护复杂.将特殊性封装到 ...

随机推荐

  1. 华为oj-判断输入的字符串是不是一个有效的IP地址

    题目标题: 判断输入的字符串是不是一个有效的IP地址 详细描述: 请实现如下接口 boolisIPAddressValid(constchar* pszIPAddr) 输入:pszIPAddr 字符串 ...

  2. Dijkstra链路状态选路算法

  3. JDK1.5新特性之注解

    时间:2017-1-2 20:14 --注解的概述    注释是给人看的,而注解是给程序(框架)看的.    在Servlet3.0中可以使用注解来替代配置文件,开发者就不用再写配置文件了,而是写注解 ...

  4. 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建一个版本

    我们可以使用官方 sentry-cli 工具操作 Sentry API,从而来为你的项目管理一些数据.它主要用于管理 iOS.Android 的调试信息文件,以及其他平台的版本(release)和源代 ...

  5. spring动态切换数据源(一)

    介绍下spring数据源连接的源码类:| 1 spring动态切换连接池需要类AbstractRoutingDataSource的源码 2 /* 3 * Copyright 2002-2017 the ...

  6. 接口测试进阶接口脚本使用--apipost(预/后执行脚本)

    预执行脚本的作用时间 预执行脚本是一个请求发送前执行的脚本. 预执行脚本的作用 预执行脚本可以完成以下作用: 编写JS函数等实现复杂计算: 变量的打印 定义.获取.删除.清空环境变量 定义.获取.删除 ...

  7. .Net Core 中的选项Options

    .NetCore的配置选项建议结合在一起学习,不了解.NetCore 配置Configuration的同学可以看下我的上一篇文章 [.Net Core配置Configuration源码研究] 由代码开 ...

  8. VS Code闪现,巨头纷纷入局的Web IDE缘何崛起?

    我发了,我装的. 就在前几天,微软简短的发布了Visual Studio Code for the Web 的公告,而没过一阵,这则公告就被删除了,现在点经相关内容已经是404状态了.虽然公告的内容已 ...

  9. ELK数据迁移,ES快照备份迁移

    通过curl命令或者kibana快照备份,恢复的方式进行数据迁移 环境介绍 之前创建的ELK 因为VPC环境的问题,需要对ELK从新部署,但是还需要保留现有的数据,于是便有了这篇文档. 10.0.20 ...

  10. Linux基于Docker的Redis主从复制、哨兵模式搭建

    本教程基于CentOS7,开始本教程前,请确保您的Linux系统已安装Docker. 1.使用docker下载redis镜像 docker pull redis 安装完成后,使用docker imag ...