Google Code Prettify

2019年4月5日 星期五

部署 RESTful service 到 docker

我用 spring boot 寫了一個 hello 的 RESTful service,如下,傳入名稱,服務就會回覆 Hello $name。
@RestController
public class HelloController {

@RequestMapping("/hello/{name}")
public String hello(@PathVariable String name) {
return "Hello " + name + " !";
}
}
這個 RESTful service 我打包成 jar 檔,要部署到 docker 上執行。打包好的 jar 檔名為 Hello-1.0.0.jar,在 docker 中要安裝 open JDK 11 (openjdk-11_linux-x64_bin.tar.gz),Dockerfile 是 docker 提供的自動化部署方式,繼續往下看之前,可以先看一下這一篇 -- 使用 Dockerfile 創建 docker 鏡像
  • Dockerfile
FROM centos:latest
MAINTAINER "Steven Shi"<hi.steven@gmail.com>
ADD openjdk-11_linux-x64_bin.tar.gz /usr/local
COPY Hello-1.0.0.jar /home
RUN ln -s /usr/local/jdk-11 /usr/bin/java
ENV JAVA_HOME /usr/local/jdk-11
ENV PATH $JAVA_HOME/bin:$PATH
EXPOSE 9080
CMD java -jar /home/Hello-1.0.0.jar
    • FROM centos:latest: 指定這個 image 的基礎鏡像為 centos 的最新版。
    • ADD openjdk-11_linux-x64_bin.tar.gz /usr/local: 把 jdk 部署到 /usr/local 目錄下,ADD 指令不只會 copy 指定的檔案到指定目錄,還具有解壓縮的功能。
    • COPY Hello-1.0.0.jar /home: 把 RESTful service 的 jar 檔部署到 /home 目錄下。
    • EXPOSE 9080: 這個 container 對外開放出 9080 這個 port。
    • CMD java -jar /home/Hello-1.0.0.jar: 在 container 啟動時,讓 hello 服務啟動。
  • 部署服務到 docker
docker build -t steven/hello .
在上面那三個檔案所在目錄執行上述指令,就會在 docker 產生鏡像,名稱為 steven/hello,注意,最後面有個句點,指出是在目前目錄。
  • 啟動 container
docker run -p 9080:9080 --name hello-container -d steven/hello
    • -p 9080:9080 : container 外要連入 container 的 port 也設為 9080 和 container 開放給外界的 port 相連通 (port 號不需要一樣)。
    • --name : container 啟動後的名稱。
    • -d : 啟動為 daemon 狀態,後面接的是鏡像名稱。
  • 測試
curl localhost:9080/hello/Steven
用 curl 發一個 http request 如上,會傳回 Hello Steven,確認服務部署成功。