最近需要打包項目給成員們進行測試,但打包運行后很影響開發,于是打算使用docker
模擬生產環境運行打包后的項目,這樣就能既開發,又能給成員進行測試了。
由于原項目過大,打算先拿軟件工程的大實驗試試水,軟件工程大實驗使用的是spring-boot,redis,mysql,angular,nginx
這些環境,先試了試后臺的spring-boot,redis,mysql
的docker
搭建。
docker-compose
compose
項目是docker官方的開源項目,負責實現對docker容器集群的快速編排。compose
定位是定義和運行多個docker容器的應用。
我們都知道,使用一個dockerfile
模版文件就可以創建一個應用容器,但通常在一個項目中,需要多個應用容器,就像我的后臺,同時需要jdk8
、redis
、mysql
這些應用。docker-compose
剛好滿足了這樣的需求。它允許用戶通過一個單獨的docker-compose.yml
模版文件來定義一組相關聯的應用容器為一個項目。
服務(service):一個應用的容器,實際可以包括若干運行相同鏡像的容器實例。
compose
中兩個重要的概念:
項目(project):由一組關聯的應用容器組成的一個完整的業務單元,在docker-compose.yml
文件中定義。
服務就是我們需要的docker
容器,項目就是由許多服務構成的,了解了docker-compose
之后就可以進行環境搭建了。
搭建spring-boot
為了編譯spring-boot
,基于以下流程:
- 基于jdk8鏡像
- 將spring-boot下的mvnw、pom.xml復制到容器中,導入maven依賴
- 將src目錄下的源碼復制到容器中,使用maven打包spring-boot項目
- 使用jre8環境運行項目
構建的dockerfile
文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
#### 建立spring-boot項目 from openjdk:8-jdk-alpine as build # 設置項目在docker容器中工作目錄 workdir /app # 將 maven 可執行程序復制到容器中 copy mvnw . copy .mvn .mvn # 復制pom.xml文件 copy pom.xml . # 導入所有maven依賴 run . /mvnw dependency:go-offline -b # 復制項目源代碼 copy src src # 打包應用程序 run . /mvnw package -dskiptests run mkdir -p target /dependency && ( cd target /dependency ; jar -xf ../*.jar) #### 設置能運行應用程序的最小docker容器 from openjdk:8-jre-alpine arg dependency= /app/target/dependency # copy project dependencies from the build stage copy --from=build ${dependency} /boot-inf/lib /app/lib copy --from=build ${dependency} /meta-inf /app/meta-inf copy --from=build ${dependency} /boot-inf/classes /app entrypoint [ "java" , "-cp" , "app:app/lib/*" , "com.xiang.airticket.airticketapplication" ] |
docker-compose 集成項目服務
完成了spring-boot的容器構建后,就可以使用docker-compose
集成spring-boot、redis、mysql
容器了。具體思路:
- 聲明項目
- 聲明項目需要集成的服務
docker-compose.yml
文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
version: '3.7' # 定義服務 services: # spring-boot服務 app-server: build: context: . # 配置需要構建dockerfile的路徑 相對于docker-compose.yml dockerfile: dockerfile ports: - "8080:8080" # 將本機8080端口映射到容器8080端口 restart: always depends_on: - db # 需要依賴的服務 率先構建 - redis environment: # 設置環境變量 spring_datasource_url: jdbc:mysql: //db :3306 /airticket ?usessl= false &servertimezone=utc&uselegacydatetimecode= false spring_datasource_username: root spring_datasource_password: 123456 spring_redis.host: redis networks: # 網絡 連接mysql和redis - backend db: image: mysql:5.6 ports: - "3306:3306" restart: always environment: mysql_database: airticket mysql_user: htx mysql_password: 123456 mysql_root_password: 123456 volumes: - db-data: /var/lib/mysql networks: - backend redis: image: redis command : [ "redis-server" , "--protected-mode" , "no" ] hostname : redis ports: - "6379:6379" networks: - backend volumes: db-data: networks: backend: |
使用docker-compose build
構建項目容器:
使用docker-compose up
啟動容器:
當成功看到spring-boot啟動成功的日志,就成功配置好了。
后續
這次只構建了后臺,希望能把前臺的angular、nginx
也構建完畢,爭取一條docker
命令,就直接啟動應用程序。
參考鏈接:spring boot, mysql, react docker compose example
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://segmentfault.com/a/1190000020953106