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://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在手,一键足矣的更多相关文章
- Docker小白到实战之Docker网络简单了解一下
		前言 现在对于Docker容器的隔离性都有所了解了,但对容器IP地址的分配.容器间的访问等还是有点小疑问,如果容器的IP由于新启动导致变动,那又怎么才能保证原有业务不会被影响,这就和网络有挂钩了,接下 ... 
- Docker小白到实战之容器数据卷,整理的明明白白
		前言 上一篇把常用命令演示了一遍,其中也提到容器的隔离性,默认情况下,容器内应用产生的数据都是由容器本身独有,如果容器被删除,对应的数据文件就会跟着消失.从隔离性的角度来看,数据就应该和容器共存亡:但 ... 
- Docker小白到实战之Dockerfile解析及实战演示,果然顺手
		前言 使用第三方镜像肯定不是学习Docker的最终目的,最想要的还是自己构建镜像:将自己的程序.文件.环境等构建成自己想要的应用镜像,方便后续部署.启动和维护:而Dockerfile就是专门做这个事的 ... 
- Docker小白到实战之开篇概述
		前言 "不对啊,在我这运行很正常啊",这句话小伙伴们在前几年应该听得很多:每次一到安装.部署时总有一堆问题,毕竟操作系统版本.软件环境.硬件资源.网络等因素在作怪,此时难免会导致开 ... 
- Docker小白到实战之常用命令演示,通俗易懂
		前言 上一篇大概认识了Docker,主要是从概念.架构.优点及流程方面进行阐述,并进行安装和体验: 接下来就开始进行实操学习,在演示过程中会针对关键的知识点进行归纳和总结,这里先从常用命令说起,来吧, ... 
- Docker小白从零入门到实战系列【二】
		1.安装好Centos 7 2.关闭SELINUX sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/configsetenfo ... 
- Docker小白从零入门实战
		环境:Centos 6.9 0.查看是否满足安装需求. 先检查服务器环境,docker要求操作系统CentOS6以上,kernel 版本必须2.6.32-431或更高,即>=CentOS 6.5 ... 
- 一个小白的测试环境docker化之路
		本文来自网易云社区 作者:叶子 学习docker搭建测试环境断断续续也有三个多月了,希望记录一下这个过程.常言道,总结过去,展望未来嘛~文章浅显,还望各位大神路过轻拍. 按照国际惯例,先说一下背景: ... 
- 云计算Docker全面项目实战(Maven+Jenkins、日志管理ELK、WordPress博客镜像)
		2013年,云计算领域从此多了一个名词“Docker”.以轻量著称,更好的去解决应用打包和部署.之前我们一直在构建Iaas,但通过Iaas去实现统一功 能还是相当复杂得,并且维护复杂.将特殊性封装到 ... 
随机推荐
- 编辑器扩展 --- 自动化处理之AssetPostprocessor资源导入
			AssetPostprocessor资源导入管线 AssetPostprocessor用于在资源导入时自动做一些设置,比如当导入大量图片时,自动设置图片的类型,大小等.AssetPostprocess ... 
- mac下用clion进行sdl2游戏开发de环境搭建
			1. 故事背景 想从unity转unreal了,于是要使用c++进行开发.unreal引擎那么大,每次打开,我的小本都嗡嗡嗡的,想着不如用个轻量一些的引擎先开发吧,核心代码独立出来,到时候如果真要移植 ... 
- MPI集群搭建
			高性能计算 ubantu下集群搭建 参考博客:https://blog.csdn.net/u012304016/article/details/52423738(尊重别人的知识产权),一些细节 ... 
- 使用vbs调用excel中的宏
			使用vbs打开excel文件,并且传递参数调用excel中的macro,自动化完成excel文件的制作. Set oExcel = createobject("Excel.Applicati ... 
- 如何获取 Android CPU 核心数 (Java/C++)
			1 前言 最近学习Power HAL方面相关知识,透过Power HAL 去配置CPU的Freq需要先确定 CPU 核数.便先了解如何获取 Android CPU 核数. 2 Java层获取方式 // ... 
- MeteoInfo-Java解析与绘图教程(四)
			MeteoInfo-Java解析与绘图教程(四) 上文我们说到,将地图叠加在色斑图上,但大部分都是卫星绘图,现在开始讲解micaps数据绘图,同样也是更多自定义配置 首先我们解析micaps数据,将之 ... 
- Stream流用于按照对象中某一属性来对集合去重+简单数据类型集合的去重
			上次对Stream流来进行分组的文章很多人看,想看的可以来这: Stream流来进行集合分组 这次小编又带来Stream的去重,话不多数,直接上代码: 这是对简单数据类型的去重 //字符串集合进行简单 ... 
- set类型数据的操作指令
			集合无序,无下标. 1. 也可以在集合上继续添加元素. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 
- K8S的部署方式
			K8S部署主要有两种方式: 
- Docker容器管理——进入容器命令
			一.docker exec 命令(这个命令的本质就是让docker exec替我在容器执行一条命令,当执行的命令是/bin/bash的时候就是执行一条登陆命令,则会进入容器内部) 1.让docker ... 
