[筆記]windows安裝docker toolbox後將springboot應用提交docker鏡像庫

目的

之前寫了一個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腳本完成部署

  1. jenkins中添加ssh服務器,即安裝k8s的服務器,ssh登錄並執行下面的腳本
  2. cd /data/script && sh service_start.sh myservice-docker
  3. /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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章