目的
之前寫了一個mini-tcc的測試springboot,想到在自己的windows弄個docker試試,以前在centos上裝過docker,很久沒玩了。這次寫的這個過程基本上從網上查方法實現的,沒啥新意,本沒必要寫出來,不過在這個過程中也碰到一些坑,而且自己寫筆記記錄一遍印象深,所以寫一篇操作過程。
整體過程:你提交代碼到倉庫,如果是getlab,使用webhook自動觸發拉取,不是的話就配置cron表達式定時構建,jenkins拉取到代碼後,需要進行構建,測試,打包,一系列操作,這是最基本的,姑且認爲這是持續集成CI,然後需要將鏡像push到鏡像倉庫,然後遠程ssh執行k8s的sh腳本命令,刪除新建相關組件,從鏡像倉庫拉取鏡像,部署服務,這可以叫持續交付CD,整個過程你就提交了代碼,整體自動化,這可以算是持續部署,整體思路就是這樣
一、安裝 docker toolbox
window裝docker有兩個選擇,使用toolbox或者Docker for Windows。因爲本人家裏的電腦了10年曆史了,所以果斷找toolbox,這個要先裝一個linux虛擬機,其上再運行docker,差別不表網上很多。toolbox安裝後會安裝一個VirtualBox虛擬機,一個Kitematic,這是GUI管理docker的工具
安裝時從阿里鏡像找安裝包:
http://mirrors.aliyun.com/docker-toolbox/windows/
安裝後,桌面產生三個快捷方式
Docker Quickstart
Terminal:應該是快速啓動virtualBox,再虛擬一個default的linux,再安裝docker,返回一個shell可以操作。Kitematic (Alpha):Kitematic是一個 Docker GUI
工具,進去可以看到裏面加好的docker容器,可以看到控制檯。Oracle VM
VirtualBox:VirtualBox號稱是最強的免費虛擬機軟件,進去可以看到有一個default的linux虛擬機在運行。你可以增加自己的各種window,linux操作系統。
給當前用戶產生多個環境變量:DOCKER_HOST、DOCKER_MACHINE_NAME、DOCKER_CERT_PATH…
(用testContainer做測試也方便了,目前還是用的內置H2數據庫)
問題
運行Docker Quickstart Terminal後,一直提示要升級,網上查,把安裝路徑下的boot2docker.iso拷貝到C:\Users{window用戶}\.docker\machine\cache,就可以了。
運行後,可以使用docker-machine來管理docker,和在Docker Quickstart Terminal裏差不多,不過當前用戶不同。在命令行CMD中,輸入docker-machine ssh default,可以管理這個default裏的docker
Docker Quickstart Terminal用戶是windows當前用戶,~目錄是 /c/Users/{Acer},而沒有在etc/passwd中找到這個文件,也找不到docker用戶。
docker-machine進入default後,當前用戶是docker,可以找到其它的root之類的用戶,可以看到/c/這個本地掛載的目錄。
兩個都可以操作docker images/container,而且操作結果是一樣的,還是不太明白這兩個的關係。
給docker添加鏡像源配置,docker從哪個鏡像庫來上傳,下載docker鏡像。
sudo sed -i “s|EXTRA_ARGS=’|EXTRA_ARGS=’–registry-mirror={你的鏡像源地址} |g” /var/lib/boot2docker/profile
二、springboot應用處理
開始是使用maven插件:docker-maven-plugin
建文件:src/main/decker/Dockerfile
打包後,copy到windows桌面,因爲default默認掛載c/User 對應c:\Users,可以/usr/local中建一個文件夾,把jar與Dockerfile放在一起,再構建一個本地鏡像。
後來,使用更新的插件:dockerfile-maven-plugin,一次性打包到鏡像庫中。使用阿里雲的鏡像庫,事先建好,用戶密碼都設置好。
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<docker.image.prefix>mini-tcc</docker.image.prefix>
<dockerfile.maven.version>1.4.0</dockerfile.maven.version>
<docker.registry.name.prefix>registry.cn-hangzhou.aliyuncs.com/springtcc</docker.registry.name.prefix>
</properties>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>${dockerfile.maven.version}</version>
<dependencies>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>default</id>
<goals>
<goal>build</goal>
<goal>push</goal>
</goals>
</execution>
</executions>
<configuration>
<repository>${docker.registry.name.prefix}/${project.artifactId}</repository>
<tag>${project.version}</tag>
<username>{你自己的用戶名}</username>
<password>{你自己的密碼}</password>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
問題
在maven打包時,之前的Dockerfile放到pom同級別的根目錄中,但沒修改地址“ADD target/”,找不到jar文件。
maven goal:clean package -Dmaven.test.skip=true dockerfile:push
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD target/spring-boot-thymeleaf-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["JAVA","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]
其它
查看運行日誌:docker logs -f --tail=100 {vigorous_hermann} container的名字,這裏沒有用 -v 映射主機目錄,只在控制檯輸出。
三、總結
運行鏡像,看到之前測試mini_tcc的日誌。
docker@default:/$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c423234453d5 docker2 "java -Djava.securit…" 19 hours ago Exited (143) About an hour ago vigorous_hermann
docker@default:/$ docker start vigorous_hermann
vigorous_hermann
docker@default:/$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c423234453d5 docker2 "java -Djava.securit…" 19 hours ago Up 5 seconds 0.0.0.0:80->8080/tcp vigorous_hermann
docker@default:/$ docker logs -f --tail=100 vigorous_hermann
at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1436)
Caused by: org.h2.jdbc.JdbcSQLException: Value too long for column "ID CHAR(20) NOT NULL": "'7777788888999999999999' (22)"; SQL statement:
insert into staff (age, name, id) values (?, ?, ?) [22001-196]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
開始本地DB非事務...
Hibernate: select staffbo0_.id as id1_0_0_, staffbo0_.age as age2_0_0_, staffbo0_.name as name3_0_0_ from staff staffbo0_ where staffbo0_.id=?
Hibernate: insert into staff (age, name, id) values (?, ?, ?)
開始遠程TCC...
Eat book...!
[bookEat] return value:null
house book...!
[bookHouse] return value:HS100083
plane booked!
[bookPlane] return value:null
【正常,需確認數】3
Eat confirm...!
house confirm...!HS100083
plane confirmed!
【threadLocal removed!】
四、後續k8s
標準方式還是jenkins,由gitlab源碼觸發hook,自動構建,產生鏡像,再調用k8s腳本完成部署
- jenkins中添加ssh服務器,即安裝k8s的服務器,ssh登錄並執行下面的腳本
- cd /data/script && sh service_start.sh myservice-docker
- /data/script/目錄下創建service_start.sh腳本如下:
#!/bin/bash
export service_name=$1
sleep_second=3
echo 'kubectl delete rc ${service_name}'
kubectl delete rc ${service_name}
echo 'kubectl delete service ${service_name}'
kubectl delete service ${service_name}
echo 'kubectl delete pods -l app=${service_name}'
kubectl delete pods -l app=${service_name}
sleep ${sleep_second}
echo 'create rc'
kubectl create -f /data/${service_name}-rc.yaml
echo 'create service'
kubectl create -f /data/${service_name}-svc.yaml
參考:
https://www.cnblogs.com/java-zhao/p/6065268.html