docker - dockerfile構建一個簡單的springboot應用鏡像

      在前面的 《docker - 構建一個簡單的docker鏡像》中,介紹了兩種構建鏡像的方法,其中,經過dockerfile文件構建鏡像是在實際生產中經常使用的;除此以外,還經過 docker - Dockerfile經常使用指令 和  docker - 經常使用命令 兩篇文章介紹了dockerfile的指令和docker的經常使用命令,接下來,咱們將會使用所學的知識構建一個簡單的springboot應用。java

    該springboot應用對外暴露了一個api,對外暴露8080端口,日誌文件寫在應用當前目錄,部分代碼以及配置文件以下:spring

@Slf4j
@SpringBootApplication
@RestController
public class SpringbootDockerApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootDockerApplication.class, args);
    }

    @RequestMapping("/docker")
    public String docker() {
        log.info("access docker home at " + LocalTime.now());
        return "Hello Docker!";
    }
}

application.propertiesdocker

spring.application.name=springboot-docker
server.port=8080
logging.file=app.log

把jar和dockerfile文件上傳到一個springboot-docker目錄中api

[root@localhost springboot-docker]# ls
Dockerfile  springboot-docker-1.0.jar

Dockerfile:springboot

FROM openjdk:8u181-jdk-alpine
ARG workdir=/app
VOLUME ${workdir}
WORKDIR ${workdir}
ADD springboot-docker-1.0.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]
  • FROM openjdk:8u181-jdk-alpine : 從docker倉庫中獲取基礎鏡像
  • ARG workdir=/app : 添加變量,該變量只在當前的dockerfile中有效,若是換成ENV,則在容器中生效。這裏須要注意的是,ARG和ENV對哪些指令是起效的,能夠參考  docker - Dockerfile經常使用指令 
  • VOLUME ${workdir} : 把宿主機的目錄(該目錄能夠經過docker inspect dockerName查看)掛載到容器中的/app這個目錄,這樣能夠在宿主機中查看該目錄的內容。還有一個很重要的緣由,就是數據持久化,若是不掛載,當容器關閉刪除後,數據將會跟着被刪除。這裏由於/app是應用所在的目錄,該目錄會產生日誌等其它內容。
  • WORKDIR ${workdir} :指定工做目錄,下面的指令操做將在這個指定目錄中執行。還有一點是,當經過交互模式的exec命令進入到該容器時,默認當前路徑是/app
  • ADD springboot-docker-1.0.jar app.jar : 添加文件到WORKDIR
  • EXPOSE 8080 : 暴露8080端口,須要經過容器IP和端口訪問應用。若是想經過宿主機的IP和端口訪問應用,須要在RUN容器的時候綁定。能夠參考docker - Dockerfile經常使用指令 的run命令
  • ENTRYPOINT: 運行容器後執行的第一條命令,這裏經過java -jar命令運行應用。

接下經過BUILD命令構建鏡像bash

[root@localhost springboot-docker]# docker build -t springboot-docker:1.0 .

Sending build context to Docker daemon  17.85MB
Step 1/7 : FROM openjdk:8u181-jdk-alpine
 ---> 97bc1352afde
Step 2/7 : ARG workdir=/app
 ---> Using cache
 ---> a3818e8696c2
Step 3/7 : VOLUME ${workdir}
 ---> Using cache
 ---> e2faefe34aa6
Step 4/7 : WORKDIR ${workdir}
 ---> Using cache
 ---> 144b537c1b57
Step 5/7 : ADD springboot-docker-1.0.jar app.jar
 ---> Using cache
 ---> daca849e1012
Step 6/7 : EXPOSE 8080
 ---> Using cache
 ---> 123da0847dd3
Step 7/7 : ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]
 ---> Using cache
 ---> de46a3f96d91
Successfully built de46a3f96d91
Successfully tagged springboot-docker:1.0

查看當前本地倉庫的鏡像,已經構建springboot-docker:1.0鏡像app

[root@localhost springboot-docker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
springboot-docker   1.0                 de46a3f96d91        38 minutes ago      121MB
openjdk             8u181-jdk-alpine    97bc1352afde        5 weeks ago         103MB

運行鏡像dom

docker run -p 8080:8080 -d --name springboot-docker springboot-docker:1.0

經過-p參數,把容器中的8080端口映射到宿主機中的8080端口。--name,給容器起一個名字curl

能夠查看springboot應用的啓動狀況ui

docker logs -f springboot-docker 

查看容器的運行狀況

docker inspect springboot-docker

只看一些關鍵的信息

"Mounts": [
            {
                "Type": "volume",
                "Name": "90df5c82f11290eddfc86faead12e4a79649672845b2a816e04f868da76851a3",
                "Source": "/var/lib/docker/volumes/90df5c82f11290eddfc86faead12e4a79649672845b2a816e04f868da76851a3/_data",
                "Destination": "/app",
                "Driver": "local",
            }
        ],
"Networks": {
	"bridge": {
		"Gateway": "172.17.0.1",
		"IPAddress": "172.17.0.2",
	}
}

    宿主機中的 /var/lib/docker/volumes/90df5c82f11290eddfc86faead12e4a79649672845b2a816e04f868da76851a3/_data 目錄掛載到 容器的 /app目錄

    容器的IP地址 172.17.0.2

    運行成功後,在宿主機中經過命令訪問服務

curl 172.17.0.2:8080/docker

    也能夠經過宿主機的IP或者localhost訪問,由於已經綁定

curl 127.0.0.1:8080/docker
相關文章
相關標籤/搜索