1.前言

本系列文章记录了从0开始学习Docker的过程,Docker系列历史文章:

(一)基本概念与安装使用
(二)如何使用Docker发布一个SpringBoot服务
(三)使用registry远程镜像仓库管理镜像
(四)使用volume持久化Docker容器中的Redis数据
(五)使用bind mounts修改Docker容器中的Nginx配置
(六)使用network完成容器间的网络通信

在前面的几篇文章中,介绍了如何通过 Docker指令 来部署一个SpringBoot,以及如何使用已经构建好的中间件镜像来安装中间件,随着服务器节点中的容器数量增多,继续使用 指令的方式来管理容器,那管理的复杂度将会越来越高,例如:

  • 需要一个一个的创建不同的自定义volumenetwork,指令繁琐。
  • 需要手动创建服务,并挨个处理其容器卷与网络之间的对应关系。
  • 随着容器数量的上升,不容易处理不同容器分组的隔离关系。
  • ……

为了解决服务器中的容器管理问题,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中,包含了networkvolume,以及多个容器的信息,我们把容器信息称为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 来进行服务的管理。


如果觉得本文对你有所帮助,可以帮忙点点赞哦!你的支持是我更新最大的动力!

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐