【Docker】(七)使用docker-compose一键部署环境
使用 Docker Compose ,可以通过 docker-compose.yml 文件来替代指令来编排容器,yml文件可以一目了然的看到容器之间的关系,避免了使用一大堆繁琐的指令。同时,可以将已编写好的 compose 文件,共享给他人使用,起到了一次编写,到处运行的效果,减少了大量的重复工作。由于微服务时代的到来,我们生产环境中的应用服务往往是多机多节点部署, Docker Compose
1.前言
本系列文章记录了从0开始学习Docker的过程,Docker系列历史文章:
(一)基本概念与安装使用
(二)如何使用Docker发布一个SpringBoot服务
(三)使用registry远程镜像仓库管理镜像
(四)使用volume持久化Docker容器中的Redis数据
(五)使用bind mounts修改Docker容器中的Nginx配置
(六)使用network完成容器间的网络通信
在前面的几篇文章中,介绍了如何通过 Docker指令 来部署一个SpringBoot,以及如何使用已经构建好的中间件镜像来安装中间件,随着服务器节点中的容器数量增多,继续使用 指令的方式来管理容器,那管理的复杂度将会越来越高,例如:
- 需要一个一个的创建不同的自定义
volume
、network
,指令繁琐。 - 需要手动创建服务,并挨个处理其容器卷与网络之间的对应关系。
- 随着容器数量的上升,不容易处理不同容器分组的隔离关系。
- ……
为了解决服务器中的容器管理问题,Docker的一个针对单机环境的服务编排工具,也就是Docker Compose
。使用Docker Compose,可以通过yaml
文件来管理容器,使用yaml
中的标签来描述容器的各类信息,容器与Docker中个各类组件的关联关系,最终只需要使用docker comse up
这一个指令,就可以将yaml
中已配置好的容器启动起来。
同时,可以将已经编写好的docker-compose.yml
文件分享给他人使用,例如,我可以编写一个搭建开发环境的docker-compose.yml
文件,给同部门的其他同学使用,让他们也能够一键搭建工作所需的开发环境。
此外,在GitHub中,也有非常多的项目会提供docker-compse.yml
文件,开发者可以通过这个文件来一键创建项目环境,例如在GitHub上搜索 elk
,可以看到这样的结果:
2.安装与使用
2.1 安装与卸载
根据官网的描述,如果是在 Windows/Mac 环境中,通过 Docker Desktop 安装的Docker,就已经自带了 Docker Compose,如果是在Linux环境中,则需要自行安装Docker Compose插件。
我这里使用的是CentOS,通过yum安装非常简单,如果安装的版本不对,可以通过下面的指令卸载。
sudo yum update
sudo yum install docker-compose-plugin
# 卸载
sudo yum remove docker-compose-plugin
使用docker compose version
查看版本,打印出版本号表示安装成功,如果是其他的环境,可以参考《Docker Compose 安装官方文档》
2.2 核心概念
Docker Compose 使用 docker-compose.yml
来描述需要编排的服务信息,这样的一个文件启动后对应的是一个完整的业务单元,称为project
。在project中,包含了network
,volume
,以及多个容器的信息,我们把容器信息称为service
。此外,在docker-compose.yml
文件中还对应了语法解析版本:version
。
这里的version
版本与 Docker的对应关系如下:
使用docker -v
查看当前 Docker 的版本:
当前的 Docker 版本对应的 Compose 文件解析版本均可以使用。
2.3 基本语法及使用
现在通过创建MySQL容器来简单的演示一下如何使用compose文件,在上面的核心概念中,我们已经知道了,compose文件一共可以分成4个部分,分别为:
version:
services:
volumes:
networks:
按照下面的步骤,将这几个标签依次填充起来。
第一步:指定文件版本号
可以按照上面的版本对应表找到可以使用的version
版本号,此处我们选择3.8(注意此处为字符串),即:
version: '3.8'
第二步:创建volumes
需要将 MySQL 的数据文件挂载到宿主机中,需要创建 volumes ,此处我们创建一个mysql-data-volume
作为 volume 的 name ,如果使用指令创建可以输入:
docker volume create mysql-data-volume
对应的,在compose文件中可以写成:
volumes:
mysql-data-volume:
# 当然,如果还要创建其他的volume,可以直接追加在下面
other-volume:
第三步:创建network
如果不创建 network 则会使用默认的 docker 网络,但是我们一般会将有关联关系的一组应用放在一个自定义的网络中,所以此处我们创建一个 my-app-brigde
网络,创建方式与创建 volume 类似。
- 使用指令的方式:
docker network create my-app-bridge
- compose文件
networks:
my-app-bridge:
driver: bridge
第四步:创建MySQL容器
使用已经创建好的 network 与 volume 来创建MySQL容器:
- 使用指令:
docker run -dp 3309:3306 \
--name=mysql \
--volume=mysql-data-volume:/var/lib/mysql \
--network=my-app-bridge \
-e MYSQL_ROOT_PASSWORD=huizhiyimo \
mysql
- compose文件:
services:
mysql:
image: mysql
ports:
- "3309:3306"
volumes:
- mysql-data-volume
networks:
- my-app-bridge
environment:
MYSQL_ROOT_PASSWORD: huizhiyimo
综上,可以获取到一个完整的 docker-compose.yml 文件。
version: '3.8'
services:
mysql:
image: mysql
ports:
- "3309:3306"
volumes:
- mysql-data-volume
networks:
- my-app-bridge
environment:
MYSQL_ROOT_PASSWORD: huizhiyimo
volumes:
mysql-data-volume:
networks:
my-app-bridge:
driver: bridge
将文件移动到服务器中,通过docker compose up -d
启动。
启动后,依次创建 Network , Volume , 并启动MySQL容器,注意上面的命名与实际启动后的名称差异,实际启动后的名称前面多了mysql_
的前缀,这是因为使用 docker compose 启动,或默认拼接上当前目录名称的前缀。
注:同一目录下有多个compose.yml文件的时候,可以通过-f
指定需要执行哪个文件,例如:docker compose -f docker-compose.yml up -d
2.4 一键部署环境
按照上面所说的语法,我们可以在 compose 文件中编写开发环境中所需要使用到的工具,例如:redis,nginx,mysql,rabbitMQ,Zookeeper等,可以按照需要添加自己所需的工具,compose 文件如下:
version: '3.8'
services:
my-redis:
image: "redis:alpine"
ports:
- "6379:6379"
volumes:
- my-redis-volume:/data
restart: always
networks:
- dev-network
my-nginx:
image: "nginx"
ports:
- "80:80"
volumes:
- /usr/docker/nginx-conf:/etc/nginx/conf.d
restart: always
networks:
- dev-network
my-mysql:
image: mysql
ports:
- "3309:3306"
volumes:
- my-mysql-volume:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: huiyizhimo
restart: always
networks:
- dev-network
my-rabbitMQ:
image: "rabbitmq:management"
ports:
- "5671:5671"
- "5672:5672"
- "15671:15671"
- "15672:15672"
- "25672:25672"
- "4369:4369"
hostname: "rabbit-server"
volumes:
- my-rabbit-volume:/var/lib/rabbitmq
restart: always
networks:
- dev-network
my-zookeeper:
image: "zookeeper"
ports:
- "2181:2181"
restart: always
networks:
- dev-network
volumes:
my-redis-volume: {}
my-mysql-volume: {}
my-rabbit-volume: {}
networks:
dev-network:
driver: bridge
可以将这个文件在任何一个装有 Docker Compose 的机器中运行。
运行成功后,工具就可以直接使用了,使用zkTool链接成功。
2.5 部署GitHub中的开源项目
除了部署我们自己的环境之外,我们也可以在GitHub可以找到通过docker-compose.yml
编排的开源项目docker-elk
,尝试是否可以将它部署到服务器中。
首先,通过git
下载到服务器中的/usr/docker
目录中(这个目录是我自行创建的)
git clone https://github.com/deviantony/docker-elk
然后,进入到 docker-elk 目录中,通过 compose 文件部署服务。
cd docker-elk
docker compose up -d
# 查看compose列表
docker compose ls
这里可以注意一下上图中的执行顺序,启动成功后,通过 http://192.168.200.101:5601/login
访问,(192.168.200.101
是我本地安装的虚拟机ip地址,这里可以改成自己的服务器ip。),如下图,成功打开登录界面。
此外,我们也可以去查看 docker-elk 中的 docker-compose.yml 文件的编写内容,模仿其用法来编写自己的开源项目。
2.6 环境变量的使用
在 docker-elk 的 yml文件中,我们可以看到 ${xxx}
这样的语法,这个就是环境变量的使用,我们将变量的值写在.env
文件中,在启动的时候,就可以将实际的变量值映射到 compose 文件中。
3.结语
使用 Docker Compose ,可以通过 docker-compose.yml 文件来替代 docker command
指令来编排容器,yml文件可以一目了然的看到容器之间的关系,避免了使用一大堆繁琐的指令。
同时,可以将已编写好的 compose 文件,共享给他人使用,起到了 一次编写,到处运行 的效果,减少了大量的重复工作。
由于微服务时代的到来,我们生产环境中的应用服务往往是多机多节点部署, Docker Compose 这种单机容器编排的方式使用的就越来越少了,转而使用 K8S 来进行服务的管理。
如果觉得本文对你有所帮助,可以帮忙点点赞哦!你的支持是我更新最大的动力!
更多推荐
所有评论(0)