1. 程式人生 > >學習Docker之Docker初體驗---SpringBoot整合Docker的部署、釋出與應用

學習Docker之Docker初體驗---SpringBoot整合Docker的部署、釋出與應用

DOCKER.png

準備工作

安裝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
2.png

簡單的看到了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
3.png
很順利,執行成功了

  • CONTAINER ID 容器ID
  • PORTS宿主與docker內部的服務對映
  • NAMES 容器名稱,跟容器ID對應,如果你不指定名稱的話,docker會隨機給你分配一個name, 名字還是很有意思的
    接下來,就是驗證的時候了,在瀏覽器輸入對應URL
    4.png
    到此,docker部署springboot服務的過程就結束了,接下來就是將自己開發的映象推送到DockerHub

DockerHub

推送映象通俗的說就是類似把程式碼推送到github一樣,這個是把一個完整的應用程式推送到DockerHub,供其他Docker pull與使用。
首先你需要註冊一個賬號,很簡單不再贅述
建立倉庫的時候,回頭看看pom裡的配置,兩者有著密切的聯絡
5.png
這個你可以理解成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,相當於版本號
包比較大網路傳輸的比較慢,等了幾分鐘過程如下(如果失敗就多重試幾次)
6.png
再來看看DockerHub頁面
7.png
注意右邊紅框的程式碼,意思就是說,在任何docker執行

docker pull vector4wang/quick-docker

就能快速部署並啟動一個應用,網路快的話,能達到秒級別的

快速部署

現在來感受下docker的強大之處
我把docker所有容器和映象清空,快速的去部署quick-docker服務
演示.gif
注意看右下角時間,剛剛好一分鐘~~~~

最後

Docker的強大之處你也見識了,真的是再一次解放了程式設計師,讓程式設計師不再關心如何去配置專案需要的環境。接下來我會持續記錄學習和使用Docker的過程,並從以下幾個問題著手:

  • 什麼是Docker
  • Docker常用命令
  • Image和Continer兩者的關係
  • Dockerfile的應用
  • 容器的生命週期
  • Docker內部服務的監控與效能調優
  • 。。。