前言
一开始我只是想学一下 Docker
,在了解了 Docker
的基础知识后,发现 Docker
安装软件很方便,于是就通过 Docker
安装了 MongoDB
,顺带着把 MongoDB
也学习了,最后想着,既然 Docker
和 MongoDB
都学习了,为什么不顺带着将 MongoDB
和 SpringBoot
整合一下,再通过 Docker
部署呢?于是乎就有了这篇笔记,记录一下学习的过程。
Docker 学习
Docker
的学习主要参考 Docker 官网 和 菜鸟教程-Docker 教程
Docker
的安装以及 一些基础的知识,包括 镜像 和 容器 等概念,看一下 Docker 官网就可以 。需要熟练使用 镜像 和 容器 的操作指令,包括拉取(删除、打包. 镜像,运行(停止、删除)容器等。这些指令和 git
和 Linux
的指令很像的,很容易掌握。总结如下:
镜像操作指令
以 Docker
官网提供的 hello-world
镜像为例
1. 查找镜像
指令: docker search hello-world
2. 拉取镜像
指令: docker pull hello-world
3. 列出所有镜像
指令: docker image ls
或者 docker images
4. 删除镜像
指令: docker rmi hello-world
容器操作指令
容器的操作,就结合安装 MongoDB
来一起学习,Docker
安装软件就是将该软件对应的 Docker
镜像拉取下来,然后运行成为一个容器的过程。常用的开发软件都有对应的 Docker
镜像的,我们可以在 DockerHub 这个网站去找我们需要的软件镜像。比如我们搜索 mongodb
,如下图所示:
第一个就是我们要找的镜像,我们点进去,右侧就是我们拉取镜像的指令。
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(容器名称) 这两个,我们可以通过它们来管理镜像
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
容器
初次进入,我们需要创建一个超级用户,执行下面的两个命令:
# 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 项目,整合 MongoDB
和 Docker
我们通过 SpringBoot
项目来整合 MongoDB
和 Docker
,然后通过 Swagger
来测试
1. MongoDB
和 Swagger
依赖配置
<!-- 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
指令查看镜像,第一个就是我们打包的镜像
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#/
测试保存接口
测试查询接口
进入数据库查看
至此,我们就成功了 😄
总结
通过 Docker
安装软件,是非常便利的,只需要学会 docker pull
和 docker run
两个指令就可以了。同时,docker
和 SpringBoot
的整合,使我们部署维护项目也变得很简单。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于