系統安裝docker ce
centos7 + docker ce
https://docs.docker.com/install/linux/docker-ce/centos/
#yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 #yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo #yum install docker-ce docker-ce-cli containerd.io #systemctl start docker #systemctl enable docker
Docker的歡念是一個container 一個用途, 所以本文件會建立兩個container, 一個是mongo, 一個是spring boot提供服務的web
接下來,我先拉一個 mongo 的 官方 image 回來
docker pull mongo
建立服務
docker run -d --name mongo mongo
由上圖可知, 我們順利啟動了一個命名為mogo 的container
接下來我們利用spring boot 寫一個簡單連接mongo 並傳回rest 值的服務, 要注意的是
在連接mongo 時, 我們將container 命名為mongo, 所以在 application.properties 的mongo host 需指向 mongo
因為mongodb 的server 指向的是另一個container, 所以在編譯時需要跳過, 否則會錯誤
-Dmaven.test.skip=true
部份程式碼
Entity
public class Coffee { @Id public String name; public Integer price; public Coffee(String name, Integer price) { this.name = name; this.price = price; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getPrice() { return price; } public void setPrice(Integer price) { this.price = price; } }
CoffeeRepository
public interface CoffeeRepository extends MongoRepository<Coffee, String> { }
IndexController
@RestController public class Index { @Autowired CoffeeRepository coffeeRepository; @RequestMapping("/") public List<Coffee> index(){ return coffeeRepository.findAll(); } }
Application
@SpringBootApplication public class MongoApplication implements CommandLineRunner { @Autowired CoffeeRepository coffeeRepository; public static void main(String[] args) { SpringApplication.run(MongoApplication.class, args); } @Override public void run(String... args) throws Exception { System.out.println("hello"); coffeeRepository.save(new Coffee("Americano", 60)); coffeeRepository.save(new Coffee("Latte", 90)); List<Coffee> coffees = coffeeRepository.findAll(); coffees.forEach(coffee -> System.out.println(coffee.name)); } }
建立web服務
使用openjdk 官方images
docker pull openjdk:8-slim
將編好的jar 檔放到 /app/web.jar , 並與container 連接, 日後更新jar檔 再重啟container 即可
docker run -it -d -p 8080:8080 -v /app:/app --link mongo:mongo --name web openjdk:8-slim
--link 與另一個名為mongo的 container 連接, 使用mongo 資料庫
-v /app:/app 與host的 /app連接
-p 與host的8080連接
進入web 的container 執行jar 檔啟動服務, 此時web container 的8080 port 是對應到主机的 8080
docker exec -it web bash
成功啟動畫面
連上host ip 8080 port
除錯
如果在web的 container 可利用telnet, mongo 指令確認是否能連上mongo
telnet mongo 27017
如果連不上, 表示兩個container 並不相連, 無法使用mongo container 的服務