写点什么

玩转 Docker—部署 Spring Boot+MySQL 工程实战

作者:Barry Yan
  • 2022 年 10 月 07 日
    北京
  • 本文字数:2700 字

    阅读完需:约 9 分钟

玩转Docker—部署Spring Boot+MySQL工程实战

1 搭建 Spring Boot+MySQL 项目

1.1 项目依赖

<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-web</artifactId></dependency><dependency>    <groupId>org.mybatis.spring.boot</groupId>    <artifactId>mybatis-spring-boot-starter</artifactId>    <version>2.2.1</version></dependency><dependency>    <groupId>com.alibaba</groupId>    <artifactId>druid</artifactId>    <version>1.2.6</version></dependency><dependency>    <groupId>mysql</groupId>    <artifactId>mysql-connector-java</artifactId>    <scope>runtime</scope></dependency><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-test</artifactId>    <scope>test</scope></dependency>
复制代码

1.2 配置文件

server.port=8081spring.datasource.username=rootspring.datasource.password=12345678spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/testspring.datasource.type=com.alibaba.druid.pool.DruidDataSource
复制代码

1.3 具体代码

HelloDao.java


@Mapper@Repositorypublic interface HelloDao {
@Select("SELECT * FROM student WHERE id=#{id}") Map<String, Object> findObjectById(@Param("id") Integer id);
}
复制代码


HelloController.java


@RestControllerpublic class HelloController {
@Autowired private HelloDao helloDao;
@GetMapping("/hello") public String hello() { return "Hello Docker!"; }
@GetMapping("/find/{id}") public String find(@PathVariable("id") Integer id){ return helloDao.findObjectById(id).toString(); }
}
复制代码

2 编写 Dockerfile

# 该镜像需要依赖的基础镜像FROM java:8 # 指定维护者的名字MAINTAINER YMX "1712229564@qq.com" # 将指定目录下的jar包复制到docker容器的/export/Apps/springboot-admin目录下COPY sp-docker-0.0.1-SNAPSHOT.jar /usr/local/sp_demo/sp-docker-0.0.1-SNAPSHOT.jar # 声明服务运行在8080端口EXPOSE 8081 # 指定docker容器启动时运行jar包ENTRYPOINT ["java", "-jar","/usr/local/sp_demo/sp-docker-0.0.1-SNAPSHOT.jar"]
复制代码

3 导出数据库

在 MySQL 安装目录的/bin 目录下执行以下命令:


 ./mysqldump -uroot -p12345678 test > ~/test.sql 
复制代码


数据库信息:


CREATE TABLE `student` (  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,  `name` varchar(255) DEFAULT NULL,  `age` int(2) DEFAULT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;
LOCK TABLES `student` WRITE;INSERT INTO `student` VALUES (1,'zs',32),(2,'ls',24),(3,'zsss',21);UNLOCK TABLES;
复制代码

4 复制 SQL 数据

在宿主机中执行以下命令:


docker cp test.sql mysql:/tmpdocker run -p 3307:3306 --name mysql -e MYSQL_ROOT_PASSWORD=12345678 -d mysqldocker psdocker exec -it mysql /bin/sh
复制代码


在已安装 MySQL 的 docker 容器中执行以下命令:


$ cd /tmp$ lstest.sql$ mysql -uroot -p12345678###进入MySQL###mysql> use testDatabase changedmysql> source /tmp/test.sqlQuery OK, 0 rows affected, 2 warnings (0.03 sec)mysql> select * from student;+----+------+------+| id | name | age  |+----+------+------+|  1 | zs   |   32 ||  2 | ls   |   24 ||  3 | zsss |   21 |+----+------+------+3 rows in set (0.00 sec)
复制代码

5 将 Spring Boot 容器和 MySQL 容器进行联通

使用 Docker 命令查看 IP 地址


root ~ % docker network lsNETWORK ID     NAME      DRIVER    SCOPE5b9134swqe954   bridge    bridge    localroot ~ % docker network inspect 5b9134swqe954                                          [    {        ......        "IPAM": {            "Driver": "default",            "Options": null,            "Config": [                {                    "Subnet": "172.17.0.0/16"                }            ]        },        ......,        "Containers": {            "d3938789hhuinj1499f680e": {                "Name": "mysql",                ......                "IPv4Address": "172.17.0.2/16",                "IPv6Address": ""            }        },        ......    }]
复制代码


经过查看我们发现,Docker 的网络默认是桥接网络,即每个容器都属于同一网段,图示:



(图片来自https://www.cnblogs.com/ygria/p/13217793.html


因此,我们把 Spring Boot 项目的配置文件修改下:


server.port=8081spring.datasource.username=rootspring.datasource.password=12345678spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://172.17.0.2:3306/testspring.datasource.type=com.alibaba.druid.pool.DruidDataSource
复制代码


如果条件允许可直接使用域名。


然后再重启 Spring Boot 则可以进行 MySQL 的访问和使用

扩展:Docker 网络

Docker 的网络子系统是可选的,使用驱动程序。默认情况下存在几个驱动程序,并提供核心网络功能:


  • bridge:默认网络驱动程序。如果您未指定驱动程序,则这是您正在创建的网络类型。当您的应用程序在需要通信的独立容器中运行时,通常会使用桥接网络。

  • host:对于独立容器,去掉容器与 Docker 主机之间的网络隔离,直接使用主机的网络。

  • overlay: Overlay 网络将多个 Docker 守护进程连接在一起,使 swarm 服务能够相互通信。您还可以使用覆盖网络来促进 swarm 服务和独立容器之间的通信,或者不同 Docker 守护程序上的两个独立容器之间的通信。这种策略消除了在这些容器之间进行操作系统级路由的需要。

  • ipvlan:IPvlan 网络使用户可以完全控制 IPv4 和 IPv6 寻址。VLAN 驱动程序建立在此之上,为对底层网络集成感兴趣的用户提供了对第 2 层 VLAN 标记甚至 IPvlan L3 路由的完全控制。

  • macvlan:Macvlan 网络允许您将 MAC 地址分配给容器,使其在您的网络上显示为物理设备。Docker 守护进程通过它们的 MAC 地址将流量路由到容器。macvlan 在处理期望直接连接到物理网络而不是通过 Docker 主机的网络堆栈路由的遗留应用程序时,使用驱动程序有时是最佳选择。

  • none:对于这个容器,禁用所有网络。通常与自定义网络驱动程序一起使用。none不适用于 swarm 服务。

发布于: 刚刚阅读数: 4
用户头像

Barry Yan

关注

做兴趣使然的Hero 2021.01.14 加入

Just do it.

评论

发布
暂无评论
玩转Docker—部署Spring Boot+MySQL工程实战_10月月更_Barry Yan_InfoQ写作社区