docker 部署spring boot with 数据库
spring boot 工程目录
└── src
├── main
│ ├── docker
│ │ └── docker-compose.yml
│ ├── java
│ └── resources
│ ├── application-dev.yml
│ ├── application-test.yml
│ ├── application.yml
│ ├── logback.xml
│ ├── static
│ └── templates
└── test
docker-compose.yml
配置文件
version: '3'
services:
mysql: # mysql 服务名称
image: mysql:8.0.22
container_name: mysql
restart: always
volumes:
- $PWD/data:/var/lib/mysql
ports:
- 3307:3306
environment:
MYSQL_ROOT_PASSWORD: "111111"
MYSQL_ROOT_HOST: '%'
TZ: Asia/Shanghai
command: --default-authentication-plugin=mysql_native_password
user: root
networks:
- micro
mvc-app:
build:
context: ../java
dockerfile: ./Dockerfile
environment:
TZ: Asia/Shanghai
ports:
- 8080:8080
volumes:
- $PWD/log:/app/app-logs
depends_on:
- mysql1 # mysql服务名称
networks:
- micro
# 指定桥接网络
networks:
micro:
driver: bridge
application-dev.yml
配置文件
spring:
datasource:
# jdbc:mysql://mysql服务名称:容器未映射的端口,这里是3306,而不是3307 !!
url: jdbc:mysql://mysql:3306/mysql?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 111111
测试类
@GetMapping("/ds/index")
public List<String> index() throws SQLException {
Connection connection = DriverManager.getConnection(dataSourceProperties.getUrl(),
dataSourceProperties.getUsername(),
dataSourceProperties.getPassword());
PreparedStatement preparedStatement = connection.prepareStatement("select * from user");
ResultSet resultSet = preparedStatement.executeQuery();
List<String> list = new ArrayList<>();
while (resultSet.next()){
String user = resultSet.getString("user");
list.add(user);
}
log.info("result: {}", JSON.toJSONString(list));
log.debug("result: {}", JSON.toJSONString(list));
log.warn("result: {}", JSON.toJSONString(list));
log.trace("result: {}", JSON.toJSONString(list));
return list;
}
docker部署工程
micro-boot
├── data
├── docker-compose.yml
├── Dockerfile
├── log
└── mvc.jar
Dockerfile
配置
首先将spring boot 工程进行打包
FROM openjdk:8-jdk-alpine
RUN mkdir /app
WORKDIR /app # 连接容器后进入的文件夹
COPY mvc.jar /app/app.jar
ENTRYPOINT ["java","-jar","/app/app.jar"] # 执行命令
启动docker
docker-compose up
Building mvc-app
Step 1/5 : FROM openjdk:8-jdk-alpine
---> a3562aa0b991
Step 2/5 : RUN mkdir /app
---> Running in 5d29e6a3c3b3
Removing intermediate container 5d29e6a3c3b3
---> 4d716ca14c36
Step 3/5 : WORKDIR /app
---> Running in 13668487ff05
Removing intermediate container 13668487ff05
---> f5af50788398
Step 4/5 : COPY mvc.jar /app/app.jar
---> 1a983d221cde
Step 5/5 : ENTRYPOINT ["java","-jar","/app/app.jar"]
---> Running in 864eb5d08faf
Removing intermediate container 864eb5d08faf
---> 4ea526aeb68f
Successfully built 4ea526aeb68f
Successfully tagged micro-boot_mvc-app:latest
WARNING: Image for service mvc-app was built because it did not already exist.
To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating mysql1 ... done
Creating mvc-app ... done
Attaching to mysql, mvc-app
...
mvc-app |
mvc-app | . ____ _ __ _ _
mvc-app | /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
mvc-app | ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
mvc-app | \\/ ___)| |_)| | | | | || (_| | ) ) ) )
mvc-app | ' |____| .__|_| |_|_| |_\__, | / / / /
mvc-app | =========|_|==============|___/=/_/_/_/
mvc-app | :: Spring Boot :: (v2.4.3)
mvc-app |
...
查看自定义网络
docker-compose启动时,以工程名_networkname拼接, 这里是micro-boot_micro
$ docker inspect micro-boot_micro
[
{
"Name": "micro-boot_micro",
"Id": "2f8013fc5bc1c6bff5fa206e25823c919f5f4fd3dcac11fff125a35fd6b361d9",
"Created": "2021-03-07T11:04:19.782251034+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.31.0.0/16",
"Gateway": "172.31.0.1"
}
]
},
"Internal": false,
"Attachable": true,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"af9269273c05639b8ec825b9bb56f4fa8e4ad35fa32b6399f751516107f16ec8": {
"Name": "mysql",
"EndpointID": "537ef35c442450a0d8dae1d640ac3f5f5e854c6b2a6cd1d208de5bcbf0046110",
"MacAddress": "02:42:ac:1f:00:02",
"IPv4Address": "172.31.0.2/16",
"IPv6Address": ""
},
"d71bd1a859e3da7b6bea1fdd6b4acc32f0b86697b3c50048ceeb10c9612cd4b9": {
"Name": "mvc-app",
"EndpointID": "0535389acfa11c87ae167139706f960689c695a6f20eb36abe09d79e153676e7",
"MacAddress": "02:42:ac:1f:00:03",
"IPv4Address": "172.31.0.3/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {
"com.docker.compose.network": "micro",
"com.docker.compose.project": "micro-boot",
"com.docker.compose.version": "1.27.4"
}
}
]
## 查看所有网络
NETWORK ID NAME DRIVER SCOPE
6d53aefd647d bridge bridge local
2f8013fc5bc1 micro-boot_micro bridge local
9e2a9b45c38c zookeeper_default bridge local
# docker network命令
$ docker network help
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
## 看docker服务是否启动
$ docker ps
CONTAINER ID IMAGE COMMAND PORTS NAMES
d71bd1a859e3 micro-boot_mvc-app "java -jar /app/app.…" 0.0.0.0:8080->8080/tcp mvc-app
af9269273c05 mysql:8.0.22 "docker-entrypoint.s…" 33060/tcp, 0.0.0.0:3307->3306/tcp mysql
进入mvc-app
容器,然后 ping
mysql 服务
$ docker exec -it mvc-app /bin/sh
/app # ls
app-logs app.jar
/app # ping mysql
PING mysql1 (172.31.0.2): 56 data bytes
64 bytes from 172.31.0.2: seq=0 ttl=64 time=0.134 ms
64 bytes from 172.31.0.2: seq=1 ttl=64 time=0.125 ms
64 bytes from 172.31.0.2: seq=2 ttl=64 time=0.125 ms
64 bytes from 172.31.0.2: seq=3 ttl=64 time=0.126 ms
64 bytes from 172.31.0.2: seq=4 ttl=64 time=0.114 ms
^C
--- mysql1 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 0.114/0.124/0.134 ms
可以看见容器之间通信是OK的
访问
访问 http://localhost:8080/ds/index
[
"root",
"mysql.infoschema",
"mysql.session",
"mysql.sys",
"root"
]