在docker裡跑spring boot+mongo(一)

URL Link //n.sfs.tw/14567

2020-03-10 11:06:25 By igogo

 

系統安裝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 回來

https://hub.docker.com/

 

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 的服務