Docker高级:Compose 容器编排

news2024/11/23 3:20:10

在这里插入图片描述

目录

  • 一、Docker Compose 概述
  • 二、使用 Docker Compose
  • 三、常用命令
  • 四、编排微服务
    • Ⅰ、搭建微服务
    • Ⅱ、编写Dockerfile构建镜像
    • Ⅲ、启动容器,测试服务
    • Ⅳ、使用Compose编排容器
  • 五、总结

一、Docker Compose 概述

Compose 是Docker公司推出的一个软件,可以管理多个Docker容器组成一个应用。我们只需要定义一个YAML格式的配置文件 docker-compose.yaml 配置好多个容器之间的调用关系,最后只需要一个命令,就可以同时控制这些容器进行启动 / 关闭。Compose 允许用户通过一个单独的 docker-compose.yaml 模板文件定义一组容器为一个项目。

举个例子:

假设我们一个项目中使用到了Redis、Mysql、nginx等等很多组件技术,那么对应的Docker容器的实例也会变得非常杂乱。如果其中有一个订单的微服务需要运行,那么就需要前面Redis、Mysql…所有容器都必须启动之后,订单服务才可以正常运行。 至此,就面临到了两个问题:

容器实例非常繁多,复杂
容器的启停以及他们之间的启动顺序需要合理的管理

这时,我们就需要一个介质去管理容器实例之间的协作方式,Docker Compose就为我们合理的解决掉了所面临的问题。当我们要进行启动容器时,只需要执行一条命令,就可以启动全部实例,不需要每个容器都再去一遍一遍 的docker run…

PS:最新版本的Docker本身已经自带了Compose 这个工具,直接使用即可。

在这里插入图片描述

二、使用 Docker Compose

Docker Compose使用的步骤如下:

① 编写Dockerfile定义各个微服务应用并构建出对应的镜像文件

② 使用docker-compose.yaml 定义一个完整的业务单元,安排好整体应用中的各个容器服务

③ 执行docker-compose up命令来启动并运行整个程序,完成一键部署

在这里插入图片描述

三、常用命令

  • 创建并启动docker-compose服务
docker-compose up
# 后台运行
docker-compose up -d
  • 停止并删除容器、网络、卷、镜像
docker-compose down
  • 进入容器实例内部
docker-compose exec <yml里面的服务id> /bin/bash
  • 展示当前docker-compose编排过的运行的所有容器
docker-compose ps
  • 展示当前docker-compose编排过的容器进程
docker-compose top
  • 查看容器输出日志
docker-compose log <yml里面的服务id>
  • 检查配置
docker-compose config
# 有问题才输出
docker-compose config -q
  • 重启服务
docker-compose restart
  • 启动服务:(类似 docker start)
docker-compose start
  • 停止服务
docker-compose stop

四、编排微服务

接下来通过一个案例学习使用Compose编排微服务,具体操作如下:

Ⅰ、搭建微服务

① 创建测试数据库表:t_user

CREATE TABLE `t_user` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '用户名',
  `password` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '密码',
  `sex` TINYINT(4) NOT NULL DEFAULT '0' COMMENT '性别 0=女 1=男 ',
  `deleted` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' COMMENT '删除标志,默认0不删除,1删除',
  `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='用户表'

② 搭建SpringBoot测试工程

在这里插入图片描述
编写配置文件

server.port=6001
# ========================alibaba.druid相关配置=====================
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://47.109.24.39:3306/docker_boot?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.druid.test-while-idle=false
# ========================redis相关配置=====================
spring.redis.database=0
spring.redis.host=47.109.24.39
spring.redis.port=6379
spring.redis.password=
spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-wait=-1ms
spring.redis.lettuce.pool.max-idle=8
spring.redis.lettuce.pool.min-idle=0
# ========================mybatis相关配置===================
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.zhao.docker.entities
# ========================swagger=====================
spring.swagger2.enabled=true

搭建好服务后,我们编写两个测试Controller(这里主要介绍Compose 相关使用,具体Java代码不过多纠结):

@Api(description = "用户User接口")
@RestController
@Slf4j
public class UserController {
    @Resource
    private UserService userService;

    @ApiOperation("新增用户 新增3条")
    @RequestMapping(value = "/user/add",method = RequestMethod.POST)
    public void addUser(){
        for (int i = 0; i <=3 ; i++) {
            User user = new User();
            user.setDeleted((byte)0);
            user.setUpdateTime(new Date());
            user.setCreateTime(new Date());
            user.setUsername("zp"+i);
            user.setPassword(IdUtil.simpleUUID().substring(0,6));
            user.setSex((byte) new Random().nextInt(2));
            userService.addUser(user);
        }
    }

    @ApiOperation("查询用户")
    @RequestMapping(value = "/user/find/{id}",method = RequestMethod.GET)
    public User findUser(@PathVariable Integer id){
        return userService.findUserById(id);
    }
}

③ 使用maven将编好的SpringBoot工程进行打包,放至linux服务器中

在这里插入图片描述

Ⅱ、编写Dockerfile构建镜像

编写Dockerfile将SpringBoot工程构建为镜像,命令如下:

# 基础镜像 java
FROM java:8
# 作者 xiaozhao
MAINTAINER xiaozhao
# 指定临时文件位 /temp
VOLUME /temp
# 将jar包添加到容器 更名为zp_docker
ADD docker_boot-0.0.1-SNAPSHOT.jar zp_docker.jar
# 运行 jar
RUN bash -c 'touch /zp_docker.jar'
ENTRYPOINT ["java","-jar","/zp_docker.jar"]
# 暴露6001端口
EXPOSE 6001

将编写好的Dockerfile文件放至SpringBoot工程同一目录下

在这里插入图片描述
执行命令构建镜像

在这里插入图片描述

在这里插入图片描述

Ⅲ、启动容器,测试服务

启动容器,使用Swagger进行测试

在这里插入图片描述

访问Swagger成功,搭建微服务完成。

在这里插入图片描述

Ⅳ、使用Compose编排容器

① 在Dockerfile同级目录下编写docker-compose.yml文件

# 版本
version: "3"

#服务容器实例
services:
# 服务名
  microService:
  	# 镜像名 + 版本号
    image: zp_docker:1.0
    # 容器名称
    container_name: my01
    # 端口配置
    ports:
      - "6001:6001"
    # 容器数据卷
    volumes:
      - /app/microService:/data
    # 网络(一下容器运行在同一个网段内)
    networks: 
      - xiaozhao_net 
     # 依赖的容器,服务的启动依赖
    depends_on: 
      - redis
      - mysql


  redis:
    image: redis:6.0.8
    ports:
      - "6379:6379"
    volumes:
      - /app/redis/redis.conf:/etc/redis/redis.conf
      - /app/redis/data:/data
    networks: 
      - xiaozhao_net 
    command: redis-server /etc/redis/redis.conf


  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: '123456'
      MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
      MYSQL_DATABASE: 'docker_boot'
    ports:
       - "3306:3306"
    volumes:
       - /app/mysql/db:/var/lib/mysql
       - /app/mysql/conf/my.cnf:/etc/my.cnf
       - /app/mysql/init:/docker-entrypoint-initdb.d
    networks:
      - xiaozhao_net 
    command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
networks: 
   xiaozhao_net : 

在这里插入图片描述

② 修改微服务中的配置,将mysql和redis的IP地址换为docker-compose.yml文件中的服务名。避免宕机重启IP变更引发问题。

server.port=6001
# ========================alibaba.druid相关配置=====================
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#spring.datasource.url=jdbc:mysql://47.109.24.39:3306/docker_boot?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.url=jdbc:mysql://mysql:3306/docker_boot?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.druid.test-while-idle=false
# ========================redis相关配置=====================
spring.redis.database=0
#spring.redis.host=47.109.24.39
spring.redis.host=redis
spring.redis.port=6379
spring.redis.password=
spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-wait=-1ms
spring.redis.lettuce.pool.max-idle=8
spring.redis.lettuce.pool.min-idle=0
# ========================mybatis相关配置===================
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.zhao.docker.entities
# ========================swagger=====================
spring.swagger2.enabled=true

③ 重新将微服务打包放至linux服务器中

在这里插入图片描述

④ 重新构建镜像

在这里插入图片描述
⑤ 执行命令,检查docker-compose.yml配置

docker-compose config -q

在这里插入图片描述

没有出现报错,配置正常。

⑥ 执行启动命令,一键启动所有容器

# 后台启动所有容器
docker-compose up -d

在这里插入图片描述
当在docker-compose.yml文件中不设置容器名称时,默认为:当前文件所处的目录名称_镜像名_容器数量

⑦ 查看容器启动情况,可以看到所有容器启动成功

在这里插入图片描述

⑧ 使用Swagger测试服务

测试添加用户功能

在这里插入图片描述
在这里插入图片描述

测试查询功能

在这里插入图片描述

测试成功,功能接口正常,Mysql,redis服务正常!!

五、总结

在以上的测试项目中,我们用到了redis、Mysql组件,再加上搭建的SpringBoot工程镜像,一共三个对应容器。当我们不使用Compose 去编排服务时,我们总会遇到如下的问题:

  1. 启动容器的先后顺序要求固定,必须先启动Mysql、Redis才能微服务访问成功。
  2. 每次启动都要执行多个run命令。
  3. 容器间的启停或宕机,有可能导致IP地址对应的容器实例变化,映射出错。

在有了Compose 后容器间的管理就非常丝滑了,本次分享的文章到这里就结束了,希望对大家有所帮助。兄弟们,快快用起来吧!

在这里插入图片描述

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

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

相关文章

跟着我学 AI丨AIGC,自媒体的核武器

自从 ChatGPT 火爆全网之后&#xff0c;AI 相关概念的热度就一直持续高涨不下&#xff0c;尤其是大众都在关注的 AI 的应用场景方向&#xff0c;更是疯狂。无论是 AI 圈内人还是以前对 AI 完全没有认知的人&#xff0c;都想借助 AI 挣上一笔。目前来说最受关注的 AI 应用场景&a…

阿里云数据库ClickHouse产品和技术解读

摘要&#xff1a;社区ClickHouse的单机引擎性能十分惊艳&#xff0c;但是部署运维ClickHouse集群&#xff0c;以及troubleshoot都不是很好上手。本次分享阿里云数据库ClickHouse产品能力和特性&#xff0c;包含同步MySQL库、ODPS库、本地盘及多盘性价比实例以及自建集群上云的迁…

kubernetes中Pod介绍

目录 kubernetes的作用 k8s核心资源pod Pod如何管理多个容器&#xff1f; Pod网络 k8s中容器的共享方式 Pod存储 已经学习了docker为什么还要学习Pod Pod与Docker之间的关系 Pod的优势 收集业务日志 pod工作方式 自主式&#xff08;不推荐&#xff09; yaml文件详解…

内存和闪存介绍

主要分为两类&#xff1a;内存和闪存&#xff0c;内存的数据掉电会丢失&#xff0c;闪存的数据掉电不会丢失。 内存&#xff1a;SRAM、RAM、SDRAM、DDR 闪存&#xff1a;ROM、FLASH、EMMC RAM&#xff1a;Random Access Memory 随机存储器&#xff0c;又分为&#xff1a;SRAM…

科士达为绿色世界 提供多维度低碳新动能

2023年5月11日&#xff0c;“数据中心绿色发展大会”围绕节能降碳绿色赋能主题&#xff0c;在成都如期召开。作为国内数据中心行业的翘楚&#xff0c;科士达应邀参加了大会,与会代表高级售前沈凤文带来了题为《为绿色世界 提供多维度低碳新动能》的精彩演讲。 在“双碳”目标引…

『手撕 Mybatis 源码』02 - 加载配置文件

加载配置文件 获取输入流 myBatis 的配置文档层次架构 首先从读入开始查看是怎么加载配置文件的&#xff0c;现在从这里打个断点 public class MybatisTest {Testpublic void test1() throws IOException {// 1. 通过类加载器对配置文件进行加载&#xff0c;加载成了字节输入…

MidJourney中国版开放内测;70款ChatGPT插件全评测;盘点181家海外AI创业公司;GPT+科研工作流 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 『左耳朵耗子 | 享受编程和技术带来的快乐』Coding Your Ambition CoolShell 是陈皓创建的技术共享平台&#xff0c;主题非常广泛&…

加密解密软件VMProtect教程(五):主窗口之主菜单

VMProtect 是保护应用程序代码免遭分析和破解的可靠工具&#xff0c;但只有在正确构建应用程序内保护机制并且没有可能破坏整个保护的典型错误的情况下才能最有效地使用。 接下来为大家介绍关于VMProtect中主菜单的功能介绍&#xff0c;包括文件、编辑、项目、工具和帮助。 &…

基于SSM+JSP的人体健康信息管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

PV270R1K1T1WMMC_PARKER轴向柱塞泵

PV270R1K1T1WMMC_PARKER轴向柱塞泵 柱塞泵分类 PARKER柱塞泵根据倾斜元件的不同&#xff0c;有斜盘式和斜轴式两种。斜盘式是斜盘相对回转的缸体有一倾斜角度&#xff0c;而引起柱塞在泵缸中往复运动。传动轴轴线和缸体轴线是一致的。这种结构较简单&#xff0c;转速较高&…

Git教程(二)

工作区和暂存区 工作区&#xff08;Working Directory&#xff09; learngit 文件夹就是一个工作区。 版本库&#xff08;Repository&#xff09; 工作区有个隐藏目录 .git &#xff0c;这个不算工作区&#xff0c;而是 Git 的版本库。 版本库里面的 index(stage) 文件叫暂…

掌握无人机遥感数据预处理的全链条理论与实践流程、典型农林植被性状的估算理论与实践方法、利用MATLAB进行编程实践(脚本与GUI开发)以及期刊论文插图制作

在新一轮互联网信息技术大发展的现今&#xff0c;无人机、大数据、人工智能、物联网等新兴技术在各行各业都处于大爆发的前夜。为了将人工智能方法引入农业生产领域。首先在种植、养护等生产作业环节&#xff0c;逐步摆脱人力依赖&#xff1b;在施肥灌溉环节构建智慧节能系统&a…

尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】

&#x1f618; 目录 00【前言】 01【大数据学习路线&#xff08;快速版&#xff09;】 02【视频地址&资料下载】 03【课程笔记】 001-Linux 002-Hadoop 003-Zookeeper 004【Scala】 005【Spark】 006【Nifi】 007【kafka】 008【flink】 00【前言】 都是公开的…

“深入探索SDL游戏开发“

前言 欢迎来到小K的SDL专栏第二小节&#xff0c;本节将为大家带来基本窗口构成、渲染器、基本图形绘制、贴图、事件处理等的详细讲解&#xff0c;看完后希望对你有收获 文章目录 前言一、简单窗口二、渲染器三、基本图形绘制1、点2、线3、矩形4、圆和椭圆 四、贴图五、事件处理…

Java经典笔试题—day09

Java经典笔试题—day09 &#x1f50e;选择题&#x1f50e;编程题&#x1f95d; 另类加法&#x1f95d;走方格的方案数 &#x1f50e;结尾 &#x1f50e;选择题 (1)下面程序的输出是 ( ) String x“fmn”; x.toUpperCase(); String yx.replace(‘f’,‘F’); yy“wxy”; Syste…

数据结构lab3-图型结构的建立与搜索

title: 数据结构lab3-图型结构的建立与搜索 date: 2023-05-16 11:42:26 tags: 数据结构与算法 课程名称&#xff1a;数据结构与算法 课程类型&#xff1a;必修 实验项目&#xff1a;图型结构的建立与搜索 实验题目&#xff1a;图的存储结构的建立与搜索 实验日期&#xff1…

基于html+css的图展示72

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

【K8s】openEuler23操作系统安装Docker和Kubernetes

openEuler23操作系统安装 服务器搭建环境随手记 文章目录 openEuler23操作系统安装前言&#xff1a;一、前期准备&#xff08;所有节点&#xff09;1.1所有节点&#xff0c;关闭防火墙规则&#xff0c;关闭selinux&#xff0c;关闭swap交换&#xff0c;打通所有服务器网络&am…

Java 工程师不同阶段的发展路线

Java作为一种广泛应用于企业级应用程序的编程语言&#xff0c;已成为全球最流行的编程语言之一。在Java领域&#xff0c;Java高级工程师是一个非常有前途的职业&#xff0c;随着互联网和移动应用的不断发展&#xff0c;Java高级工程师的需求量也在不断增加。在这篇文章中&#…

Node.js 学习系列(二) —— 创建一个应用

Node.js 应用由三部分组成&#xff1a; &#xff08;一&#xff09;require 指令&#xff1a; 在 Node.js 中&#xff0c;使用 require 指令来加载和引入模块&#xff0c;引入的模块可以是内置模块&#xff0c;也可以是第三方模块或自定义模块。 语法格式&#xff1a; cons…