SpringBoot及Mysql应用Docker打包部署

本文实现实现一个简单的springboot+mysql应用(基于用户访问情况进行ip计数,并存储到mysql数据库),为该应用构建docker镜像,实现docker容器部署,以及与mysql容器的对接

Docker 安装

直接安装 docker desktop for windows即可,其中还会包含了docker compose。可通过 docker-compose version来验证结果,一般会输出如下信息:

docker-compose version 1.25.4, build 8d51620a
docker-py version: 4.1.0
CPython version: 3.7.4
OpenSSL version: OpenSSL 1.1.1c  28 May 2019

docker image相关命令:

  • docker images查看本地所有镜像
  • docker rmi XXX删除制定名称的镜像

docker container 容器相关命令:

  • docker ps -a 显示全部容器
  • docker ps显示当前运行中容器
  • docker start mysql 再次启动之前名称为mysql的容器
  • docker stop mysql停止msyql容器

编写Visitor应用

对于多模块应用,可以手工在创建model时,制定将路径放置到非工程根目录下,例如创建名称为test的module时,手工修改路径为D:\dev2\project\backends\docker\test则此时会增加一个目录层级docker,以便于在同目录增加nginx、mysql等目录进行统一管理,实现docker化改造

当前父工程为backends,则模块创建完成后,其pom.xml文件示例如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>backends</artifactId>
        <groupId>pers.techlmm</groupId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../../pom.xml</relativePath>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>dockercomp</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

该程序基于jpa来实现自动创建ddl语句,实现的功能是根据访问值ip进行访问次数计数:

@RestController
@RequestMapping("/api/v")
public class VisitorController {

    @Autowired
    private VisitorRepository repository;

    @RequestMapping("/")
    public String index(HttpServletRequest request) {
        String ip = request.getRemoteAddr();
        Visitor visitor = repository.findByIp(ip);
        if (visitor == null) {
            visitor = Visitor.builder().ip(ip).times(1L).build();
        } else {
            // 对访问次数+1
            visitor.setTimes(visitor.getTimes() + 1);
        }
        repository.save(visitor);
        return "ip " + ip + "access times:" + visitor.getTimes();
    }
}

最终,通过curl http://localhost:8080/api/v/ 或者浏览器方式访问后,就会得到类似如下的结果:ip 0:0:0:0:0:0:0:1access times:7

同时,也可以通过TestRestTemplate来实现验证

@SpringBootTest(webEnvironment = WebEnvironment.DEFINED_PORT)
@Slf4j
public class VisitorControllerTest {

    @Autowired
    TestRestTemplate restTemplate;

    // 构建请求路径
    URI uri = UriComponentsBuilder.fromUriString("/api/v/").build().toUri();

    @Test
    void indexTest() {
        String response = restTemplate.getForObject(uri, String.class);
        log.info(response);
    }
}

创建docker profile

因为部署到docker环境后,数据库链接模式有变化,需要增加一个application-docker.properties文件,具体内容如下:

# docker模式是,数据库地址需要替换为docker容器来实现引用,此处的mysql-test是通过docker run的 --link 来指定
spring.datasource.url=jdbc:mysql://mysql-test:3306/test
spring.datasource.username=root
spring.datasource.password=goodpine

本地打包及运行

现在尝试本地打包模式,通过在pom.xml文件路径(如D:\dev2\project\backends\dockercomp\app>)中,执行mvn clean package -Dmaven.test.skip即可完成打包,打包后的可执行jar会放到 target目录下,例如app\target\dockercomp-1.0-SNAPSHOT.jar

直接在命令行执行java -jar dockercomp-1.0-SNAPSHOT.jar即可启动该服务。

创建Dockerfile文件

在pom.xml文件同目录下,增加名称为Dockerfile文件:

FROM openjdk:8-jdk-alpine
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
EXPOSE 8080
#注意需要增加-Dspring.profiles.active=docker,来制定docker部署模式下的配置信息
ENTRYPOINT ["java","-Dspring.profiles.active=docker","-jar","/app.jar"]

上述文件意思是将target下的所有jar,拷贝到app.jar中,并且制定运行时profile为docker对应的配置。

Docker 部署

启动mysql docker服务

docker run --name mysql-test -e MYSQL_ROOT_PASSWORD=goodpine -e MYSQL_DATABASE=test  -p 3306:3306 -d mysql 

启动完成后,可通过 docker ps 查看容器运行情况

visitor-docker镜像构建

在spring工程根目录下,执行docker build . -t visitor-docker,其中-t xxx 是指为镜像打上标签,该命令一般得到如下结果:

E:\dev\2try\backends\dockercomp\app>docker build .  -t visitor-docker
Sending build context to Docker daemon  39.79MB
Step 1/5 : FROM openjdk:8-jdk-alpine
 ---> a3562aa0b991
Step 2/5 : ARG JAR_FILE=target/*.jar
 ---> Using cache
 ---> 25bff168a2b2
Step 3/5 : COPY ${JAR_FILE} app.jar
 ---> bac68174227c
Step 4/5 : EXPOSE 8080
 ---> Running in 904bc1180df7
Removing intermediate container 904bc1180df7
 ---> 1f234b6dbf72
Step 5/5 : ENTRYPOINT ["java","-Dspring.profiles.active=docker","-jar","/app.jar"]
 ---> Running in 0a2a351a3225
Removing intermediate container 0a2a351a3225
 ---> 2ee38fd2463a
Successfully built 2ee38fd2463a
Successfully tagged visitor-docker:latest

镜像构建完成后,即可通过docker images 来查看当前本机所有镜像了:

PS C:\Users\123> docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
visitor-docker      latest              156aa35a495c        46 seconds ago      145MB
mysql               latest              30f937e841c8        4 weeks ago         541MB
redis               latest              f9b990972689        7 weeks ago         104MB
mongo               latest              3f3daf863757        8 weeks ago         388MB
nginx               latest              602e111c06b6        8 weeks ago         127MB
hello-world         latest              bf756fb1ae65        5 months ago        13.3kB
openjdk             8-jdk-alpine        a3562aa0b991        13 months ago       105MB
sath89/oracle-12c   latest              ee3351d51185        22 months ago       5.7GB

运行docker应用

最后,通过下面命令运行应用即可:

docker run --link mysql-test:mysql-test --name visitorapp -p 8080:8080 visitor-docker

特别说明:**特别注意增加上该link,否则无法连接到指定数据库。**link X:Y 中,X指的是为运行中的镜像名称,此处为上面启动的mysql数据库服务的别名;Y为配置文件中引用的数据库镜像别名

到此,一个基于mysql的springboot应用docker部署已经完成,试验过程中,碰到了很多坑,例如–link等,希望对你有帮助。

参考资料

  • 多模块maven工程,上传到github以后,再次下载需要先通过mvn idea:module运行一遍,然后通过 maven 窗口,刷新下全部module,即可实现在idea中识别各个module
  • 删除镜像,可先通过docker rm XXX删除对应的容器,再通过docker rmi visitor-docker删除对应的镜像。
  • http://www.ityouknow.com/springboot/2018/03/28/dockercompose-springboot-mysql-nginx.html
  • https://docs.docker.com/compose/install/
  • https://spring.io/guides/gs/spring-boot-docker/
要使用docker部署springboot+MySQL项目,可以按照以下步骤进行操作: 1. 编写Dockerfile文件,指定基础镜像、安装JDK和MySQL依赖,将项目打包成jar包并复制到镜像中。 ```dockerfile FROM openjdk:11-jdk-slim VOLUME /tmp ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} app.jar RUN mkdir -p /var/lib/mysql RUN apt-get update && apt-get install -y mysql-server RUN echo "bind-address = 0.0.0.0" >> /etc/mysql/mysql.conf.d/mysqld.cnf RUN service mysql start && \ mysql -uroot -e "CREATE DATABASE db_name" && \ mysql -uroot -e "CREATE USER 'username'@'%' IDENTIFIED BY 'password'" && \ mysql -uroot -e "GRANT ALL PRIVILEGES ON db_name.* TO 'username'@'%';" EXPOSE 8080 ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] ``` 2. 构建镜像 在Dockerfile的目录下执行以下命令: ```shell docker build -t springboot-mysql . ``` 这里将镜像命名为springboot-mysql。 3. 运行容器 执行以下命令运行容器: ```shell docker run -d -p 8080:8080 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=db_name -e MYSQL_USER=username -e MYSQL_PASSWORD=password springboot-mysql ``` 这里将容器的8080端口映射到主机的8080端口,3306端口映射到主机的3306端口,并指定MySQL的root密码、数据库名、用户名和密码。 4. 访问应用 在浏览器中访问http://localhost:8080,即可访问应用。 注意:如果使用docker-compose进行部署,可以在docker-compose.yml文件中指定MySQL的配置,更加方便和灵活。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值