zoukankan      html  css  js  c++  java
  • Docker小白到实战之Docker Compose在手,一键足矣

    前言

    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文件中映射的端口访问了,如下:

    • 看看启动的容器名

      image-20211007165313310

      通过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综艺圈”,和我一起学习吧;

  • 相关阅读:
    【转】【python】装饰器的原理
    Common Subsequence---最长公共子序列
    N个数的全排列 -------指定排头法
    Oil Deposits----深搜问题
    Worm
    亲和串
    n个数的最小公倍数
    整除的尾数
    Substrings 子字符串-----搜索
    N的互质数----欧拉函数
  • 原文地址:https://www.cnblogs.com/zoe-zyq/p/15391746.html
Copyright © 2011-2022 走看看