學習Docker之Docker初體驗---SpringBoot整合Docker的部署、釋出與應用
準備工作
- 會一點springboot
不會沒關係,花十幾分鍾補一下Quick-SpringBoot - 會一點Maven
不會沒關係,花幾分鐘補一下Maven的快速應用 - 會一點Linux命令
不會沒關係,花十幾分再補一下Linux菜鳥教程 - 一臺聯網的Centos機器
安裝Docker
進入Centos終端,執行命令
yum install docker
靜待一會,等待安裝成功,之後再執行
systemctl start docker
然後檢視安裝的docker版本
[[email protected] ~]# docker version
Client:
Version: 1.12.6
API version: 1.24
Package version: docker-1.12.6-68.gitec8512b.el7.centos.x86_64
Go version: go1.8.3
Git commit: ec8512b/1.12.6
Built: Mon Dec 11 16:08:42 2017
OS/Arch: linux/amd64
Server:
Version: 1.12.6
API version: 1.24
Package version: docker-1.12.6-68.gitec8512b.el7.centos.x86_64
Go version: go1.8.3
Git commit: ec8512b/1.12.6
Built: Mon Dec 11 16:08:42 2017
OS/Arch: linux/amd64
準備Springboot專案
簡單的建立一個工程,實現一個介面即可,然後在pom中新增docker外掛,相關程式碼如下
@SpringBootApplication
@RestController
public class DockerApplication {
@RequestMapping("/hello")
public String hello() {
return "<h1>Hello Spring-Boot Maven Docker</h1>";
}
public static void main(String[] args) {
SpringApplication.run(DockerApplication.class);
}
}
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.3</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>
</plugins>
</build>
再建立一個Dockerfile,注意裡面的ADD xxx.jar
是你使用maven打包之後的jar包的名稱,其他的不變
FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD quick-docker-1.0-SNAPSHOT.jar app.jar
RUN sh -c 'touch /app.jar'
ENV JAVA_OPTS=""
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
最終的目錄結構如下
.
├── pom.xml
└── src
└── main
├── docker
│ └── Dockerfile
├── java
│ └── com
│ └── docker
│ └── DockerApplication.java
└── resources
└── application.properties
使用Docker部署服務
將src檔案和pom放在任意資料夾下,執行命令
mvn package docker:build
在打包的過程中比以往多了以下幾步
[INFO] Building image vector4wang/quick-docker
Step 1 : FROM frolvlad/alpine-oraclejdk8:slim
Trying to pull repository docker.io/frolvlad/alpine-oraclejdk8 ...
Pulling from docker.io/frolvlad/alpine-oraclejdk8
ff3a5c916c92: Pull complete
51d82ddde372: Pull complete
31b0b3ea6b23: Pull complete
Digest: sha256:52864f95ade9d007fb439f9d396742a104dc1067d32b6837caf6df1e0f1a5dc1
---> 7d711dabe19e
Step 2 : VOLUME /tmp
---> Running in 04ce9f4dce7d
---> f46d6639a6f3
Removing intermediate container 04ce9f4dce7d
Step 3 : ADD quick-docker-1.0-SNAPSHOT.jar app.jar
---> 1540566b402c
Removing intermediate container e8139d4f64e5
Step 4 : RUN sh -c 'touch /app.jar'
---> Running in ae7be1b36370
---> 49a6d6c256ac
Removing intermediate container ae7be1b36370
Step 5 : ENV JAVA_OPTS ""
---> Running in ea06fa1e72ff
---> af945e1fd8b3
Removing intermediate container ea06fa1e72ff
Step 6 : ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -jar /app.jar
---> Running in a1b9bed3a100
---> d1dcc0ee4b44
Removing intermediate container a1b9bed3a100
Successfully built d1dcc0ee4b44
[INFO] Built vector4wang/quick-docker
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 36.315 s
[INFO] Finished at: 2018-01-18T21:58:53+08:00
[INFO] Final Memory: 32M/77M
[INFO] ------------------------------------------------------------------------
[[email protected] code]#
Docker啟動服務
先來看下服務部署完之後,docker裡多了些什麼吧,執行docker images
簡單的看到了docker中存在的映象、標籤、映象ID、已經建立的時間和大小,看下vector4wang/quick-docker
這個是在pom中<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
配置的,比較重要,因為它和接下來要講的將映象提交到DockerHub有著密切的聯絡。
執行docker run -d -p 8080:8080 vector4wang/quick-docker
來啟動服務。
簡單解釋下這個命令
- -d 代表後臺執行
- -p 標識宿主機與docker服務的埠對映,注意誰前誰後:【宿主埠:docker內服務埠】
- vector4wang/quick-docker 就是啟動映象的名稱,當然了使用IMAGE ID 也是可以的
好了,看下docker是否將服務啟動成功,執行docker ps
很順利,執行成功了
CONTAINER ID
容器IDPORTS
宿主與docker內部的服務對映NAMES
容器名稱,跟容器ID對應,如果你不指定名稱的話,docker會隨機給你分配一個name, 名字還是很有意思的
接下來,就是驗證的時候了,在瀏覽器輸入對應URL
到此,docker部署springboot服務的過程就結束了,接下來就是將自己開發的映象推送到DockerHub
DockerHub
推送映象通俗的說就是類似把程式碼推送到github一樣,這個是把一個完整的應用程式推送到DockerHub,供其他Docker pull與使用。
首先你需要註冊一個賬號,很簡單不再贅述
建立倉庫的時候,回頭看看pom裡的配置,兩者有著密切的聯絡
這個你可以理解成maven裡面的依賴jar包的“座標”
回到終端,執行docker login
按照提示輸入使用者名稱和密碼
[[email protected] code]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username (vector4wang): vector4wang
Password:
Login Succeeded
[[email protected] code]#
接下來就是推送的了,執行命令docker push vector4wang/quick-docker:latest
latest是tag,相當於版本號
包比較大網路傳輸的比較慢,等了幾分鐘過程如下(如果失敗就多重試幾次)
再來看看DockerHub頁面
注意右邊紅框的程式碼,意思就是說,在任何docker執行
docker pull vector4wang/quick-docker
就能快速部署並啟動一個應用,網路快的話,能達到秒級別的
快速部署
現在來感受下docker的強大之處
我把docker所有容器和映象清空,快速的去部署quick-docker服務
注意看右下角時間,剛剛好一分鐘~~~~
最後
Docker的強大之處你也見識了,真的是再一次解放了程式設計師,讓程式設計師不再關心如何去配置專案需要的環境。接下來我會持續記錄學習和使用Docker的過程,並從以下幾個問題著手:
- 什麼是Docker
- Docker常用命令
- Image和Continer兩者的關係
- Dockerfile的應用
- 容器的生命週期
- Docker內部服務的監控與效能調優
- 。。。