在Centos Stream 9上Docker的实操教程 - Docker Compose容器编排详解
- 前言
- 什么是Docker-Compose
- 下载安装和卸载
- 使用仓库安装
- 手动安装
- 卸载
- docker compose常用命令
- 项目实战
- 构建SpringBoot项目
- 编写Dockerfile文件
- 编写Docker-Compose.yml文件
- 运行测试
- 相关注意事项
- 结语
前言
在了解Docker-Compose
之前我们回忆一下之前章节所学,假设我们需要部署一个springboot项目,需要nginx
、mysql
、redis
,通常我们启动这些服务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:#redisredis:# 地址host: localhost# 端口,默认为6379port: 6379# 数据库索引database: 0# 密码password:# 连接超时时间timeout: 10slettuce:pool:# 连接池中的最小空闲连接min-idle: 0# 连接池中的最大空闲连接max-idle: 8# 连接池的最大数据库连接数max-active: 8# #连接池最大阻塞等待时间(使用负值表示没有限制)max-wait: -1ms#数据源配置datasource:type: com.alibaba.druid.pool.DruidDataSourcedriverClassName: com.mysql.cj.jdbc.Driverdruid:# 主库数据源url: jdbc:mysql://localhost:3306/docker_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8username: rootpassword: 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 {@Autowiredprivate RedisTemplate redisTemplate;@Resourceprivate 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-mysqlimage: mysqlbuild:context: .#指定执行的dockerfiledockerfile: init-dockerfile#映射端口ports:- "3306:3306"#挂载数据卷volumes:- /data/mysql/conf:/etc/mysql/conf.d- /data/mysql/data:/var/lib/mysql- /data/mysql/logs:/logscommand: ['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_testMYSQL_ROOT_PASSWORD: 123456micro-redis:#指定容器名称container_name: micro-redisimage: redisbuild:context: .#指定执行的dockerfiledockerfile: redis-dockerfile#映射端口ports:- "6379:6379"#挂载数据卷volumes:- /data/redis/redis.conf:/etc/redis/redis.conf- /data/redis/data:/datacommand: redis-server /etc/redis/redis.confmicro-server:container_name: micro-serverbuild:context: .dockerfile: boot-dockerfileports:- "9090:9090"depends_on:- micro-mysql- micro-redislinks:- 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进行部署测试,如果大家需要博主的相关完整源码和配置文件,可以在评论区留下邮箱,博主会给大家邮件发送,最后如果本章节内容对你有用,希望点赞收藏加关注