在Centos Stream 9上Docker的实操教程(六) - Docker Compose容器编排详解

news2024/9/20 16:54:31

在Centos Stream 9上Docker的实操教程 - Docker Compose容器编排详解

  • 前言
  • 什么是Docker-Compose
  • 下载安装和卸载
      • 使用仓库安装
      • 手动安装
      • 卸载
  • docker compose常用命令
  • 项目实战
    • 构建SpringBoot项目
    • 编写Dockerfile文件
    • 编写Docker-Compose.yml文件
  • 运行测试
  • 相关注意事项
  • 结语

前言

在了解Docker-Compose之前我们回忆一下之前章节所学,假设我们需要部署一个springboot项目,需要nginxmysqlredis,通常我们启动这些服务run的时候需要设置每个容器的启动参数,指定数据卷,容器命名,指定不同容器的链接参数等等一系列的操作,是不是很繁琐?那么docker-compose就是解决这个问题的。当我们的项目需要哪些镜像,每个镜像怎么配置,要挂载哪些 volume, 等等信息都包含在 docker-compose.yml 里,每次启动这三个容器就只需要docker-composer up命令即可。

什么是Docker-Compose

从过上面的描述,我们大致可以总结为Docker-Compose就是用于定义和运行多容器 Docker 应用程序的工具,负责实现对Docker容器集群的快速编排,解决了容器与容器之间如何管理编排的问题

下载安装和卸载

根据官方文档https://docs.docker.com/compose/install/linux/#install-using-the-repository的安装讲解,可以分为两种安装模式:

使用仓库安装

安装Compose
如果你还没安装过Compose ,博主推荐这种安装方式,后续的升级更方便

yum update
yum install docker-compose-plugin
#验证安装成功
docker compose version

在这里插入图片描述
更新Compose,只需要重新执行安装命令即可

#更新Compose
yum update
yum install docker-compose-plugin

手动安装

安装包会下载到 $HOME/.docker/cli-plugins目录下面的 docker-compose 文件夹内

DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
mkdir -p $DOCKER_CONFIG/cli-plugins
curl -SL https://github.com/docker/compose/releases/download/v2.18.1/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose

对二进制文件应用可执行权限:

chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose

如果选择为所有用户安装Compose则执行:
sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose

最后验证安装

docker compose version
Docker Compose version v2.18.1

卸载

注意以下代码块包含了仓库安装的卸载方式,以及手动安装的卸载方式,请注意区分

# 使用仓库安装的卸载方式
sudo yum remove docker-compose-plugin

# 手动安装的卸载方式
rm $DOCKER_CONFIG/cli-plugins/docker-compose

#如果是执行了为所有用户安装的卸载方式
rm /usr/local/lib/docker/cli-plugins/docker-compose

docker compose常用命令

博主目前安装使用的是v2版本,语法为 docker compose ,v1的版本语法为 docker-compose ,大家注意各自版本区分

使用语法

docker compose [OPTIONS] COMMAND

命令列表

指令说明
docker compose build构建或重建服务
docker compose up启动yml定义的所有服务
docker compose stop停止项目中的所有服务容器
docker compose start启动项目中的所有服务容器
docker compose restart重启项目中的所有服务容器
docker compose down停止并删除容器、网络
docker compose exec在运行的容器中执行命令
docker compose ps列出当前项目下的所有容器
docker compose ls列出正在运行的项目
docker compose images列出所有已创建的服务容器的镜像信息
docker compose kill强制停止服务容器
docker compose logs查看当前项目下所有服务容器的日志输出
docker compose pause暂停当前项目下一个或多个服务容器
docker compose unpause恢复当前项目下处于暂停状态的服务
docker compose port打印某个服务容器的内部端口所映射的公共端口
docker compose pull拉取当前项目下所有服务依赖的镜像
docker compose push对于使用build元素构建的服务,我们可以用此命令将其镜像推送到 Docker 镜像仓库
docker compose rm删除停止的服务容器
docker compose run为某个服务创建并启动一个全新的容器
docker compose top显示正在运行的进程
docker compose version查看Docker Compose 版本信息
docker compose --help查看帮助信息

更多命令说明,请参考官方文档 https://docs.docker.com/compose/reference/

项目实战

首先我们本次需要快速构建一个SpringBoot项目,并集成Mybatis、Redis、Mysql ,然后构建一个docker-compose.yml进行部署测试;

构建SpringBoot项目

使用IDEA新建项目,项目名docker
在这里插入图片描述
选择所需依赖
在这里插入图片描述
修改POM文件,引入 druid-spring-boot-starter 最终POM文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.12</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.toher</groupId>
    <artifactId>docker-test-project</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>docker-test-project</name>
    <description>docker-test-project</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- redis -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!-- mybatis -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.3.1</version>
        </dependency>
        <!-- 阿里数据库连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.16</version>
        </dependency>
        <!-- mysql -->
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>public</id>
            <name>aliyun nexus</name>
            <url>https://maven.aliyun.com/repository/public</url>
            <releases>
                <enabled>true</enabled>
            </releases>
        </repository>
    </repositories>
</project>

修改application.yml文件,配置端口号、数据源、redis

# 端口配置
server:
    port: 9090

# 数据源配置
spring:
    #redis
    redis:
        # 地址
        host: localhost
        # 端口,默认为6379
        port: 6379
        # 数据库索引
        database: 0
        # 密码
        password:
        # 连接超时时间
        timeout: 10s
        lettuce:
            pool:
                # 连接池中的最小空闲连接
                min-idle: 0
                # 连接池中的最大空闲连接
                max-idle: 8
                # 连接池的最大数据库连接数
                max-active: 8
                # #连接池最大阻塞等待时间(使用负值表示没有限制)
                max-wait: -1ms
    #数据源配置
    datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.cj.jdbc.Driver
        druid:
            # 主库数据源
            url: jdbc:mysql://localhost:3306/docker_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
            username: root
            password: 123456

# MyBatis
mybatis:
    # 搜索指定包别名
    typeAliasesPackage: com.toher.**.domain
    # 配置mapper的扫描,找到所有的mapper.xml映射文件
    mapperLocations: classpath*:mapper/**/*Mapper.xml

Mysql 新建docker_test 数据库,导入如下SQL执行,创建数据库student表

DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '学生ID',
  `name` varchar(50) NOT NULL COMMENT '学生姓名',
  `gender` varchar(10) NOT NULL COMMENT '学生性别',
  `birthday` date NOT NULL COMMENT '学生生日',
  `address` varchar(100) NOT NULL COMMENT '学生住址',
  `phone` varchar(20) NOT NULL COMMENT '学生联系方式',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='学生信息表';

INSERT INTO `student` (`id`, `name`, `gender`, `birthday`, `address`, `phone`) VALUES (1, '小明', '男', '2023-06-16', '广州', '13724889158');
INSERT INTO `student` (`id`, `name`, `gender`, `birthday`, `address`, `phone`) VALUES (2, '小羊', '女', '2023-06-16', '广州', '13800126000');

项目仅仅为了演示,我们就以最简单的方式构建,创建 DockerTestController Student StudentMapper 在这里插入图片描述
DockerTestController 文件内容

@RestController
public class DockerTestController {

    @Autowired
    private RedisTemplate redisTemplate;
    @Resource
    private StudentMapper studentMapper;

    @GetMapping("/get-student")
    public Student getStudent(){

        Boolean has = redisTemplate.hasKey("student");
        if(has){
            Student student = (Student)redisTemplate.opsForValue().get("student");
            return student;
        }
        Student student = studentMapper.getById(1);
        redisTemplate.opsForValue().set("student",student,5, TimeUnit.MINUTES);
        return student;
    }
}

Student 文件内容

@Data
public class Student implements Serializable {
    private Integer id;
    private String name;
    private String gender;
    private Date birthday;
    private String address;
    private String phone;
}

StudentMapper 文件内容

@Mapper
public interface StudentMapper {
    @Select("select * from student where id = #{id}")
    public Student getById(@Param("id") int id);

    @Insert("insert into student(id, name)values(#{id}, #{name})")
    public int insert(Student user);
}

完成以上步骤,我们运行项目访问 http://localhost:9090/get-student 出现查询出的JSON数据,则SpringBoot 整合Mybatis + Redis + Mysql完成。
在这里插入图片描述

编写Dockerfile文件

主要构建两个文件:
一个作为Mysql数据库初始化文件(init-dockerfile)
一个作为Redis配置文件(redis-dockerfile)
一个作为运行SpringBoot项目文件(boot-dockerfile)

init-dockerfile 文件内容

# 基础镜像
FROM mysql
#指定作者
LABEL org.opencontainers.image.authors="micro"
# 执行sql脚本 db目录届时存放存放初始化sql文件
ADD ./db/*.sql /docker-entrypoint-initdb.d/

redis-dockerfile 文件内容

# 基础镜像
FROM redis
#定义环境变量
ENV MYPATH /data/redis
#设置工作目录
WORKDIR $MYPATH
#指定作者
LABEL org.opencontainers.image.authors="micro"
# 挂载目录
VOLUME /data/redis
# 创建目录
RUN mkdir -p /data/redis
# 复制conf文件到路径
COPY /data/redis/redis.conf /data/redis/redis.conf

boot-dockerfile 文件内容

# 基础镜像
FROM java:8
#定义环境变量
ENV MYPATH /data/docker-compose-boot
#设置工作目录
WORKDIR $MYPATH
#指定作者
LABEL org.opencontainers.image.authors="micro"
# 挂载目录
VOLUME /data/docker-compose-boot
# 创建目录
RUN mkdir -p /data/docker-compose-boot
# 复制jar文件到路径 jar文件夹存放我们maven打包好的jar文件
COPY ./jar/*.jar /data/docker-compose-boot/docker-compose-boot.jar
# 启动应用
ENTRYPOINT ["java","-jar","docker-compose-boot.jar"]

编写Docker-Compose.yml文件

version : '3'
services:
  #设置服务
  micro-mysql:
    #指定容器名称
    container_name: micro-mysql
    image: mysql
    build:
      context: .
      #指定执行的dockerfile
      dockerfile: init-dockerfile
    #映射端口
    ports:
      - "3306:3306"
    #挂载数据卷
    volumes:
      - /data/mysql/conf:/etc/mysql/conf.d
      - /data/mysql/data:/var/lib/mysql
      - /data/mysql/logs:/logs
    command: [
          'mysqld',
          '--innodb-buffer-pool-size=80M',
          '--character-set-server=utf8mb4',
          '--collation-server=utf8mb4_unicode_ci',
          '--default-time-zone=+8:00',
          '--lower-case-table-names=1'
        ]
    environment:
      MYSQL_DATABASE: docker_test
      MYSQL_ROOT_PASSWORD: 123456
  micro-redis:
    #指定容器名称
    container_name: micro-redis
    image: redis
    build:
      context: .
      #指定执行的dockerfile
      dockerfile: redis-dockerfile
    #映射端口
    ports:
      - "6379:6379"
    #挂载数据卷
    volumes:
      - /data/redis/redis.conf:/etc/redis/redis.conf
      - /data/redis/data:/data
    command: redis-server /etc/redis/redis.conf
  micro-server:
    container_name: micro-server
    build:
      context: .
      dockerfile: boot-dockerfile
    ports:
      - "9090:9090"
    depends_on:
      - micro-mysql
      - micro-redis
    links:
      - micro-mysql
      - micro-redis

运行测试

Docker-Compose.yml 中指定了 links , springboot项目打包前注意修改ip地址,redis为micro-redis, mysql为micro-mysql,如下图
在这里插入图片描述
使用maven打包生产jar文件,最终整体部署前准备目录如下:
在这里插入图片描述
将相关文件上传至宿主机,切换至该docker-compose.yml 同级目录运行 docker compose up -d ,访问测试,看到输出的json数据至此我们的部署测试成功!
在这里插入图片描述

相关注意事项

  • 注意mysql的版本,我使用的是最新的mysql8版本,如果较低版本注意挂载数据卷 /data/mysql/conf:/etc/mysql/conf.d 的不同
  • 如果之前有存在过的旧挂载卷配置,在运行 docker compose up 前注意清理
  • 目前属于部署测试,如果大家需要容器随宿主机一起开机启动,再每个server 加上 restart: always 配置项
  • 最后注意Docker-Compose.yml 空格问题切记不要 tab键进行空格操作

结语

本章节主要介绍了Docker Compos使用、常用命令介绍,最后以一个SpringBoot整合Mybatis、Redis、Mysql,使用Docker Compos进行部署测试,如果大家需要博主的相关完整源码和配置文件,可以在评论区留下邮箱,博主会给大家邮件发送,最后如果本章节内容对你有用,希望点赞收藏加关注
在这里插入图片描述

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

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

相关文章

使用Pyinstall将PyQT5工程打包成.exe应用程序(包含图标一同打包)

1.首先安装pyinstaller。 pip install pyinstaller 2.PyQT5制作程序中使用到的ico等一系列图标文件&#xff0c;要先经过.qrc文件转成.py文件后&#xff0c;才可跟随打包文件一同打包。 首先创建一个.qrc文件&#xff0c;将图片文件全部写进去&#xff0c;例如: <RCC>&…

selenium 调用本地浏览器插件

本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!selenium 使用本地浏览器插件 环境 win10Python3.9selenium 4.10查看chrome配置文件路径 地址栏输入 ​​…

Python 请求分页

文章目录 什么是 Python 中的分页带有下一个按钮的 Python 分页没有下一个按钮的 Python 分页无限滚动的 Python 分页带有加载更多按钮的分页 在本文中&#xff0c;我们将了解分页以及如何克服 Python 中与分页相关的问题。 读完本文后&#xff0c;我们将能够了解 Python 分页以…

TensorHouse仓库介绍

目录 1 TensorHouse介绍 2 说明性例子 3模型列表 4基本组件 5方法 6参考 7后续计划 1 TensorHouse介绍 代码仓库&#xff1a;GitHub - ikatsov/tensor-house: A collection of reference machine learning and optimization models for enterprise operations: marketi…

插入排序-C语言实现

&#x1f970;前言 &#x1f354;在学数据结构的第一节课就知道了数据结构课程是要管理并且学会操作数据&#xff0c;当然操作数据首先想到的就是数据的排序&#xff0c;排过顺序的数据的使用价值才够大。前面我们学习了顺序表也学习了链表等等&#xff0c;这些就是储存数据的方…

哲学家就餐问题

哲学家就餐问题是一个著名的一类同步问题&#xff0c;在并发编程领域&#xff0c;常用来解释线程同步的问题。 问题描述&#xff1a;五位哲学家围坐在一张圆桌旁&#xff0c;每个哲学家面前有一碗米饭和一只筷子。这五个哲学家都是苦于无法同时持有两只筷子&#xff0c;因为只…

Autosar软件组件-Application Layer介绍和SWC(Software Component)类型

参考前文Autosar-软件架构,可知整个架构从上到下分层依次为:应用层(Application Software Layer),运行时环境(Runtime Environment,RTE),基础软件层(Basic Software Layer,BSW),微控制器(Microcontroller)。 Application Layer由各种AUTOSAR Software Componen…

【备战秋招】每日一题:华东师范大学保研机试-2022-整数排序

为了更好的阅读体检&#xff0c;可以查看我的算法学习博客华东师范大学保研机试-2022-整数排序 题目内容 输入若干个int类型整数&#xff0c;将整数按照位数由大到小排序&#xff0c;如果位数相同&#xff0c;则按照整数本身从小到大排序。 例如, 输入:10 -3 1 23 89 100 9…

【第四次】21级计科计算机组成原理课外练习

【第四次】21级计科计算机组成原理课外练习 一、判断题二、单选题三、多选题四、填空题五、程序填空题 一、判断题 1-1 设机器数字长8位&#xff08;含1位符号位&#xff09;&#xff0c;若机器数BAH为原码&#xff0c;算术右移一位得到的结果为 9D H 。 T F 1-2 ALU中采用双…

spring 反射,BigDecimal,自定义注解的使用(aop)

反射 利用反射调用它类中的属性和方法时&#xff0c;无视修饰符。 获取Class类的对象&#xff08;三种方式&#xff09; Class.forName(“全类名”) &#xff08;推荐使用&#xff09;类名.class对象.getClass() 反射获取构造方法Constructor<?>[] getConstructors()…

Android 逆向之脱壳实战篇

作者&#xff1a;37手游安卓团队 前言 这篇文章比较干&#xff0c;比较偏实战&#xff0c;看之前建议先喝足水&#xff0c;慎入。 在学脱壳之前&#xff0c;我们先来复习一下&#xff0c;什么时候是加固&#xff1f; 加固本质上就是对 dex 文件进行加壳处理&#xff0c;让一些…

信号三大阶段之储存信号

目录 一、 信号三大阶段 二、信号储存相关概念 三、 理解概念 四、信号储存原理 五、信号集操作函数 一、 信号三大阶段 二、信号储存相关概念 实际执行信号的过程被称为信号递达&#xff08;Delivery&#xff09;。信号从产生到递达之间的状态被称为信号未决&#xff08;…

【Linux】初步认识Linux系统

Linux 操作系统 主要作用是管理好硬件设备&#xff0c;并为用户和应用程序提供一个简单的接口&#xff0c;以便于使用。 作为中间人&#xff0c;连接硬件和软件 常见操作系统 桌面操作系统 WindowsmacOsLinux 服务器操作系统 LinuxWindows Server 嵌入式操作系统 Linux …

从零搭建一台基于ROS的自动驾驶车-----1.整体介绍

系列文章目录 北科天绘 16线3维激光雷达开发教程 基于Rplidar二维雷达使用Hector_SLAM算法在ROS中建图 Nvidia Jetson Nano学习笔记–串口通信 Nvidia Jetson Nano学习笔记–使用C语言实现GPIO 输入输出 Autolabor ROS机器人教程 文章目录 系列文章目录前言一、小车底盘二、激…

Redis入门(三)

第5章 Redis的相关配置(redis.conf) 1&#xff09;计量单位说明,大小写不敏感 # 1k > 1000 bytes # 1kb > 1024 bytes # 1m > 1000000 bytes # 1mb > 1024*1024 bytes # 1g > 1000000000 bytes # 1gb > 1024*1024*1024 bytes # # units are case insensiti…

如何安装Apache服务

目录 什么是Apache 第一步 关闭防火墙和安全机制 第二步 系​统​上​定​义 SELinux 最​高​级​别 第三步 导入对应的依赖包并解包 第四步 安装依赖环境 第五步 移动相关文件 第六步 编译安装 第七步 编译 第八步 备份配置文件 第九步 优化执行路径 第十步 添加…

S32K324芯片学习笔记-实时控制系统-eMIOS

文章目录 Enhanced Modular IO Subsystem (eMIOS)eMISO配置通道类型通道配置BCTU Interface 简介功能框图Unified channels (UC)Buffered modesUC control and datapath diagramUC modesGPIO模式SAIC (Single Action Input Capture)模式Single Action Output Capture (SAOC) mo…

AI自动写代码:GitHub copilot插件在Idea的安装和使用教程

GitHub Copilot 是微软与OpenAI共同推出的一款AI编程工具&#xff0c;基于GitHub及其他网站的源代码&#xff0c;根据上文提示为程序员自动编写下文代码&#xff0c;可以极大地提高编写代码的效率。 先看看ChatGpt是怎么回答Copilot的功能特点&#xff1a; 给大家简单提取一…

【go】新手go module 踩坑入门rc_server

go1.3 后废弃了GOPATH 但是gomodule 要自己设置 :go env -w GO111MODULE=auto Microsoft Windows [版本 10.0.22621.1848] © Microsoft Corporation。保留所有权利。 C:\Users\zhangbin>adb connect 127.0.0.1:7555 connected to 127.0.0.1:7555 C:\Users\zhangbin&…

【计算机通识】未来的计算机

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01; 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、缘起 2、未来的计算机 2.1、光子计算机 2.2、生物计算机 2.3、量子计算机 3、总结 1、缘起 自然界中的一切事物都是处…