重要提示:學(xué)習(xí)本文之前需要提前了解docker容器相關(guān)的知識,了解和熟練運用常用的docker操作命令,如果已經(jīng)了解了docker容器相關(guān)的知識那我們就開搞吧!
以下是完成標題所述功能的大致步驟:
搭建docker鏡像倉庫
修改Spring Boot 配置文件添加docker倉庫配置,打包,上傳至docker 鏡像倉庫
從自己搭的docker鏡像倉庫拉取上傳的鏡像文件并運行
Step1 搭建docker鏡像私有倉庫
搭建docker鏡像倉庫我們需要依賴docker-registry工具 ,docker-registry是官方提供的工具,可以用于構(gòu)建私有的鏡像倉庫。本文內(nèi)容基于 docker-registry v2.x 版本 官方地址:https://docs.docker.com/registry/
1.拉取registry 鏡像文件
2.啟動鏡像
$ docker run -d \
-p 5000:5000 \
-v /opt/data/registry:/var/lib/registry \
registry
-d:守護線程啟動
-p:端口映射 宿主機的端口:容器的端口
-v:數(shù)據(jù)卷把容器內(nèi)的地址目錄映射到宿主機中/opt/data/registry就是宿主機中鏡像私有倉庫存放鏡像的位置
registry 就是鏡像名
3.配置daemon.json文件加入,倉庫配置
vim /etc/docker/daemon.json
添加配置如下:
{
"registry-mirrors": [
"https://registry.docker-cn.com"
],
"insecure-registries": [
"yourip:5000"
]
}
在原來的daemon.json 文件添加 insecure-registries 節(jié)點配置,yourip :填寫你的虛擬機ip, 保存退出 重新加載配置文件和重新啟動docker
systemctl daemon-reload
systemctl restart docker
4.測試把鏡像上傳到自己的鏡像倉庫,我們標記一個鏡像然后上傳的倉庫 使用 docker tag 命令:docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]
docker tag ubuntu:latest 127.0.0.1:5000/ubuntu:latest
(這里測試上傳的鏡像不必和文中相同,你可以pull 一個 tomcat 鏡像然后上傳即可) 此時會生成一個標記的鏡像
docker image ls
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu latest ba5877dc9bec 6 weeks ago 192.7 MB
127.0.0.1:5000/ubuntu:latest latest ba5877dc9bec 6 weeks ago 192.7 MB
push 到私有倉庫
docker push 127.0.0.1:5000/ubuntu:latest
查看私有倉庫的鏡像(其實可以去啟動倉庫時掛載的目錄下看,本文可以到宿主機 /opt/data/registry 目錄下查看了上傳的鏡像文件)
curl 127.0.0.1:5000/v2/_catalog
把私有倉庫的鏡像pull 下來
docker pull 127.0.0.1:5000/ubuntu:latest
pull 下來沒問題那就說明鏡像倉庫已經(jīng)搭建好了
Step 2 修改SpringBoot 配置文件添加docker倉庫配置,打包,上傳至docker 鏡像倉庫
在配置SpringBoot項目之前,還需要對docker 容器做一些配置,才能把jar包上傳到倉庫
開啟docker遠程api,修改文件,
vim /lib/systemd/system/docker.service
原來ExecStart :ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
添加**-H tcp://0.0.0.0:2375**
修改后:ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H fd:// --containerd=/run/containerd/containerd.sock
(如果你使用的是阿里云服務(wù)器記得去出入規(guī)則那里打開2375這個端口哦!)
保存退出,重新加載配置和啟動docker
systemctl daemon-reload
systemctl restart docker
查看配置是否成功,
輸出如下就是配置成功:
Client:
Debug Mode: false
Server:
Containers: 5
Running: 1
Paused: 0
Stopped: 4
Images: 6
Server Version: 19.03.3
Storage Driver: overlay2
.......
配置springboot 項目,pom文件添加打包配置如下
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.1.0</version>
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<imageName>jenkins_test/${project.artifactId}:${project.version}</imageName>
<dockerHost>http://yourip:2375</dockerHost>
<baseImage>java:8</baseImage>
<entryPoint>["java", "-jar","/${project.build.finalName}.jar"]
</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
- executions.execution.phase:此處配置了在maven打包應(yīng)用時構(gòu)建docker鏡像;
- imageName:用于指定鏡像名稱,jenkins_test是倉庫名稱,{project.version}為鏡像版本號;
- dockerHost:打包后上傳到的docker服務(wù)器地址;
- baseImage:該應(yīng)用所依賴的基礎(chǔ)鏡像,此處為java;
- entryPoint:docker容器啟動時執(zhí)行的命令;
- resources.resource.targetPath:將打包后的資源文件復(fù)制到該目錄;
- resources.resource.directory:需要復(fù)制的文件所在目錄,maven打包的應(yīng)用jar包保存在target目錄下面;
- resources.resource.include:需要復(fù)制的文件,打包好的應(yīng)用jar包。
配置好以上內(nèi)容后就可以打包了,(正常的springboot maven 打包,或者idea mavenproject install 即可)
打包成功完成后,回到docker容器 查看鏡像倉庫
curl 127.0.0.1:5000/v2/_catalog
確認存在之后將上傳的鏡像拉取下來,拉取成功后查看鏡像列表
顯示如圖:
這樣就說明這一套操作成功了 ,首次打包可能比較慢 因為docker 要拉去一下 java :8 基礎(chǔ)鏡像
我們來啟動一下這個鏡像
docker run -p 8080:8080 imageid
-p:端口映射
啟動成功如圖:
因為springboot 項目的application.yml文件中配置的server.port 為8080.啟動的時候需要映射 8080:8080 第一個8080 是宿柱機的端口 第二個8080 是容器的端口
到此本文的所需要實現(xiàn)的都已經(jīng)實現(xiàn)了,繼續(xù)閱讀有彩蛋哦?。。?!
在springboot 項目中有一個日志配置,如下
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定義日志文件的存儲地址 勿在 LogBack 的配置中使用相對路徑-->
<property name="LOG_HOME" value="/home/logs" />
<!-- 控制臺輸出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件輸出的文件名-->
<FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天數(shù)-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- 日志輸出級別 -->
<root level="info">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
</configuration>
我們要注意這個節(jié)點配置的logs 文件的保存地址
如果按照傳統(tǒng)的jar包部署方式,日志文件應(yīng)該就在宿主機的 /home/logs 里面了但是現(xiàn)在我們發(fā)現(xiàn)都沒有這個目錄了,那問題出現(xiàn)在哪?日志文件輸出到哪了??我們進入啟動的springboot容器試一試,以交互形式進入一個已經(jīng)在運行的容器內(nèi)部
docker exec -it containerid bash
我們就看到里面有一個 home目錄,依次進入目錄我們會發(fā)現(xiàn)日志文件在這里了!
思考,我們前面不是使用到了數(shù)據(jù)卷的命令嘛,是否可以把容器內(nèi)的路徑映射到虛擬機上?試試吧!停掉啟動的容器,(我們直接刪除吧)
docker stop containerid
docker rm containerid
重新啟動容器
docker run -d -p 8080:8080 -v /home/logs:/home/logs imageid
這次我們命令加了一個 -d 意思是守護線程啟動 (后臺運行) 使用如下命令 查看啟動的容器日志
docker logs -f containerID
可以看到,啟動成功了,那么 按理說 locback.xml 會在我們映射的宿主機的 /home/logs 目錄下輸出我們的日志文件,我們?nèi)タ纯?輸入一系列命令,可以看到日志文件真的在這里了!
到此這篇關(guān)于Spring Boot 打包上傳Docker 倉庫的詳細步驟的文章就介紹到這了,更多相關(guān)Spring Boot 打包上傳內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!