接續昨天,因為我們有連接資料庫,因此我們其實需要一個Postgres的服務,這樣才能讓我的spring boot application 連接,除此之外,我還需要一個DB GUI來看確認我資料庫的情況,根據我使用的資料庫Postgres,可以使用pgadmin來掌握資料庫的情況。
根據以上,我需要啟動Spring boot Application、Postgres、pgadmin共計三個服務,那這樣一個一個起好像有點麻煩,有沒有有效率一點的方法呢?...有!就要講到今天的主角了-Docker Compose
Docker Compose 可以幫忙把要啟動的docker image 放在docker-compose.yml 檔案內,方便我們一次性的啟動,更好的事可以在裡面寫好配置,啟動多個服務就變得輕鬆多了~
//可以先看有沒有下載
docker compose version
這邊付上官方下載教學,可以根據自己的os選擇。
前情提要一下,由於資料庫啟動後不會幫我創建出我需要的DataBase,我需要自己創建,因此我寫一個配置檔server.json,來透過pgadmin創建名為postgres的資料庫。內容如下
{
"Servers": {
"1": {
"Name": "SPRINGBOOT APP",
"Group": "Servers",
"Host": "db",
"Port": 5432,
"MaintenanceDB": "postgres",
"Username": "postgres",
"Password": "postgres",
"SSLMode": "prefer"
}
}
}
那我們來看看Docker Compose怎麼使用,先看我yml檔的其中一部分
version: '3.8'
services:
spring-boot-itdemo:
container_name: 'spring-boot-itdemo'
image: spring-boot-itdemo:latest
ports:
- "8080:8080"
version: 是指Docker Compose 配置文件根據版本 3.8 的語法和規則撰寫。
services: 是只需要啟動的服務,服務名稱可以自己取,如範例的spring-boot-itdemo。
接下來你可以對你的服務撰寫一些配置
container_name:很直觀,就是啟動後的container name
image:要啟動的image
ports:port號映射
其實要配置的還有很多,不過有許多都是根據使用的服務不同會有所改變,所以這邊不同的服務還是可以查詢一下要如何撰寫與配置喔,最後直接附上三個服務的docker-compose.yml完整內容
version: '3.8'
services:
db:
container_name: 'postgresql'
image: postgres:15.2-alpine
restart: always
ports:
- "5436:5432"
environment:
POSTGRES_PASSWORD: postgres
POSTGRES_DB: postgres
volumes:
- db-data:/var/lib/postgresql/data
dbGUI:
container_name: 'pgadmin'
image: dpage/pgadmin4
restart: always
ports:
- "5437:80"
environment:
PGADMIN_DEFAULT_EMAIL: 'test@gmail.com'
PGADMIN_DEFAULT_PASSWORD: 'test'
PGADMIN_SERVER_JSON_FILE: '/pgadmin4/pgadmin/server.json'
volumes:
- .\server.json:/pgadmin4/pgadmin/server.json
depends_on:
- db
spring-boot-itdemo:
container_name: 'spring-boot-itdemo'
image: spring-boot-itdemo:latest
restart: always
ports:
- "8080:8080"
environment:
SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/postgres
SPRING_DATASOURCE_USERNAME: postgres
SPRING_DATASOURCE_PASSWORD: postgres
depends_on:
- db
這邊要提到一個觀念--掛載(volumes)
由於我們的存在Container內的資料會隨者Container 的生命週期結束一起消失不見,這是很可怕的事情,尤其當像我們有使用資料庫,如果服務不小心掛掉,那我們的資料也會跟不見,因此我們需要掛載。
其概念為將Container 內的資料夾,以上面的例子就是把儲存資料庫資料的資料夾,掛載到我本地的資夾,這樣Container掛掉後,我本地這邊就會有掛載出來的資料,資料就不會不見啦,同理如果本地有資料想帶入,也可以掛載進去,如我這邊將我的server.json掛載到/pgadmin4/pgadmin/server.json
以上寫完後回到docker-compose.yml的目錄下,使用
docker compose up
這樣就可以把包含在docker-compose.yml內的服務一次起動起來了喔~~