Docker小白到实战之Docker Compose在手,一键足矣

2023-11-12

前言

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

如下图:

cc75a3c8ada53ed5db7f1a31c7435869.png
2.2 授予执行权限

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

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

看看权限结果分配如下:

115967eecc95e4d14d171b17a5a6a997.png

这样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。

    a4cccaa6a01e1dec5a2174f8761fb240.png

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

    6f25accb810662674e91145a84b75330.png

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

    bb57a186fbcf8ceacc16f90923540038.png

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

    548312914c94a7715d917a0e25abd4f5.png
  • 编写Dockerfile文件

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

    108773c564953bc52ad58d5b3e5bc025.png

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

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

  • 编写Compose文件

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

    230d465513ec5b29de1521724f587e0a.png

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

    9a155d02640981ccf51b0bf30fa0d4de.png

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

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

    3ac2161453832a14cd6ed70cdf49726a.png

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

    a58614841d15b72ba37424eff88e90e9.png
  • 一键启动

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

    docker-compose up

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

    841f1a363552c3b418ead7dc13bdbf8e.png

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

    f205ed0ba5780b8534d75992b4d1d713.png
  • 看看启动的容器名

    5e802dc833d8b25aa24548270c61d397.png
    image-20211007165313310

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

    9613a5592133a5dc7cbf9adeddb87193.png

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

    b869781636c3dadc7b36f2af263dbfc7.png
  • docker compose常用命令

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

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

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

    27ef7cbc1f3884585a7361598d392fb9.png

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

    09047f10eaffeafdd344f8c2307831d1.png

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 【小教程】Potplayer配置 播完停止+打开单个文件非文件夹+单个播放器打开文件

    最近在练托福听力 用Potplayer听片段的时候有些需求 播放完听力片段后停止 而不是重听 打开听力片段时仅打开单个文件 而不是当前文件夹 播放完听力片段后 打开下一个听力片段时 使用当前单个播放器 而不是重新打开一个播放器播放 下面记录
  • SDK的使用步骤

    原文地址 SDK的使用步骤 远方是什么样子 博客园 cnblogs com SDK包括三种类型文件 1 头文件 h 2 库文件 lib 3 动态库 dll 第一步 在项目目录中新建一个Libs文件夹 再在该文件夹中分别新建inc文件夹和li
  • 手把手教你如何修改jar包,以及了解JVM虚拟机的重要性

    背景 公司要求修改以前的项目调用的代码 但是发现代码已经丢失了只剩下jar包了 想起来以前学习JVM的Javap 已经反编译jar包在此我都尝试了一下做一下记录方便以后遇到 一 常规Jar包修改流程 1 定位问题 通过通过procmon监控
  • 损失与损失函数L1、L2、MSE

    损失 是一个数值 表示对样本而言模型预测的准确程度 如果模型的预测完全正确 则损失为零 反之损失会很大 训练模型的目标是从所有的样本当中 找到一组损失较小的权重与偏差 其 损失较小 的考量取决于具体需要 损失函数 L1损失 基于模型预测的值
  • idea中创建jsp项目的详细实战步骤

    1 打开idea 在file gt new gt project中新建一个普通的java项目 2 在项目名右键Add Framework Support选项中 Web Application上打勾 点击OK 3 项目列表 gt web gt
  • Foxmail登录不上163邮箱。。。

    前不久重新装了系统 Foxmail重新安装 账号和密码一直登录不对 首先登录163网易邮箱 点击邮箱 设置 选择左侧栏的 POP3 SMTP IMAP 然后检查右侧窗格中是否开启对 POP3 SMTP服务 和 IMAP SMTP服务 的选择
  • 10个python爬虫入门实例

    1 爬取强大的BD页面 打印页面信息 第一个爬虫示例 爬取百度页面 import requests 导入爬虫的库 不然调用不了爬虫的函数 response requests get http www baidu com 生成一个respon
  • LLVM简明安装教程(非常详细)从零基础入门到精通,看完这一篇就够了

    官网下载地址 https releases llvm org 截止2020 9 13 最新版本为LLVM10 0 1 下载源码进行手动编译 一般情况下只需要下载LLVM source code Clang source code compi
  • PredictionIO

    安装PredictionIO 参考http predictionio apache org install install sourcecode wget http mirrors tuna tsinghua edu cn apache p
  • zookeeper session实现机制

    zookeeper session实现机制 TO DO
  • Windows环境下Visual Studio 配置Clang步骤

    一 下载安装所需要的工具 1 下载安装SVN 打开http subversion apache org packages html 下载TortoiseSVN 像我是下载了64位的 下载好之后安装就好 到这里 SVN是可以用了 如果在Win
  • 【CTFshow】Web1-Web10

    Web1 Web10 Web1 直接查看源代码 Web2 所以打不开控制台 无论按鼠标右键还是按f12 都看不了源代码 查看源代码 通过在url头部添加 view source Web3 什么都没有 抓包看看 Web4 robots协议 W
  • JAVA语法

    Java 语法是语言的基础 是编写编译器和计算机 理解 的程序的所有主要规则 命令 结构 每种编程语言都有其语法和人类语言 文章目录 前言 一 Java语法是什么 二 基础语法 1 注释 2 关键字 3 常量 4 数据类型 5 变量 6 标
  • 虚拟机安装遇到的一个问题

    我是r7000p用户 由于工作需要 安装了一个虚拟机 安装了VMware Workstation Pro 15 5 0 然后安装了Linux系统 安装成功之后 准备开启虚拟机 但是系统安装过程中出现电脑重启 多次均出现重启现象 到这个界面就
  • HTML详解连载(6)

    HTML详解连载 6 专栏链接 link http t csdn cn xF0H3 下面进行专栏介绍 开始喽 CSS特性 继承性 注意 层叠性 特点 优先级 规则 公式 注意 叠加计算 公式 每以及之间不存在进位 规则 Emmet写法分析
  • python开发效率怎样_python开发效率

    广告关闭 腾讯云11 11云上盛惠 精选热门产品助力上云 云服务器首年88元起 买的越多返的越多 最高返5000元 题主想要提高开发效率 下面这款人工智能工具 可以在不需要把ide玩的666的时候也能提高你自己开发软件的效率 机缘巧合最近开
  • 两个类是同一个类的判断标准

    两个类是同一个类的判断标准 1 完整的类名必须相同 包括包名 2 使用同一个类加载器加载 如果一个类是由用户自定义的加载器加载的 那么JVM会将这个类的类加载器的一个引用作为类型信息的一部分保存在方法区中 类的主动使用与被动使用 1日常的操
  • Nginx修复CORS漏洞方案(亲测可行)

    漏洞介绍 概述 CORS 跨域资源共享 Cross origin resource sharing 是H5提供的一种机制 WEB应用程序可以通过在HTTP增加字段来告诉浏览器 哪些不同来源的服务器是有权访问本站资源的 当不同域的请求发生时
  • 服务器的内核信息,服务器的内核怎么看

    服务器的内核怎么看 内容精选 换一换 业务接入DDoS高防后 经过高防转发的流量到服务端之后真实源IP将被隐藏 在业务应用开发中 通常需要获取客户端真实的IP地址 例如 投票系统为了防止刷票 需要通过获取客户端真实IP地址 限制每个客户端I
  • Docker小白到实战之Docker Compose在手,一键足矣

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