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

如下图:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297220.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hsiaoyang:Google搜索结果页面分析

Hsiaoyang:Google搜索结果页面分析首先请参看Google官方的“搜索结果页”用户在使用搜索引擎的时候,首先会在搜索框中输入关键词,随后SE会返回一个搜索结果呈现给用户。SEO的主要对象是搜索引擎,而了解搜索引擎对搜索结果的展现对于SEO人员的…

泰国小哥又双叒叕整活,奇怪的美少女出现了......

最近“文艺复兴”又流行起来了,这一次遭殃的是80和90后的童年偶像——水兵月。在推特“重绘水兵月”的标签下,民间的绘画高手甚至业内的大佬,都以自己的画风,对下面这张出自《美少女战士》的截图进行重绘。下面让我们来欣赏网络上…

和套套一样,一次性橡胶手套制作现场, 这鬼畜的画风

全世界只有3.14 % 的人关注了爆炸吧知识来源:普象工业设计小站ID:iamdesign如果说套套的制作过程很羞羞那同为乳胶制品的乳胶手套制作过程则可以用魔性甚至惊悚来说走进乳胶手套制作的工厂里迎面而来的是数不清的白色之手不停地在转啊转、甩啊甩这画面不…

Installing OpenCV 2.3.1 in Ubuntu

step1:下载 从http://sourceforge.net/projects/opencvlibrary 下载OpenCV源码,下载文件为OpenCV-2.3.1a.tar.bz2。 cd ~ wget http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.1/OpenCV-2.3.1a.tar.bz2/download step2:…

Magicodes.IE 2.5.6.1发布

2.5.6.12021.10.06修复 #337,bool?类型导出的映射问题2.5.6.02021.10.05合并Magicodes.EPPlus到Magicodes.IE,修复所有单元测试并修复部分Bug对EPPlus进行了部分性能优化(比如使用高性能内存流代替MemoryStream)和功能加强2.5.5.…

OpenSSL--Window生成证书实战

为什么80%的码农都做不了架构师?>>> Windows下使用OpenSSL生成自签证书(亲测) 一,前言 经常写博客的小伙伴儿都知道,大家一般在前言里面会提到为什么写这篇博客,而我这篇博客 主要是探讨OpenSS…

7年赚的2个亿,数学家6年就花光了,全砸在自家的房子上

全世界只有3.14 % 的人关注了爆炸吧知识提到数学家,我以为是这样的:发际线不低,面部表情匮乏,总爱是写外星符号。然而却是这样的,刚刚还在讲sin、cos,一转头就掏出一把小提琴,超高难度的帕格尼尼随想曲说来…

iOS-Runtime知识点整理

本文目录 1.Runtime简介2.Runtime相关的头文件3.技术点和应用场景 3_1.获取属性\成员变量列表3_2.交换方法实现3_3.类\对象的关联对象,假属性3_4.动态添加方法,拦截未实现的方法3_5.动态创建一个类4.面试题-1.Runtime简介回到顶部1.Runtime简介 因为Objc是一门动态语…

人人年薪百万?醒醒!

今天刷知乎,看见一个很有趣的帖子:中青校媒的一份调查结果显示:67.65%的大学生评估自己10年内会年薪百万。这个帖子下面一堆答主在那疯狂的讽刺挖苦,觉得年轻人什么都不懂就会幻想。我倒是觉得年轻人对未来充满憧憬和希望反而是好…

sql not exists用法_SQL Server 2012 高级用法(一)

最近用到了SQL Server 相关数据库等问题,于是整理了如下SQL Server高级用法系列。该系列不再介绍基础用法(select ,insert, update, delete, and or ,order by 等)。本文将介绍高级用法:Top, Like,通配符。三种高级用法。TOP Top 子句用于规定要返回的记…

谈谈女友卸妆后的感受?

1 2 医生和她的实习助手3 那个,打针的话能不能轻点呀4 ok,学会了 图自青鲤5 有点甜~6 一个人可以无聊到什么程度?7 所谓的前翻乾坤无敌轮回抓鱼大法。。8 《请回答1988》中的珍珠饰演者金雪演唱插曲《惠化洞》(来源于weibo&#x…

隐形材料你见过吗?

1 提前锻炼,为春运做准备2 隐形的聚合物3 黄山西海地轨电车好像驶入了画中.....4 大猪蹄子,就是喜欢年轻的5 现在的小学生太会了吧!6 当狗穿上了鞋,脚就不是自己的脚了~7 你仿佛在说我是王八???…

java中可以用浮点作为循环变量吗_Java千问:Java循环语句的几个冷门知识点你都知道吗?...

我们在进行Java开发的时候,经常会用到循环结构,但是有几个关于循环的“冷门”知识点,不知道你是不是都已经掌握了呢?我们一起来看看一、大括号可以不写吗?我们都知道,如果每次循环过程中要执行的语句只有一…

各个大学的录取通知书,哪个颜值最高?

近段时间,各大高校纷纷开始晒出自家的录取通知书,快来和小天一起评评哪家的颜值最高!北京工业大学北京科技大学东南大学复旦大学哈尔滨工业大学南京农业大学南开大学清华大学天津大学西安交通大学中国传媒大学北京航空航天大学这不仅仅是一纸…

有关堆栈溢出(in vs 2005)的读书笔记--堆栈中 申请大数组

部分原创 66下一步 Vs 堆栈 理论修改的上限是多少 ? 问题2: 全局变量去 最大的上限是多少? 堆栈(休养版本测试) 2012年3月31日17:31:27 3月 从 10^5到 10^6数组,导致vs… 当前:搭好脚手架…

烧脑又过瘾!这个被严重低估的学习方法,看完瑟瑟发抖!

▲ 点击查看科学家曾在基于脑科学和认知科学后得出一个“学习的金字塔”理论。就是下面这张图:最顶端的就是我们所谓的“知识”,但为了可以达到这个顶端,下面有一系列的支撑能力。而引申出来的核心概念,就叫“玩中学”。不要想当然…

为什么手机最后 10% 的电量很不耐,最后1%的电量最耐用?

全世界只有3.14 % 的人关注了爆炸吧知识手机电量这玩意一直都是个玄学问题。为什么我的小手机,最后 1% 的电量最耐用,每次都够我看完一个十分钟的视频。又或者是为什么我的小手机,最后 10% 的电量很不耐用。。。每次电池报警还有 10% 的电量&…

使用identity+jwt保护你的webapi(三)——refresh token

前言上一篇已经介绍了identity的注册,登录,获取jwt token,本篇来完成refresh token。开始开始之前先说明一下为什么需要refresh token。虽然jwt token有很多优点,但是它的缺点也是非常明显。由于jwt无状态的特性,所以j…

一个10*10的正方形里,最多可以放多少个直径为1的圆?为啥不是100个?

祝大家元宵节快乐知识君曾经给大家出了一道题。↓Q:在一个10*10的正方形里,最多可以放多少个直径为1的圆?为啥不是100个?关于这道题,后台就收到了许多留言,大家纷纷给出了不同的答案。五花八门的答案&#…

【开源框架】:解决方案级别的代码生成器 WebFirst

框架描述WebFirst 是一新代的 代码生成器,用法简单,功能强大,支持多种数据库 ,具体功能如下:一、 建库、CodeFirst方式在线建表,没用到CodeFirst的用户可以用工具轻松体验,支持公共字段二、导出…