本工程是关于SpringBoot与mysql集成,通过docker环境模拟分布式部署的入门级demo工程
镜像地址:https://hub.docker.com/_/mysql?tab=tags
• 获取最新版本镜像
guodong@mars ~ % docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
852e50cd189d: Pull complete
29969ddb0ffb: Pull complete
a43f41a44c48: Pull complete
5cdd802543a3: Pull complete
b79b040de953: Pull complete
938c64119969: Pull complete
7689ec51a0d9: Pull complete
a880ba7c411f: Pull complete
984f656ec6ca: Pull complete
9f497bce458a: Pull complete
b9940f97694b: Pull complete
2f069358dc96: Pull complete
Digest: sha256:4bb2e81a40e9d0d59bd8e3dc2ba5e1f2197696f6de39a91e90798dd27299b093
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
guodong@mars ~ % docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest dd7265748b5d 8 days ago 545MB
alpine/git latest 76a4083eacef 8 days ago 28.4MB
• 启动mysql容器
-i:以交互模式运行,通常配合-t -t:为容器重新分配一个伪输入终端,通常配合-i -d:后台运行容器 -p:端口映射,格式为主机端口:容器端口 -e:设置环境变量,这里设置的是root密码 --name:设置容器别名
guodong@mars ~ % docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root -d mysql
2b444ea8ceac0076d276f565b8c98a91bb741652957aef277c7d0a83699fb287
Last login: Sun Nov 29 13:34:17 on ttys000
• 连接到mysql容器并创建数据库
【很关键】链接到mysql容器伪终端后,通过mysql -r root -p访问mysql服务端,默认密码root
【很关键】创建数据库example;
guodong@mars ~ % docker exec -it 2b444ea8ceac0076d276f565b8c98a91bb741652957aef277c7d0a83699fb287 /bin/sh; exit
# ls
bin docker-entrypoint-initdb.d home media proc sbin tmp
boot entrypoint.sh lib mnt root srv usr
dev etc lib64 opt run sys var
# mysql -r root -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.22 MySQL Community Server - GPL
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> create database example;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| example |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
本地部署SpringBoot应用 和 Docker环境部署SpringBoot应用 是相互独立的,本地环境只能部署一台webapp,Docker环境部署可以将mysql和多台webapp同时部署在docker环境中,用于模拟分布式环境;
- mvn命令打包springboot应用
guodong@mars springboot-mysql-docker % mvn package
- 本地启动springboot应用
2020-12-13 12:08:35.408 INFO 15242 --- [ main] c.a.springboot.SpringBootWebApplication : No active profile set, falling back to default profiles: default
本地启动没有指定profile,默认加载application.properties文件,使用localhost作为mysql服务器host
guodong@mars springboot-mysql-docker % java -jar target/springboot-mysql-docker-1.0.0.jar
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.4.0)
2020-12-13 12:38:38.379 INFO 15532 --- [ main] c.a.springboot.SpringBootWebApplication : Starting SpringBootWebApplication v1.0.0 using Java 1.8.0_201 on mars.local with PID 15532 (/Users/guodong/Documents/gitworkspace/springboot-parent/springboot-mysql-docker/target/springboot-mysql-docker-1.0.0.jar started by guodong in /Users/guodong/Documents/gitworkspace/springboot-parent/springboot-mysql-docker)
2020-12-13 12:38:38.382 INFO 15532 --- [ main] c.a.springboot.SpringBootWebApplication : No active profile set, falling back to default profiles: default
2020-12-13 12:38:42.573 INFO 15532 --- [ main] DeferredRepositoryInitializationListener : Spring Data repositories initialized!
2020-12-13 12:38:42.582 INFO 15532 --- [ main] c.a.springboot.SpringBootWebApplication : Started SpringBootWebApplication in 4.623 seconds (JVM running for 5.073)
- 访问web应用
guodong@mars springboot-mysql-docker % curl localhost:8082/home
Stay hungry, stay foolish
guodong@mars springboot-mysql-docker % curl localhost:8082/users/all
[{"id":1,"name":"andyguo.gd","email":"andieguo@foxmail.com"},{"id":2,"name":"jack","email":"jack@foxmail.com"},{"id":3,"name":"jack","email":"jack"},{"id":4,"name":"jack1","email":"jack"}]
- 关闭web应用
关闭本地web应用,释放8082端口
通过Docker环境部署多个spring boot webapp应用,模拟分布式环境
- mvn命令打包springboot应用
guodong@mars springboot-mysql-docker % mvn package
- VOLUME ["/data"] 创建一个可以从本地主机或其他容器挂载的挂载点;
- ADD <src> <dest> 该命令将复制指定的<src>到容器中的<dest>
- ENTRYPOINT 配置容器启动后执行的命令,每个Dockerfile中只能有一个ENTRYPOINT
- java -jar -Dspring.profiles.active=docker /springboot-mysql-docker-1.0.0.jar
- java命令指定SpringBoot的profile环境为docker,启动时加载application-docker.properties
- EXPOSE 告诉Docker服务端容器暴露的端口号
FROM java:8
VOLUME /tmp
ADD springboot-mysql-docker-1.0.0.jar springboot-mysql-docker-1.0.0.jar
ENTRYPOINT ["java","-jar","-Dspring.profiles.active=docker","/springboot-mysql-docker-1.0.0.jar"]
EXPOSE 8082
- 创建镜像
docker build -t springboot-mysql-docker src/docker/ 命令:
- 通过-t 指定镜像的标签信息,希望生成镜像标签为springboot-mysql-docker
- 指定Dockerfile所在路径为src/docker/
guodong@mars springboot-mysql-docker % cd springboot-mysql-docker
guodong@mars springboot-mysql-docker % cp target/springboot-mysql-docker-1.0.0.jar src/docker/
guodong@mars springboot-mysql-docker % docker build -t springboot-mysql-docker src/docker/
Sending build context to Docker daemon 38.64MB
Step 1/5 : FROM java:8
---> d23bdf5b1b1b
Step 2/5 : VOLUME /tmp
---> Using cache
---> 269067bcaa38
Step 3/5 : ADD springboot-mysql-docker-1.0.0.jar springboot-mysql-docker-1.0.0.jar
---> 94d018d1f594
Step 4/5 : ENTRYPOINT ["java","-jar","-Dspring.profiles.active=docker","/springboot-mysql-docker-1.0.0.jar"]
---> Running in 1bfb2378f567
Removing intermediate container 1bfb2378f567
---> 3f1229e85cc9
Step 5/5 : EXPOSE 8082
---> Running in 6ee8f5590be5
Removing intermediate container 6ee8f5590be5
---> b0e277cfb0bd
Successfully built b0e277cfb0bd
Successfully tagged springboot-mysql-docker:latest
guodong@mars springboot-mysql-docker % docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
springboot-mysql-docker latest b0e277cfb0bd 26 seconds ago 682MB
- 运行容器
分别启动3个webapp容器,端口号分别为8082、8083、8084
link 是在两个contain之间建立一种父子关系,父container中的web,可以得到子container db上的信息。 通过link的方式创建容器,我们可以使用被Link容器的别名进行访问,而不是通过IP,解除了对IP的依赖。 不过,link的方式只能解决单机容器间的互联,多机的情况下,需要通过别的方式进行连接。 --link=container_name or id:name 使用这个选项在你运行一个容器时,可以在此容器的/etc/hosts文件中增加一个额外的name主机名,这个名字为container_name的容器的IP地址的别名。这使得新容器的内部进程可以访问主机名为name的容器而不用知道它的Ip。 内网是走docker0的网桥,互相之间是Ping的通的,但是docker run 建立容器的时候,它的Ip地址是不可控制的,所以docker 用link的方式使web能够访问到db中的数据。
guodong@mars springboot-mysql-docker % docker run -p 8082:8082 --name springboot-mysql-docker-8082 --link mysql:db -d springboot-mysql-docker
guodong@mars springboot-mysql-docker % docker run -p 8083:8082 --name springboot-mysql-docker-8083 --link mysql:db -d springboot-mysql-docker
guodong@mars springboot-mysql-docker % docker run -p 8084:8082 --name springboot-mysql-docker-8084 --link mysql:db -d springboot-mysql-docker
guodong@mars springboot-mysql-docker % docker ps
- 访问web应用
guodong@mars springboot-mysql-docker % curl localhost:8082/users/all
[{"id":1,"name":"andieguo","email":"andieguo@foxmail.com"}]
guodong@mars springboot-mysql-docker % curl localhost:8083/users/all
[{"id":1,"name":"andieguo","email":"andieguo@foxmail.com"}]
guodong@mars springboot-mysql-docker % curl localhost:8084/users/all
[{"id":1,"name":"andieguo","email":"andieguo@foxmail.com"}]
1.SpringBoot与web集成
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2.SpringBoot与Mysql集成
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>