Doccker
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的Linux機器上,也可以實作虛拟化,容器是完全使用沙箱機制,互相之間不會有任何接口。
一個完整的Docker有以下幾個部分組成:
- DockerClient用戶端
- Docker Daemon守護程序
- Docker Image鏡像
- DockerContainer容器
docker安裝
ubuntu下的安裝。使用snap應該是最簡單的方法。
#安裝docker
sudo snap install docker
#移除docker
sudo snap remove docker
檢視snap的安裝清單
可以看到本次安裝的docker版本是18.06.1-ce
lgj@lgj-Lenovo-G470:~$ snap list docker
Name Version Rev Tracking Publisher Notes
docker 18.06.1-ce 384 stable canonical* -
測試docker是否安裝成功
lgj@lgj-Lenovo-G470:~$ docker version
Client:
Version: 18.06.1-ce
API version: 1.38
Go version: go1.10.4
Git commit: e68fc7a
Built: Tue May 7 17:57:34 2019
OS/Arch: linux/amd64
Experimental: false
Server:
Engine:
Version: 18.06.1-ce
API version: 1.38 (minimum version 1.12)
Go version: go1.10.4
Git commit: e68fc7a
Built: Tue May 7 17:57:34 2019
OS/Arch: linux/amd64
Experimental: false
docker常用指令
#檢視docker支援的所有指令
docker
#檢視docker指令的使用方式
docker images --help
docker ps --help
#檢視安裝的鏡像
docker images [OPTIONS] [REPOSITORY[:TAG]]
#檢視運作的容器
docker ps
#檢視所有的容器
docker ps -a
#删除鏡像
docker rmi -f [REPOSITORY[:TAG]]
#删除容器
docker rm [OPTIONS] CONTAINER [CONTAINER...]
更多指令參考官方指令文檔
dockerfile使用
docker的更多使用方法參考
<Docker開發實踐><Docker開發指南><沒什麼難的Docker入門與開發實戰><第一本DOCKER書>
Jenkins
Jenkins是一個獨立的開源軟體項目,是基于Java開發的一種持續內建工具,用于監控持續重複的工作,旨在提供一個開放易用的軟體平台,使軟體的持續內建變成可能。前身是Hudson是一個可擴充的持續內建引擎。可用于自動化各種任務,如建構,測試和部署軟體。Jenkins可以通過本機系統包Docker安裝,甚至可以通過安裝Java Runtime Environment的任何機器獨立運作。
安裝
下載下傳位址
選擇下載下傳war包

下載下傳之後直接運作即可,指定端口為8097,通路位址為http://localhost:8097
java -jar jenkins.war --httpPort=8097
運作後會在使用者目錄下生成.jenkins工作目錄。
首次登入需要使用者名和密碼
使用者名為:admin
密碼檢視 .jenkins/secrets/initialAdminPassword 檔案中。
lgj@lgj-Lenovo-G470:~$ cat .jenkins/secrets/initialAdminPassword
7d3bc703deb449debce0a25dfd3a00ad
配置
安裝git插件
系統管理-插件管理
配置jdk和maven
系統管理-全局工具配置
可以選擇本地或者自動安裝
jemkins更多使用方式參考官方文檔 <jenkins權威指南>
建立一個SpringBoot應用
隻有一個controller類
@RestController
@RequestMapping("/web")
public class WebController {
@RequestMapping("/demo")
public String demo(){
return new Random().nextInt(100)+"";
}
}
通路端口為:8452
server:
port: 8452
上傳到git,倉庫位址為https://github.com/lgjlife/web-demo
建構jenkins項目
首頁-建立任務-建構一個maven項目(項目名稱為:web-demo-docker)
建立成功後首頁可以看到項目清單
項目配置
點選項目名稱---配置---進入配置頁面
1.配置git倉庫
jenkins建構時會自動從git倉庫拉取項目檔案。
[email protected]:lgjlife/web-demo.git
注意url的寫法,寫錯會自動報錯。由于是從公共倉庫拉取,是以沒有進行認證配置。
本次擷取的是master分支。
2.配置觸發器
觸發器就是定義何種條件下jenkins開始建構項目
這裡選擇輪詢,*/1 * * * * 說明每隔一分鐘就進行一次建構,這裡隻有在git倉庫更新之後才起作用。也就是每分鐘會去檢測git倉庫源碼是否更新,不更新則不進行建構。
更多表達式的說明點選後面的?圖示檢視。
3.建構操作
這裡選擇運作兩個shell腳本,腳本後面進行說明
jenkins項目配置完成。
編寫Dockerfile檔案
注意dockerfile位于主工程目錄下。
POM檔案配置
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!-- 指定該Main Class為全局的唯一入口 -->
<mainClass>com.demo.web.WebApplication</mainClass>
<layout>ZIP</layout>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal><!--可以把依賴的包都打包到生成的Jar包中-->
</goals>
</execution>
</executions>
</plugin>
<!-- docker 插件配置-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.10</version>
<configuration>
<repository>lgj/webdemo</repository>
<tag>1.0</tag>
<buildArgs>
<JAR_FILE>/target/web-1.0.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
</plugins>
</build>
說明:
dockerfile-maven-plugin ,maven 的docker插件
<repository>lgj/webdemo</repository>:鏡像名稱
<tag>1.0</tag>:鏡像标簽
一個鏡像的完整辨別是:鏡像倉庫/鏡像名稱:鏡像标簽
<JAR_FILE>/target/web-1.0.jar</JAR_FILE>:建構時的傳入dockerfile的參數
dockerfile
#基于jdk8鏡像進行建構,建立的鏡像已經配置好java環境
FROM openjdk:8
#上述的pom中配置的JAR_FILE将會傳入到該參數
#也可以在這裡直接配置 ARG JAR_FILE=/target/web-1.0.jar
#用于配置spingboot應用maven打包生成的jar檔案
ARG JAR_FILE
#在鏡像中建立一個工作目錄
run mkdir /worker
#将jar檔案複制到工作目錄中
add ${JAR_FILE} /worker
#暴露鏡像的端口8452,其他端口不開放
expose 8452
#鏡像啟動時執行的指令,配置多條僅執行最後一條
#這裡配置啟動jar檔案: java -jar /worker/web-1.0.jar
entrypoint ["java","-jar","/worker/web-1.0.jar"]
建構腳本build.sh
用于根據dockerfile建立docker腳本
mvn clean
mvn package -DskipTests
docker rmi -f lgj/webdemo:1.0
mvn dockerfile:build
docker images
先使用mvn進行打包
再删除舊的鏡像,由于不能覆寫建立,是以需要删除再建立。
由于已經pom中已經配置docker插件,可以直接調用:mvn dockerfile:build 進行建構。
運作腳本run.sh
用于建立并運作docker容器
docker ps -a
docker stop webdemo-8452
docker rm -f webdemo-8452
docker run -d --name webdemo-8452 -p 8452:8452 lgj/webdemo:1.0
docker ps -a
和建立鏡像類似,運作之前必須先删除容器。
docker run 說明:
-d:以背景程序的方式運作。
--name :指定容器的名稱為 webdemo-8452
-p : 指定主機和容器的端口映射。docker是基于主機運作的,資料--》主機端口--》容器端口。是以需要配置端口映射。一般配置成一樣的。這裡隻需要通路springboot應用的8452,是以配置成8452.
lgj/webdemo:1.0: 鏡像名稱
所有檔案編寫完成後,重新pull到git倉庫。
jenkins建構
點選項目頁面的立即建構
可以看到下方的建構曆史。
點選進去檢視每次建構的具體情況。
點選控制台輸出,可以檢視建構過程的輸出
建構過程:
1.拉取遠端的git倉庫檔案到jenkins的工作目錄/home/lgj/.jenkins/workspace/web-demo-docker
2. 執行配置的相關指令和操作。
輸出 Finished: SUCCESS 則表示建構成功。
??? admin ??
??? ????? /home/lgj/.jenkins/workspace/web-demo-docker ?
No credentials specified
> git rev-parse --is-inside-work-tree # timeout=10
Fetching changes from the remote Git repository
> git config remote.origin.url [email protected]:lgjlife/web-demo.git # timeout=10
Fetching upstream changes from [email protected]:lgjlife/web-demo.git
> git --version # timeout=10
> git fetch --tags --force --progress [email protected]:lgjlife/web-demo.git +refs/heads/*:refs/remotes/origin/*
> git rev-parse refs/remotes/origin/master^{commit} # timeout=10
> git rev-parse refs/remotes/origin/origin/master^{commit} # timeout=10
Checking out Revision 074769c6e558772ddcaf133e92641995cbf3c7ef (refs/remotes/origin/master)
> git config core.sparsecheckout # timeout=10
> git checkout -f 074769c6e558772ddcaf133e92641995cbf3c7ef
Commit message: "docker images"
> git rev-list --no-walk 074769c6e558772ddcaf133e92641995cbf3c7ef # timeout=10
[web-demo-docker] $ /bin/sh -xe /tmp/jenkins5091262134747837972.sh
+ echo =======================================================================================
=======================================================================================
+ pwd
/home/lgj/.jenkins/workspace/web-demo-docker
+ ./build.sh
[[1;34mINFO[m] Scanning for projects...
[[1;34mINFO[m]
[[1;34mINFO[m] [1m------------------------------------------------------------------------[m
[[1;34mINFO[m] [1mBuilding web 1.0[m
[[1;34mINFO[m] [1m------------------------------------------------------------------------[m
[[1;34mINFO[m]
[[1;34mINFO[m] [1m--- [0;32mmaven-clean-plugin:3.1.0:clean[m [1m(default-clean)[m @ [36mweb[0;1m ---[m
[[1;34mINFO[m] Deleting /home/lgj/.jenkins/workspace/web-demo-docker/target
[[1;34mINFO[m] [1m------------------------------------------------------------------------[m
[[1;34mINFO[m] [1;32mBUILD SUCCESS[m
[[1;34mINFO[m] [1m------------------------------------------------------------------------[m
[[1;34mINFO[m] Total time: 2.595 s
[[1;34mINFO[m] Finished at: 2019-06-02T13:07:18+08:00
[[1;34mINFO[m] Final Memory: 12M/188M
[[1;34mINFO[m] [1m------------------------------------------------------------------------[m
[[1;34mINFO[m] Scanning for projects...
[[1;34mINFO[m]
[[1;34mINFO[m] [1m------------------------------------------------------------------------[m
[[1;34mINFO[m] [1mBuilding web 1.0[m
[[1;34mINFO[m] [1m------------------------------------------------------------------------[m
[[1;34mINFO[m]
[[1;34mINFO[m] [1m--- [0;32mmaven-resources-plugin:3.1.0:resources[m [1m(default-resources)[m @ [36mweb[0;1m ---[m
[[1;34mINFO[m] Using \'UTF-8\' encoding to copy filtered resources.
[[1;34mINFO[m] Copying 1 resource
[[1;34mINFO[m] Copying 1 resource
[[1;34mINFO[m]
[[1;34mINFO[m] [1m--- [0;32mmaven-compiler-plugin:3.8.0:compile[m [1m(default-compile)[m @ [36mweb[0;1m ---[m
[[1;34mINFO[m] Changes detected - recompiling the module!
[[1;34mINFO[m] Compiling 2 source files to /home/lgj/.jenkins/workspace/web-demo-docker/target/classes
[[1;34mINFO[m]
[[1;34mINFO[m] [1m--- [0;32mmaven-resources-plugin:3.1.0:testResources[m [1m(default-testResources)[m @ [36mweb[0;1m ---[m
[[1;34mINFO[m] Using \'UTF-8\' encoding to copy filtered resources.
[[1;34mINFO[m] skip non existing resourceDirectory /home/lgj/.jenkins/workspace/web-demo-docker/src/test/resources
[[1;34mINFO[m]
[[1;34mINFO[m] [1m--- [0;32mmaven-compiler-plugin:3.8.0:testCompile[m [1m(default-testCompile)[m @ [36mweb[0;1m ---[m
[[1;34mINFO[m] No sources to compile
[[1;34mINFO[m]
[[1;34mINFO[m] [1m--- [0;32mmaven-surefire-plugin:2.22.1:test[m [1m(default-test)[m @ [36mweb[0;1m ---[m
[[1;34mINFO[m] Tests are skipped.
[[1;34mINFO[m]
[[1;34mINFO[m] [1m--- [0;32mmaven-jar-plugin:3.1.0:jar[m [1m(default-jar)[m @ [36mweb[0;1m ---[m
[[1;34mINFO[m] Building jar: /home/lgj/.jenkins/workspace/web-demo-docker/target/web-1.0.jar
[[1;34mINFO[m]
[[1;34mINFO[m] [1m--- [0;32mspring-boot-maven-plugin:2.1.0.RELEASE:repackage[m [1m(repackage)[m @ [36mweb[0;1m ---[m
[[1;34mINFO[m] Layout: ZIP
[[1;34mINFO[m] Replacing main artifact /home/lgj/.jenkins/workspace/web-demo-docker/target/web-1.0.jar
[[1;34mINFO[m]
[[1;34mINFO[m] [1m--- [0;32mspring-boot-maven-plugin:2.1.0.RELEASE:repackage[m [1m(default)[m @ [36mweb[0;1m ---[m
[[1;34mINFO[m] Layout: ZIP
[[1;34mINFO[m] Replacing main artifact /home/lgj/.jenkins/workspace/web-demo-docker/target/web-1.0.jar
[[1;34mINFO[m] [1m------------------------------------------------------------------------[m
[[1;34mINFO[m] [1;32mBUILD SUCCESS[m
[[1;34mINFO[m] [1m------------------------------------------------------------------------[m
[[1;34mINFO[m] Total time: 9.671 s
[[1;34mINFO[m] Finished at: 2019-06-02T13:07:30+08:00
[[1;34mINFO[m] Final Memory: 32M/330M
[[1;34mINFO[m] [1m------------------------------------------------------------------------[m
Untagged: lgj/webdemo:1.0
[[1;34mINFO[m] Scanning for projects...
[[1;34mINFO[m]
[[1;34mINFO[m] [1m------------------------------------------------------------------------[m
[[1;34mINFO[m] [1mBuilding web 1.0[m
[[1;34mINFO[m] [1m------------------------------------------------------------------------[m
[[1;34mINFO[m]
[[1;34mINFO[m] [1m--- [0;32mdockerfile-maven-plugin:1.4.10:build[m [1m(default-cli)[m @ [36mweb[0;1m ---[m
[[1;34mINFO[m] dockerfile: null
[[1;34mINFO[m] contextDirectory: /home/lgj/.jenkins/workspace/web-demo-docker
[[1;34mINFO[m] Building Docker context /home/lgj/.jenkins/workspace/web-demo-docker
[[1;34mINFO[m] Path(dockerfile): null
[[1;34mINFO[m] Path(contextDirectory): /home/lgj/.jenkins/workspace/web-demo-docker
[[1;34mINFO[m]
[[1;34mINFO[m] Image will be built as lgj/webdemo:1.0
[[1;34mINFO[m]
[[1;34mINFO[m] Step 1/6 : FROM openjdk:8
[[1;34mINFO[m]
[[1;34mINFO[m] Pulling from library/openjdk
[[1;34mINFO[m] Digest: sha256:0e25c8428a56e32861fe996b528a107933155c98fb2a9998a4a4e9423aad734d
[[1;34mINFO[m] Status: Image is up to date for openjdk:8
[[1;34mINFO[m] ---> 4a0a42e87cf3
[[1;34mINFO[m] Step 2/6 : ARG JAR_FILE
[[1;34mINFO[m]
[[1;34mINFO[m] ---> Using cache
[[1;34mINFO[m] ---> dc2f959e4d9c
[[1;34mINFO[m] Step 3/6 : run mkdir /worker
[[1;34mINFO[m]
[[1;34mINFO[m] ---> Using cache
[[1;34mINFO[m] ---> 87e001b16580
[[1;34mINFO[m] Step 4/6 : add ${JAR_FILE} /worker
[[1;34mINFO[m]
[[1;34mINFO[m] ---> 7d6b791017fd
[[1;34mINFO[m] Step 5/6 : expose 8452
[[1;34mINFO[m]
[[1;34mINFO[m] ---> Running in f7989737ef59
[[1;34mINFO[m] Removing intermediate container f7989737ef59
[[1;34mINFO[m] ---> aa553eea45de
[[1;34mINFO[m] Step 6/6 : entrypoint ["java","-jar","/worker/web-1.0.jar"]
[[1;34mINFO[m]
[[1;34mINFO[m] ---> Running in 7133f5214111
[[1;34mINFO[m] Removing intermediate container 7133f5214111
[[1;34mINFO[m] ---> 10e0d3d344d6
[[1;34mINFO[m] Successfully built 10e0d3d344d6
[[1;34mINFO[m] Successfully tagged lgj/webdemo:1.0
[[1;34mINFO[m]
[[1;34mINFO[m] Detected build of image with id 10e0d3d344d6
[[1;34mINFO[m] Building jar: /home/lgj/.jenkins/workspace/web-demo-docker/target/web-1.0-docker-info.jar
[[1;34mINFO[m] Successfully built lgj/webdemo:1.0
[[1;34mINFO[m] [1m------------------------------------------------------------------------[m
[[1;34mINFO[m] [1;32mBUILD SUCCESS[m
[[1;34mINFO[m] [1m------------------------------------------------------------------------[m
[[1;34mINFO[m] Total time: 57.257 s
[[1;34mINFO[m] Finished at: 2019-06-02T13:08:31+08:00
[[1;34mINFO[m] Final Memory: 25M/362M
[[1;34mINFO[m] [1m------------------------------------------------------------------------[m
REPOSITORY TAG IMAGE ID CREATED SIZE
lgj/webdemo 1.0 10e0d3d344d6 2 seconds ago 504MB
<none> <none> 67b2eee0f0b6 2 hours ago 504MB
<none> <none> 88b1d5b63784 2 hours ago 504MB
<none> <none> e60203504301 2 hours ago 504MB
<none> <none> 11f593fd9537 2 hours ago 504MB
openjdk 8 4a0a42e87cf3 3 days ago 488MB
+ ./run.sh
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d1a4fdf8f230 67b2eee0f0b6 "java -jar /worker/w���" 2 hours ago Up 2 hours 0.0.0.0:8452->8452/tcp webdemo-8452
webdemo-8452
7fe8d8d9cdff88f8281e8b0f6c8ff5e010844dd40b82829f5952d589c6d183b2
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7fe8d8d9cdff lgj/webdemo:1.0 "java -jar /worker/w���" 2 seconds ago Up Less than a second 0.0.0.0:8452->8452/tcp webdemo-8452
Finished: SUCCESS
完成!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!