本文實(shí)現實(shí)現一個(gè)簡(jiǎn)單的springboot+mysql應用(基于用戶(hù)訪(fǎng)問(wèn)情況進(jìn)行ip計數,并存儲到mysql數據庫),為該應用構建docker鏡像,實(shí)現docker容器部署,以及與mysql容器的對接
Docker 安裝
直接安裝 docker desktop for windows即可,其中還會(huì )包含了docker compose??赏ㄟ^(guò) docker-compose version來(lái)驗證結果,一般會(huì )輸出如下信息:
docker-compose version 1.25.4, build 8d51620adocker-py version: 4.1.0CPython version: 3.7.4OpenSSL version: OpenSSL 1.1.1c 28 May 2019
docker image相關(guān)命令:
docker images查看本地所有鏡像
docker rmi XXX刪除制定名稱(chēng)的鏡像
docker container 容器相關(guān)命令:
docker ps -a 顯示全部容器
docker ps顯示當前運行中容器
docker start mysql 再次啟動(dòng)之前名稱(chēng)為mysql的容器
docker stop mysql停止msyql容器
編寫(xiě)Visitor應用
對于多模塊應用,可以手工在創(chuàng )建model時(shí),制定將路徑放置到非工程根目錄下,例如創(chuàng )建名稱(chēng)為test的module時(shí),手工修改路徑為D:\dev2\project\backends\docker\test則此時(shí)會(huì )增加一個(gè)目錄層級docker,以便于在同目錄增加nginx、mysql等目錄進(jìn)行統一管理,實(shí)現docker化改造
當前父工程為backends,則模塊創(chuàng )建完成后,其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來(lái)實(shí)現自動(dòng)創(chuàng )建ddl語(yǔ)句,實(shí)現的功能是根據訪(fǎng)問(wèn)值ip進(jìn)行訪(fǎng)問(wèn)次數計數:
@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 { // 對訪(fǎng)問(wèn)次數+1 語(yǔ)言 方法
3041
抖音創(chuàng )業(yè)網(wǎng)5Qu7r
抖音怎么玩「視頻教程」一步步詳解抖音4713 2008-07-18 21:08:44
visitor.setTimes(visitor.getTimes() + 1); } repository.save(visitor); return "ip " + ip + "access times:" + visitor.getTimes(); }}
最終,通過(guò)curl http://localhost:8080/api/v/ 或者瀏覽器方式訪(fǎng)問(wèn)后,就會(huì )得到類(lèi)似如下的結果:ip 0:0:0:0:0:0:0:1access times:7
同時(shí),也可以通過(guò)TestRestTemplate來(lái)實(shí)現驗證
@SpringBootTest(webEnvironment = WebEnvironment.DEFINED_PORT)@Slf4jpublic 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); }} 創(chuàng )建docker profile
因為部署到docker環(huán)境后,數據庫鏈接模式有變化,需要增加一個(gè)application-docker.properties文件,具體內容如下:
# docker模式是,數據庫地址需要替換為docker容器來(lái)實(shí)現引用,此處的mysql-test是通過(guò)docker run的 --link 來(lái)指定spring.datasource.url=jdbc:mysql://mysql-test:3306/testspring.datasource.username=rootspring.datasource.password=goodpine 本地打包及運行
現在嘗試本地打包模式,通過(guò)在pom.xml文件路徑(如D:\dev2\project\backends\dockercomp\app>)中,執行mvn clean package -Dmaven.test.skip即可完成打包,打包后的可執行jar會(huì )放到 target目錄下,例如app\target\dockercomp-1.0-SNAPSHOT.jar
直接在命令行執行java -jar dockercomp-1.0-SNAPSHOT.jar即可啟動(dòng)該服務(wù)。
創(chuàng )建Dockerfile文件
在pom.xml文件同目錄下,增加名稱(chēng)為Dockerfile文件:
FROM openjdk:8-jdk-alpineARG JAR_FILE=target/*.jarCOPY ${JAR_FILE} app.jarEXPOSE 8080#注意需要增加-Dspring.profiles.active=docker,來(lái)制定docker部署模式下的配置信息ENTRYPOINT ["java","-Dspring.profiles.active=docker","-jar","/app.jar"]
上述文件意思是將target下的所有jar,拷貝到app.jar中,并且制定運行時(shí)profile為docker對應的配置。
Docker 部署
啟動(dòng)mysql docker服務(wù)
docker run --name mysql-test -e MYSQL_ROOT_PASSWORD=goodpine -e MYSQL_DATABASE=test -p 3306:3306 -d mysql
啟動(dòng)完成后,可通過(guò) docker ps 查看容器運行情況
visitor-docker鏡像構建
在spring工程根目錄下,執行docker build . -t visitor-docker,其中-t xxx 是指為鏡像打上標簽,該命令一般得到如下結果:
E:\dev\2try\backends\dockercomp\app>docker build . -t visitor-dockerSending build context to Docker daemon 39.79MBStep 1/5 : FROM openjdk:8-jdk-alpine ---> a3562aa0b991Step 2/5 : ARG JAR_FILE=target/*.jar ---> Using cache ---> 25bff168a2b2Step 3/5 : COPY ${JAR_FILE} app.jar ---> bac68174227cStep 4/5 : EXPOSE 8080 ---> Running in 904bc1180df7Removing intermediate container 904bc1180df7 ---> 1f234b6dbf72Step 5/5 : ENTRYPOINT ["java","-Dspring.profiles.active=docker","-jar","/app.jar"] ---> Running in 0a2a351a3225Removing intermediate container 0a2a351a3225 ---> 2ee38fd2463aSuccessfully built 2ee38fd2463aSuccessfully tagged visitor-docker:latest
鏡像構建完成后,即可通過(guò)docker images 來(lái)查看當前本機所有鏡像了:
PS C:\Users\123> docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEvisitor-docker latest 156aa35a495c 46 seconds ago 145MBmysql latest 30f937e841c8 4 weeks ago 541MBredis latest f9b990972689 7 weeks ago 104MBmongo latest 3f3daf863757 8 weeks ago 388MBnginx latest 602e111c06b6 8 weeks ago 127MBhello-world latest bf756fb1ae65 5 months ago 13.3kBopenjdk 8-jdk-alpine a3562aa0b991 13 months ago 105MBsath89/oracle-12c latest ee3351d51185 22 months ago 5.7GB 運行docker應用
最后,通過(guò)下面命令運行應用即可:
docker run --link mysql-test:mysql-test --name visitorapp -p 8080:8080 visitor-docker
特別說(shuō)明:**特別注意增加上該link,否則無(wú)法連接到指定數據庫。**link X:Y 中,X指的是為運行中的鏡像名稱(chēng),此處為上面啟動(dòng)的mysql數據庫服務(wù)的別名;Y為配置文件中引用的數據庫鏡像別名
到此,一個(gè)基于mysql的springboot應用docker部署已經(jīng)完成,試驗過(guò)程中,碰到了很多坑,例如–link等,希望對你有幫助。
參考資料
多模塊maven工程,上傳到github以后,再次下載需要先通過(guò)mvn idea:module運行一遍,然后通過(guò) maven 窗口,刷新下全部module,即可實(shí)現在idea中識別各個(gè)module
刪除鏡像,可先通過(guò)docker rm XXX刪除對應的容器,再通過(guò)docker rmi visitor-docker刪除對應的鏡像。