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=8081 spring.datasource.username=root spring.datasource.password=12345678 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.type=com.alibaba.druid.pool.DruidDataSource 复制代码
1.3 具体代码
HelloDao.java
@Mapper @Repository public interface HelloDao { @Select("SELECT * FROM student WHERE id=#{id}") Map<String, Object> findObjectById(@Param("id") Integer id); } 复制代码
HelloController.java
@RestController public 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:/tmp docker run -p 3307:3306 --name mysql -e MYSQL_ROOT_PASSWORD=12345678 -d mysql docker ps docker exec -it mysql /bin/sh 复制代码
在已安装MySQL 的docker容器中执行以下命令:
$ cd /tmp $ ls test.sql $ mysql -uroot -p12345678 ###进入MySQL### mysql> use test Database changed mysql> source /tmp/test.sql Query 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 ls NETWORK ID NAME DRIVER SCOPE 5b9134swqe954 bridge bridge local root ~ % 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=8081 spring.datasource.username=root spring.datasource.password=12345678 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://172.17.0.2:3306/test spring.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 服务。