1.pom.xml添加Docker依賴
<properties>
<docker.image.prefix>ramer</docker.image.prefix>
</properties>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.11</version>
<configuration>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
注意:在添加docker插件時,可能會出現安裝不了的情況,這是因爲 com.spotify插件沒在maven白名單中,在setting.xml文件中添加:
<pluginGroups>
<pluginGroup>com.spotify</pluginGroup>
</pluginGroups>
2.容器化應用
在項目目錄src/main下新建文件夾,創建Dockerfile文件(該文件沒有後綴): src/main/docker/Dockerfile,內容如下
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD home-page-interface-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 9090
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
Dockerfile文件語法說明
FROM:
指定了當前鏡像繼承的基礎鏡像。
文件中:表示使用 Jdk8 環境 爲基礎鏡像,如果鏡像不是本地的會從 DockerHub 進行下載。
VOLUME:
創建一個可以從本地主機或其他容器掛載的掛載點,一般用來存放數據庫和需要保持的數據等。
Volume設置指令,使容器中的一個目錄具有持久化存儲數據的功能,該目錄可以被容器本身使用,也可以共享給其他容器使用。我們知道容器使用的是AUFS,這種文件系統不能持久化數據,當容器關閉後,所有的更改都會丟失。當容器中的應用有持久化數據的需求時可以在Dockerfile中使用該指令。
ADD:
從當前工作目錄複製文件到鏡像目錄中去。
EXPOSE:
EXPOSE
指令是聲明運行時容器提供服務端口,這只是一個聲明,在運行時並不會因爲這個聲明應用就會開啓這個端口的服務。在Dockerfile
中寫入這樣的聲明有兩個好處,一個是幫助鏡像使用者理解這個鏡像服務的守護端口,以方便配置映射;另一個用處則是在運行時使用隨機端口映射時,也就是docker run -P
時,會自動隨機映射EXPOSE
的端口。
要將EXPOSE
和在運行時使用-p <宿主端口>:<容器端口>
區分開來。-p
,是映射宿主端口和容器端口,換句話說,就是將容器的對應端口服務公開給外界訪問,而EXPOSE
僅僅是聲明容器打算使用什麼端口而已,並不會自動在宿主進行端口映射。
ENTRYPOINT:
配置容器啓動時自動執行的命令。
這裏:爲了縮短 Tomcat 的啓動時間,添加java.security.egd
的系統屬性指向/dev/urandom
作爲 ENTRYPOINT。
3. 創建docker鏡像
在cmd.exe中進入自己項目的目錄:執行mvn package -Dmaven.test.skip=true docker:build
這裏要確保已經將maven添加到path環境變量中,並且已經開啓docker。
4. 運行docker容器
docker run --name=docker-demo -p 9090:9090 -t ramer/demo
運行後,會在cmd.exe中出現標誌性的springboot啓動標誌,表示啓動完成。此時可以在瀏覽器等訪問項目。
5. 啓動/關閉/重啓/刪除docker容器
cmd: docker start/stop/restart/rm CONTAINER_ID/NAME
其中:
CONTAINER_ID: 是容器id,執行 docker ps 可查看
NAME: 是容器的名稱,也就是docker run –name後面的名字