最近需要打包項(xiàng)目給成員們進(jìn)行測(cè)試,但打包運(yùn)行后很影響開(kāi)發(fā),于是打算使用docker
模擬生產(chǎn)環(huán)境運(yùn)行打包后的項(xiàng)目,這樣就能既開(kāi)發(fā),又能給成員進(jìn)行測(cè)試了。
由于原項(xiàng)目過(guò)大,打算先拿軟件工程的大實(shí)驗(yàn)試試水,軟件工程大實(shí)驗(yàn)使用的是spring-boot,redis,mysql,angular,nginx
這些環(huán)境,先試了試后臺(tái)的spring-boot,redis,mysql
的docker
搭建。
docker-compose
compose
項(xiàng)目是docker官方的開(kāi)源項(xiàng)目,負(fù)責(zé)實(shí)現(xiàn)對(duì)docker容器集群的快速編排。compose
定位是定義和運(yùn)行多個(gè)docker容器的應(yīng)用。
我們都知道,使用一個(gè)dockerfile
模版文件就可以創(chuàng)建一個(gè)應(yīng)用容器,但通常在一個(gè)項(xiàng)目中,需要多個(gè)應(yīng)用容器,就像我的后臺(tái),同時(shí)需要jdk8
、redis
、mysql
這些應(yīng)用。docker-compose
剛好滿足了這樣的需求。它允許用戶通過(guò)一個(gè)單獨(dú)的docker-compose.yml
模版文件來(lái)定義一組相關(guān)聯(lián)的應(yīng)用容器為一個(gè)項(xiàng)目。
服務(wù)(service):一個(gè)應(yīng)用的容器,實(shí)際可以包括若干運(yùn)行相同鏡像的容器實(shí)例。
compose
中兩個(gè)重要的概念:
項(xiàng)目(project):由一組關(guān)聯(lián)的應(yīng)用容器組成的一個(gè)完整的業(yè)務(wù)單元,在docker-compose.yml
文件中定義。
服務(wù)就是我們需要的docker
容器,項(xiàng)目就是由許多服務(wù)構(gòu)成的,了解了docker-compose
之后就可以進(jìn)行環(huán)境搭建了。
搭建spring-boot
為了編譯spring-boot
,基于以下流程:
- 基于jdk8鏡像
- 將spring-boot下的mvnw、pom.xml復(fù)制到容器中,導(dǎo)入maven依賴
- 將src目錄下的源碼復(fù)制到容器中,使用maven打包spring-boot項(xiàng)目
- 使用jre8環(huán)境運(yùn)行項(xiàng)目
構(gòu)建的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項(xiàng)目 from openjdk:8-jdk-alpine as build # 設(shè)置項(xiàng)目在docker容器中工作目錄 workdir /app # 將 maven 可執(zhí)行程序復(fù)制到容器中 copy mvnw . copy .mvn .mvn # 復(fù)制pom.xml文件 copy pom.xml . # 導(dǎo)入所有maven依賴 run . /mvnw dependency:go-offline -b # 復(fù)制項(xiàng)目源代碼 copy src src # 打包應(yīng)用程序 run . /mvnw package -dskiptests run mkdir -p target /dependency && ( cd target /dependency ; jar -xf ../*.jar) #### 設(shè)置能運(yùn)行應(yīng)用程序的最小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 集成項(xiàng)目服務(wù)
完成了spring-boot的容器構(gòu)建后,就可以使用docker-compose
集成spring-boot、redis、mysql
容器了。具體思路:
- 聲明項(xiàng)目
- 聲明項(xiàng)目需要集成的服務(wù)
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' # 定義服務(wù) services: # spring-boot服務(wù) app-server: build: context: . # 配置需要構(gòu)建dockerfile的路徑 相對(duì)于docker-compose.yml dockerfile: dockerfile ports: - "8080:8080" # 將本機(jī)8080端口映射到容器8080端口 restart: always depends_on: - db # 需要依賴的服務(wù) 率先構(gòu)建 - redis environment: # 設(shè)置環(huán)境變量 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: # 網(wǎng)絡(luò) 連接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
構(gòu)建項(xiàng)目容器:
使用docker-compose up
啟動(dòng)容器:
當(dāng)成功看到spring-boot啟動(dòng)成功的日志,就成功配置好了。
后續(xù)
這次只構(gòu)建了后臺(tái),希望能把前臺(tái)的angular、nginx
也構(gòu)建完畢,爭(zhēng)取一條docker
命令,就直接啟動(dòng)應(yīng)用程序。
參考鏈接:spring boot, mysql, react docker compose example
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://segmentfault.com/a/1190000020953106