背景
最近在了解Docker的使用,发现docker在集群部署方面和运维方面有比较大的优势,通过统一的依赖关系,以镜像的方式,将已经打好包的镜像文件,部署到各个节点。 如果不用考虑集群的同学,就不用折腾这个,如果想要让应用,有较强的快速部署的能力可以考虑考虑。
目标
在本机创建两个docker容器,分别为mysql的容器和spring boot的容器。spring boot容器通过jpa方式访问mysql容器里面的数据库。
步骤
假设你已经在本地安装好了docker
安装mysql镜像
docker pull mysql/mysql-server:latest
检查镜像
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql/mysql-server latest a02eab9e2434 2 weeks ago 276MB
mysql容器
创建mysql容器
这里在创建mysql容器的同时,也创建了mysql的实例:
docker run --name mysql -p 3306:3306 -d mysql/mysql-server:latest
--name
:是设置容器名称;-p
:设置docker容器对外映射的端口,以及容器使用的端口;-d
:设置容器在后台运行的方式mysql/mysql-server:latest
:这是之前安装的mysql镜像
准备mysql
查看安装root密码
docker logs mysql 2>&1 | grep GENERATED
[Entrypoint] GENERATED ROOT PASSWORD: aKAzZiqmYqAx0fnedABOnOLrYdOg
登录mysql
docker exec -it mysql mysql -uroot -p
输入刚才看到的密码,即可登录docker里面的mysql数据库。
修改mysql的root密码
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';
更加简单的做法
docker run --name mysql -e MYSQL_ROOT_PASSWORD=password -p 3306:3306 -d mysql
创建数据库和用户
create database mydb;
创建用户,并分配权限:
create user 'myuser'@'%' identified by 'mypassword';
select * from mysql.user where User = 'myuser';
grant all privileges on mydb.* to 'myuser'@'%';
这里设置的用户是可以远程访问的,永许任何id都可以远程访问。 关于mysql8的用户创建,具体可以看一看,之前的文章:CentOS7安装mysql
到这里,我们的docker中的mysql基本上就准备好了。
springboot容器
Dockerfile
在spring boot项目根目录创建Dockerfile文件,这个文件就是使用docker根据该文件来构建docker脚本文件。
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE=build/libs/myapp-1.0-SNAPSHOT.jar
COPY ${JAR_FILE} myapp.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/myapp.jar"]
FROM openjdk:8-jdk-alpine
:表示spring boot工程在docker使用的jdk;VOLUME /tmp
:需要挂载一个/tmp目录;ARG JAR_FILE=build/libs/myapp-1.0-SNAPSHOT.jar
:本地spring boot工程构建的目录位置,这里是Gradle的构建位置,Maven可能有不同;COPY ${JAR_FILE} myapp.jar
:运行copy命令,将Gradle或Maven构建好的jar文件,复制到docker的位置;ENTRYPOINT
:这是docker容器启动的命令。
application.properties
spring.datasource.url=jdbc:mysql://mysql:3306/zyldb?useSSL=true&useUnicode=true&characterEncoding=utf8
**注意:**这里必须使用docker容器名称,而不能使用ip地址。
构建jar和docker镜像
以配置好后,使用Gradle进行jar构建:
./gradlew clean && ./gradlew build
Maven:
./mvnw clean && ./mvnw package
这样就得到了可以部署的jar包,这样完成后,就开始构建docker镜像:
docker build -t myapp .
这个docker build
命令会主动去使用Dockerfile文件进行docker镜像构建并发布的到docker中。检查镜像是否构建成功:
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
myapp latest 21b5b76385f2 14 minutes ago 157MB
运行docker中的Spring boot
docker run --link mysql -p 8080:8081 myapp
--link
:当前创建的容器连接mysql容器-p 8080:8081
:当前创建容器的springboot端口为8081映射到docker外面机器的8080端口myapp
:使用的镜像
或者,这样运行:
docker run --name myapp_springboot --link mysql -p 8080:8081 -d myapp
到这里,关于使用docker来部署spring boot的问题基本上就解决了。
参考
- Docker: Spring Boot and Spring Data JPA (MySQL) REST Api example with docker (without docker-compose)
- MySQL Docker Containers: Understanding the basics
- Basic Steps for MySQL Server Deployment with Docker
- Spring Boot with Docker
- Get Started, Part 2: Containers
- Dockerizing your Spring Boot applications