在了解Docker-Compose
之前我们回忆一下之前章节所学,假设我们需要部署一个springboot项目,需要nginx
、mysql
、redis
,通常我们启动这些服务run的时候需要设置每个容器的启动参数,指定数据卷,容器命名,指定不同容器的链接参数等等一系列的操作,是不是很繁琐?那么docker-compose就是解决这个问题的。当我们的项目需要哪些镜像,每个镜像怎么配置,要挂载哪些 volume, 等等信息都包含在 docker-compose.yml 里,每次启动这三个容器就只需要docker-composer up
命令即可。
从过上面的描述,我们大致可以总结为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
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
博主目前安装使用的是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进行部署测试;
使用IDEA新建项目,项目名docker
选择所需依赖
修改POM文件,引入 druid-spring-boot-starter
最终POM文件如下:
<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.0modelVersion>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.7.12version>
<relativePath/>
parent>
<groupId>com.tohergroupId>
<artifactId>docker-test-projectartifactId>
<version>0.0.1-SNAPSHOTversion>
<name>docker-test-projectname>
<description>docker-test-projectdescription>
<properties>
<java.version>1.8java.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-redisartifactId>
dependency>
<dependency>
<groupId>org.mybatis.spring.bootgroupId>
<artifactId>mybatis-spring-boot-starterartifactId>
<version>2.3.1version>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druid-spring-boot-starterartifactId>
<version>1.2.16version>
dependency>
<dependency>
<groupId>com.mysqlgroupId>
<artifactId>mysql-connector-jartifactId>
<scope>runtimescope>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
exclude>
excludes>
configuration>
plugin>
plugins>
build>
<repositories>
<repository>
<id>publicid>
<name>aliyun nexusname>
<url>https://maven.aliyun.com/repository/publicurl>
<releases>
<enabled>trueenabled>
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完成。
主要构建两个文件:
一个作为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"]
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数据至此我们的部署测试成功!
/data/mysql/conf:/etc/mysql/conf.d
的不同docker compose up
前注意清理restart: always
配置项tab
键进行空格操作本章节主要介绍了Docker Compos使用、常用命令介绍,最后以一个SpringBoot整合Mybatis、Redis、Mysql,使用Docker Compos进行部署测试,如果大家需要博主的相关完整源码和配置文件,可以在评论区留下邮箱,博主会给大家邮件发送,最后如果本章节内容对你有用,希望点赞收藏加关注