SpringBoot 整合 Docker 和 MongoDB 笔记

本贴最后更新于 1503 天前,其中的信息可能已经事过景迁

前言

一开始我只是想学一下 Docker,在了解了 Docker 的基础知识后,发现 Docker 安装软件很方便,于是就通过 Docker 安装了 MongoDB,顺带着把 MongoDB 也学习了,最后想着,既然 DockerMongoDB 都学习了,为什么不顺带着将 MongoDBSpringBoot 整合一下,再通过 Docker 部署呢?于是乎就有了这篇笔记,记录一下学习的过程。

Docker 学习

Docker 的学习主要参考 Docker 官网菜鸟教程-Docker 教程

Docker 的安装以及 一些基础的知识,包括 镜像容器 等概念,看一下 Docker 官网就可以 。需要熟练使用 镜像容器 的操作指令,包括拉取(删除、打包. 镜像,运行(停止、删除)容器等。这些指令和 gitLinux 的指令很像的,很容易掌握。总结如下:

镜像操作指令

Docker 官网提供的 hello-world 镜像为例

1. 查找镜像

指令: docker search hello-world

imagesearch.png

2. 拉取镜像

指令: docker pull hello-world

imagepull.png

3. 列出所有镜像

指令: docker image ls 或者 docker images

imagelist.png

4. 删除镜像

指令: docker rmi hello-world

容器操作指令

容器的操作,就结合安装 MongoDB 来一起学习,Docker 安装软件就是将该软件对应的 Docker 镜像拉取下来,然后运行成为一个容器的过程。常用的开发软件都有对应的 Docker 镜像的,我们可以在 DockerHub 这个网站去找我们需要的软件镜像。比如我们搜索 mongodb,如下图所示:

mongodbiamge.png

第一个就是我们要找的镜像,我们点进去,右侧就是我们拉取镜像的指令。

mongofbdownload.png

1. 拉取 MongoDB 镜像

指令: docker pull mongo

2. 运行容器

指令: docker run -itd --name mongo -p 27017:27017 mongo --auth

参数说明:

  • -i : 交互式操作
  • -t : 终端
  • -d : 后台运行
  • --name : mongo 指定容器的名字
  • -p : 指定端口号
  • --auth : 指的是 MongoDB 数据库运行后,需要密码才能访问容器服务

其实使用 Docker 安装 MongoDB 这两步就完成了。

3. 查看容器信息

指令: docker ps -a

这个指令会列出容器 ID、镜像、创建时间、状态、端口号、名称等信息,比较重要的就是 CONTAINER ID(容器 ID)NAMES(容器名称) 这两个,我们可以通过它们来管理镜像

dockerpsa.png

4. 停止容器

指令:docker stop [容器ID] 或者 [容器名称]

5. 启动容器

指令: docker start [容器ID] 或者 [容器名称]

6. 重启容器

指令: docker start [容器ID] 或者 [容器名称]

7. 删除容器

指令: docker rm -f [容器ID] 或者 [容器名称]

MongoDB 学习

在前面我们已经通过 Dokcer 安装了 MongoDB,现在我们通过 docker exec -it mongo mongo 指令进入 MongoDB 容器

mogo1.png

初次进入,我们需要创建一个超级用户,执行下面的两个命令:

# 1. 切换到admin数据库

 use admin

# 2. 创建超级用户admin

db.createUser({
	user: 'admin',
	pwd: '123456',
	roles: [{
		role: 'userAdminAnyDatabase',
		db: 'admin'
	}, "readWriteAnyDatabase"]
});

然后我们切换到 test 数据库,创建一个 test 用户,我们所有的学习都基于这个 test 数据库来进行,与上面类似,执行下面两个指令:

# 1. 切换到test,说明一下,use指令切换数据库时,如果数据库不存在,会自动创建的

use test

# 2. 创建一个对test数据库具有读写权限的用户test

db.createUser({
	user: "test",
	pwd: passwordPrompt(), // or cleartext password
	roles: [{
		role: "readWrite",
		db: "test"
	}]
})
执行完这条语句后,会提示我们输入该用户的密码,输入完成,用户就创建成功了。

关于 MongoDB 其他知识,参考 MongoDB 官网

创建 SpringBoot 项目,整合 MongoDBDocker

我们通过 SpringBoot 项目来整合 MongoDBDocker,然后通过 Swagger 来测试

1. MongoDBSwagger 依赖配置
<!--   mongodb     -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <!--   web     -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--   lombok     -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!-- swagger -->
        <dependency>
            <groupId>com.spring4all</groupId>
            <artifactId>swagger-spring-boot-starter</artifactId>
            <version>1.7.0.RELEASE</version>
        </dependency>
        <!--   启动类加上@EnableSwagger2Doc注解后,如果不加validation这个依赖,启动会失败,目前原因不明     -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
2. Docker 插件配置
<properties>
        <java.version>1.8</java.version>
	<!-- dcoker 插件版本 -->
        <docker.maven.plugin.version>1.2.2</docker.maven.plugin.version>
        <docker.image.prefix>springboot</docker.image.prefix>
    </properties>
<!--     docker 配置       -->
        <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>docker-maven-plugin</artifactId>
            <version>${docker.maven.plugin.version}</version>
            <configuration>
                <imageName>${docker.image.prefix}/${project.artifactId}</imageName>
		<!--  指定Dockfile文件所在位置  -->
                <dockerDirectory>src/main/docker</dockerDirectory>
                <resources>
                    <resource>
                        <targetPath>/</targetPath>
                        <directory>${project.build.directory}</directory>
                        <include>${project.build.finalName}.jar</include>
                    </resource>
                </resources>
            </configuration>
        </plugin>
3. MongoDB 连接配置
spring:
  data:
    mongodb:
      database: test
      host: 127.0.0.1
      port: 27017
      username: test
      password: test
4. 代码

实体类

@Data
public class Book {
    private Integer id;
    private String name;
    private String author;
    private String description;
}

操作 MongoDB 数据库主要通过注入 MongoTemplate 来实现

@Service
public class BookService {

    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     *  保存
     *
     * @param book
     */
    public void save(Book book) {
        mongoTemplate.save(book);
    }


    /**
     *  根据ID查询
     *
     * @param id
     * @return
     */
    public Book findById(Integer id) {
       return mongoTemplate.findOne(Query.query(Criteria.where("id").is(id)), Book.class);
    }

    /**
     *  根据名字查询
     *
     * @param name
     * @return
     */
    public Book findByName(String name) {
       return mongoTemplate.findOne(Query.query(Criteria.where("name").is(name)), Book.class);
    }

    /**
     *  查询所有
     *
     * @return
     */
    public List<Book> findAll() {
        return mongoTemplate.findAll(Book.class);
    }

    /**
     *  更新
     *
     * @param book
     */
    public void update(Book book) {
        Query query = Query.query(Criteria.where("id").is(book.getId()));
        Update update = Update.update("name", book.getName()).set("author", book.getAuthor())
                .set("description", book.getDescription());
        mongoTemplate.updateFirst(query, update, Book.class);
    }


    /**
     *  删除
     *
     * @param id
     */
    public void delete(Integer id) {
        mongoTemplate.remove(Query.query(Criteria.where("id").is(id)), Book.class);
    }


}

控制层

@RestController
@RequestMapping("/book")
@Api(value = "书籍管理", tags = "book")
public class BookController {

    @Autowired
    private BookService bookService;

    @PostMapping("/save")
    @ApiOperation(value = "保存")
    public void save(@RequestBody Book book) {
        this.bookService.save(book);
    }

    @GetMapping("/getById/{id}")
    @ApiOperation(value = "根据ID查询")
    public Book getById(@PathVariable Integer id) {
        return bookService.findById(id);
    }

    @GetMapping("/getByName/{name}")
    @ApiOperation(value = "根据名称查询")
    public Book getByName(@PathVariable String name) {
        return bookService.findByName(name);
    }


    @GetMapping("/getAll")
    @ApiOperation(value = "查询所有")
    public List<Book> getAll() {
        return bookService.findAll();
    }


    @PutMapping("/update")
    @ApiOperation(value = "更新")
    public void update(@RequestBody Book book) {
        bookService.update(book);
    }

    @DeleteMapping("/delete{id}")
    @ApiOperation(value = "删除")
    public void delete(@PathVariable Integer id) {
        bookService.delete(id);
    }
}
5. 编写 Dockfile 文件

打包之前需要先编写一个 Dcokerfile 文件,这个文件我放在 /src/main/docker/目录下Dockerfile 的具体配置,可以看看这个 Docker Dockerfile

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD springboot-mongodb-docker-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
6. 将项目打包为 Docker 镜像

进入项目所在目录,执行 mvn package docker:build 命令,如果没有报错,就说明打包成功,此时执行 docker images 指令查看镜像,第一个就是我们打包的镜像

spingbootdockerimage.png

7. 启动镜像

指令:docker run -d --net=host -p 8080:8080 --name springboot-mongodb-docker springboot/springboot-mongodb-docker:latest

参数说明:

  • -d : 后台运行
  • --net=host: 使用 host 模式启动容器,此时容器和宿主机共用一个 Network Namespace,这样我们的容器才可以访问其他运行着的软件,比如 MongoDB
  • -p : 指定端口号
  • --name: 指定我们容器的名字

如果我们想查看项目的日志,可以通过指令 docker logs springboot-mongodb-docker > logs.txt 来将日志写到 logs.txt 文件中

8. 通过 Swagger 测试

在浏览器输入 http://localhost:8080/swagger-ui.html#/

测试保存接口

booksave2.png

测试查询接口

bookfind.png

进入数据库查看

mogofind.png

至此,我们就成功了 😄

总结

通过 Docker 安装软件,是非常便利的,只需要学会 docker pull docker run 两个指令就可以了。同时,dockerSpringBoot 的整合,使我们部署维护项目也变得很简单。

完整代码 springboot-mongodb-docker

  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    491 引用 • 917 回帖
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    944 引用 • 1459 回帖 • 17 关注
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    90 引用 • 59 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...