可以說,Docker是目前市面上比較流行的容器技術之一。
本節我們將帶領大家一起使用Docker來演示如何構建、運行、發布微服務。
Docker的安裝
原先,Docker只支持linux環境下的安裝。自從微軟與Docker展開了深入合作之后,對于windows平臺的支持力度也加大了許多。目前,已經知道支持的Windows平臺有Windows 10和Windows Server 2016。
本文將基于Windows 10來演示安裝的過程。本例所使用的Docker版本為17.09.1-ce-win42。
1.下載安裝Docker
下載位置可見https://docs.docker.com/docker-for-windows/install/#download-docker-for-windows
下載成功之后,可以獲取到Docker for Windows Installer.exe安裝文件。雙擊該文件,根據提示執行安裝即可。
安裝完畢后,會自動啟動Docker。狀態欄中顯示了Docker圖標,說明Docker正在運行,可以從終端訪問。
單擊頂部狀態欄中的Docker 圖標,并選擇“About Docker”,來驗證所安裝的是否是最新的版本。
2.驗證安裝
為了驗證安裝是否正確,可以在命令行工具( cmd.exe或PowerShell)中執行下列命令來驗證Docker Engine、Compose及 machine。
C:lUsersAdministrator>docker --versionDocker version 17.09.1-ce, build 19e2cf6
C:UsersAdministrator>docker-compose --versiondocker-compose version 1.17.1,build 6d101fb0
C:lUsers Administrator>docker-machine --versiondocker-machine version 0.13.0,build 9ba6da9
Docker的簡單使用
接下來我們將通過一些簡單的示例,來熟悉Docker的基本用戶。使用命令行工具來執行Docker相關的命令。
1.查看容器列表
執行docker ps可以查看已經安裝的容器。
C:lUsersAdministrator>docker ps
CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES
正如上面所輸出的那樣,一開始,我們的容器列表是空的。
⒉.查看Docker的版本信息
執行docker version可以查看Docker 的版本信息。
C:Users Administrator>docker version
Client:
version:17.09.1-ce
APIversion:1.32
Go version:go1.8.3
Git commit: 19e2cf6
Built: Thu Dec 722:22:26 2017
oS/Arch:windows/amd64
Server:
version:17.09.1-ce
API version:1.32 (minimumversion 1.12)
Go version:gol.8.3
Git commit:19e2cf6
Built: Thu Dec 7 22:28:28 2017
OS/Arch:linux/amd64
Experimental:true
3.查看Docker的詳細信息
執行 docker info可以查看Docker 的詳細信息。
C: lUserslAdministrator>docker info
Containers:o
Running:o
Paused:0
Stopped: 0
工mages:0
Server version:17.09.1-ce
Storage Driver: overlay2
Backing Filesystem:extfs
Supports d_type:true
Native Overlay Diff:true
Logging Driver: json-file
cgroup Driver:cgroupfs
Plugins:
volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk
syslog
Swarm: inactive
Runtimes:runc
Default Runtime: runc
Init Binary:docker-init
containerd version: 06b9cb35161009dcb7123345749fef027cea8e0
runc version:328b84a7773d38244dd690525642a72156c64
init version:949e6fa
Security Options:
seccomp
Profile: default
Kernel version: 4.9.49-moby
operating System: Alpine Linux v3.5
OSType:linux
Architecture:x86 64
CPUs:2
Total Memory: 1.934GiB
Name: moby
ID:FB3K:DR7K:UX7V:23AU:MPDR:E2NJ:R746:JFU5:730V:P2RU:YQ7F:MYPF
Docker Root Dir:/var/lib/docker
Debug Mode (client):false
Debug Mode (server) :true
File Descriptors:16
Goroutines:25
System Time:2017-12-22T15:40:01.6330973z
EventsListeners:o
Registry:https://index.docker.io/v1/
Experimental:true
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
4.運行容器
執行docker run hello-world可以測試運行容器。
C:UsersAdministrator>docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
ca4f61b1923c:Pull complete
Digest:sha256:445b2fe9afea8b4aa0b227fe49dd6ad130dfe7a8fd0832be5de
99625dad47cd
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation Appears to be working
correctly.
To generate this message,Docker took the following steps:
1.The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the DockerHub.
(amd64))
3.The Docker daemon created a new container from that image which runstheexecutable that produces the output you are currently reading.
4.The Docker daemon streamed that output to the Docker client,which
sent it
toyour terminal.
To try something more ambitious,you can run an Ubuntu container with:
$docker run-it ubuntu bash
Share images,automate workflows,and more with a free Docker ID:
https://cloud.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/engine/userguide/
其中:
- . hello-world是一個用于測試的非常簡單的程序。該程序執行之后,會輸出上述文本內容;
- .hello-world是托管于Docker Hub上的一個image;
- 執行docker run hello-world之后,會先在本地查找是否存在hello-world image,如果沒有找到,則聯網到Docker Hub上下載;
- ·找到hello-world image后,就運行容器。
Docker運行微服務
下面,我們就演示下如何用Docker來運行微服務。
1.創建微服務
我們在之前所創建的hello-world應用的基礎上,生成一個新的應用hello-world-docker,用于微服務示例。
同時,我們執行gradlew build來編譯hello-world-docker應用。編譯成功之后,就能運行該編譯文件。
JAVA-jar build/libs/hello-world-docker-1.0.0.jar
此時,在瀏覽器訪問http:/localhost:8080/hello,應能看到“Hello World! Welcome to visit way-lau.com!”字樣的內容,則說明該微服務構建成功。
2.微服務容器化
我們需要將微服務應用包裝為Docker容器。Docker使用 Dockerfile文件格式來指定image層。
我們在 hello-world-docker應用的根目錄下創建Dockerfile文件。
EROM openjdk:8-jdk-alpine
VOLUME/tmp
ARG JAR FILE
ADD ${JAR FILE}app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom", "-jar","/
app.jar"]
這個Dockerfile是非常簡單的,因為本例子中的微服務應用相對比較簡單。其中:
·FROM可以理解為我們這個image依賴于另外一個image。因為我們的應用是一個Java應用,所以依賴于JDK;
·項目JAR文件以“app.jar”的形式添加到容器中,然后在ENTRYPOINT中執行;
. VOLUME指定了臨時文件目錄為/tmp。其效果是在主機/var/lib/docker目錄下創建了一個臨時文件,并鏈接到容器的/tmp。該步驟是可選的,如果涉及文件系統的應用,就很有必要了。/tmp目錄用來持久化到Docker數據文件夾,因為Spring Boot使用的內嵌Tomcat容器默認使用/tmp 作為工作目錄;
·為了縮短Tomcat啟動時間,添加一個系統屬性指向/dev/./urandomo
3.使用Gradle來構建Docker image
為了使用Gradle來構建Docker image,需要添加docker插件在應用的build.gradle中。
buildscript {
dependencies{
...
classpath ('gradle.plugin.com.palantir.gradle.docker:gradle-dock-
er:0.17.2')
apply plugin: 'com.palantir.docker'
docker {
name "${project.group}/${jar.baseName }"
files jar.archivePath
buildArgs(['JAR_FILE':"${jar.archiveName}"])
執行gradlew build docker來構建Docker image。
>gradlew build docker --info
...
Starting process 'command 'docker' '. Working directory:D:|workspaceGi
tosclspring-cloud-microservices-developmentsampleshello-world-docker
builddocker Command:docker build --build-arg JAR_FILE=hello-world-
docker-1.0.0.jar-t com.waylau.spring.cloud/hello-world-docker .
Successfully started process 'command 'docker''
2fdfelcd78c2:Pulling fs layer
82630fd6e5ba: Pulling fs layer
00151leb3437:Pulling fs layer
82630fd6e5ba:verifying Checksum
82630fd6e5ba:Download complete
2fdfelcd78c2:verifying Checksum
2fdfelcd78c2:Download complete
2dfelcd78c2:Pull complete
82630fd6e5ba: Pull complete
001511eb3437:Verifying Checksum
001511eb3437: Download complete
0015l1eb3437: Pull complete
Digest:sha256:388566cc68259a0019004c2d343dd6c69b83914dc5c458be959271
a2761795
Status:Downloaded newer image for openjdk:8-jdk-alpine
-—-> 3642e636096d
Step 2/5 :VOLUME /tmp
---> Running in 40ff6fa809e8
--->f467a7dlc267
Removing intermediate container 40ff6fa809e8
step 3/5 :ARG JAR FILE
---> Running in 4872c7353093
--->4406b96eca35
Removing intermediate container 4872c7353093
Step 4/5 : ADD ${JAR_FILE} app-jar
---> a2e55472f1db
step 5/5:ENTRYPOINT java-Djava.security.egd=file:/dev/./urandom -jar
/app.jar
---> Running in f536a4993ca5
-―->527b7c667dd2
Removing intermediate container f536a4993ca5
Successfully built 527b7c667dd2
Successfully tagged com.waylau.spring.cloud/hello-world-docker:latest
SECURITY WARNING: You are building a Docker image from Windows against
a non-Windows Docker host. All files and directories added to build
context will have '-rWxr-Xr-x' permissions. It is recommended to double
check and reset permissions for sensitive files and directories.
:docker(Thread[Task worker,5,main]) completed.Took 15 mins 24.218
secs.
BUILD SUCCESSFUL in 15m 26s
9actionable tasks: 3 executed,6 up-to-date
Stoppedo worker daemon(s).
構建成功,可以在控制臺看到如上信息。因篇幅有限,這里省去大部分內容。
4.運行image
在構建Docker image完成之后,使用Docker來運行該image。
docker run -p 8080:8080 -t com.waylau.spring.cloud/hello-world-docker圖11-3展示了運行image的過程。
5.訪問應用
image運行成功后,就能在瀏覽器訪問http:/localhost:8080/hello,應能看到“Hello World! Wel-come to visit waylau.com!”字樣的內容。
6.關閉容器
可以先通過docker ps命令來查看正在運行的容器的ID,而后可以執行docker stop命令來關閉容器。命令如下。
C:UserslAdministrator>docker ps
CONTAINER ID IMAGE COMMAND
CREATED STATUS PORTS NAMES
7dde27af2b7b com.waylau.spring.cloud/hello-world-docker "java
0.0.0.0:8080-
-Djava.secur..." 4 minutes ago Up 4 minutes
>8080/tcpxenodochial_heyrovsky
C:lUsersAdministrator>docker stop 7dde27af2b7b7dde27af2b7b
Docker發布微服務
當我們的微服務包裝成為Docker的image之后,就能進行分發了。Docker Hub是專門用于托管image的云服務。用戶可以將自己的image推送到Docker Hub上,以方面其他人下載。
Docker展望
雖然本文只是挑選了一個最簡單的Spring Boot微服務作為例子,但是可以完整呈現如何使用Docker構建、運行、發布一個微服務應用的整個過程。讀者可以舉一反三,將天氣預報系統中的其他微服務實例做相應的操作,實現天氣預報系統的容器化改造。為節約篇幅,本文不再對這個改造做詳細的描述。
源碼
本節示例所涉及的源碼見hello-world-docker。