案例一:
cat Dockerfile
FROM centos:7
MAINTAINER wukong2222
# 把宿主机当前上下文的readme.txt拷贝到容器/usr/local/路径下
# 并把readme.txt文件重命名cincontainer.txt文件
COPY readme.txt /usr/local/cincontainer.txt
# 把宿主机当前上下文的(也就是当前目录)java与tomcat安装包添加到容器中
ADD apache-tomcat-9.0.76.tar.gz /usr/local/
ADD jdk-8u11-linux-x64.tar.gz /usr/local/
# 安装vim编辑器
RUN yum -y install vim
# 设置工作访问时候的MORKDIR路径,登录DE 落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
# 配置java与tomcat环境变量
# 配置java环境
ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar # 通过冒号隔开
# 配置tomcat环境
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.76
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.76
# 把上面配置的环境放入到PATH环境变量中
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
# 容器运行时监听的端口(暴露端口)
EXPOSE 8080
# 启动时运行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.44/bin/startup.sh"]
# CMD ["/usr/local/apache-tomcat-9.0.44/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.76/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.76/bin/logs/catalina.out
# && 表示拼接下一条命令,可以无线的拼接。
[root@k8s-master testimages-tomcat]#
docker images
docker build -t tomcat9:v1.2.1 .
docker run -p 9091:8080 --name tomcat20230706-8 -v /opt/testimages-tomcat/test2:/usr/local/apache-tomcat-9.0.76/webapps/test -v /opt/testimages-tomcat/tomcatlog2:/usr/local/apache-tomc
at-9.0.76/logs --privileged=true -d tomcat9:v1.2.1 sh -c "/usr/local/apache-tomcat-9.0.76/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.76/logs/catalina.out"
案例二:
maven打包一个测试jar : DockerTest-0.0.1-SNAPSHOT.jar
- pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.13</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.xhl</groupId>
<artifactId>DockerTest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>DockerTest</name>
<description>DockerTest</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
- application.properties文件
logging.file.path=log
demo.name = hello.01
- logback-spring.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<springProfile name="dev">
<pattern>%d{yyyy-MM-dd-HH:mm:ss E} %level [%thread]-%class[%line]: %msg%n</pattern>
</springProfile>
<springProfile name="!dev">
<pattern>%d{yyyy-MM-dd-HH:mm:ss E} %level [%thread]-%class[%line]: %msg%n</pattern>
</springProfile>
<!--⽇志的编码格式-->
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- <!–这个就表示的是要把 ⽇志输出到⽂件(FileAppender)–>-->
<!-- <appender name="file" class="ch.qos.logback.core.FileAppender">-->
<!-- <file>D:/log/output.log</file>-->
<!-- <!–设置⽇志是否追加–>-->
<!-- <append>true</append>-->
<!-- <encoder>-->
<!-- <pattern>%d{yyyy-MM-dd-HH:mm:ss.SSS} %level [%thread]-%class:%line>>%msg%n</pattern>-->
<!-- <charset>UTF-8</charset>-->
<!-- </encoder>-->
<!-- <!–设置⽇志写⼊是否线程安全–>-->
<!-- <prudent>false</prudent>-->
<!-- </appender>-->
<appender name="timeFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--TimeBasedRollingPolicy 基于时间的滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- <fileNamePattern>e:/log/log-%d{yyyy-MM-dd-HH}.log</fileNamePattern>-->
<fileNamePattern>log/log-%d{yyyy-MM-dd-HH}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd-HH:mm:ss.SSS} %level [%thread]-%class:%line>>%msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- <appender name="fixedFile" class="ch.qos.logback.core.rolling.RollingFileAppender">-->
<!-- <file>d:/log/fixedFile.log</file>-->
<!-- <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">-->
<!-- <fileNamePattern>log/fixedFile%i.log</fileNamePattern>-->
<!-- <minIndex>1</minIndex>-->
<!-- <maxIndex>10</maxIndex>-->
<!-- </rollingPolicy>-->
<!-- <!–SizeBasedTriggeringPolicy–>-->
<!-- <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">-->
<!-- <maxFileSize>5MB</maxFileSize>-->
<!-- </triggeringPolicy>-->
<!-- <encoder>-->
<!-- <pattern>%d{yyyy-MM-dd-HH:mm:ss.SSS} %level [%thread]-%class:%line>>%msg%n</pattern>-->
<!-- <charset>UTF-8</charset>-->
<!-- </encoder>-->
<!-- </appender>-->
<root level="info">
<appender-ref ref="stdout" />
<appender-ref ref="timeFile"/>
</root>
</configuration>
- testController.java 测试使用文件
package com.xhl.dockertest.com.xhl.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class testController {
private Logger logger = LoggerFactory.getLogger(testController.class);
@Value("${demo.name}")
private String demoName;
@RequestMapping("/demo")
public String test(){
logger.info("调用/test/demo接口响应日志测试20230706");
System.out.println("调用/test/demo接口响应日志测试20230706"+"-----"+demoName);
return this.demoName;
}
}
- 补充
在jar包同级目录下创建config目录,目录下创建:
cat config/application.properties
demo.name = hello.02
可替换变量
创建Dockerfile
[root@k8s-master springboot-docker2]# cat Dockerfile
FROM openjdk:8
VOLUME /tmp20230706
COPY ./DockerTest-0.0.1-SNAPSHOT.jar DockerTest-0.0.1-SNAPSHOT.jar
RUN bash -c "touch /DockerTest-0.0.1-SNAPSHOT.jar"
# 声明时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
#声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务
EXPOSE 8080
ENTRYPOINT ["java","-jar","/DockerTest-0.0.1-SNAPSHOT.jar"]
[root@k8s-master springboot-docker2]#
docker build -t springboot-test-demo:v0.0.1 .
docker save -o springboot-test-demo.tar springboot-test-demo:v0.0.1
# 导出springboot-test-demo.tar
docker load -i springboot-test-demo.tar
# 导入镜像
[root@k8s-master springboot-docker2]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
springboot-test-demo v0.0.1 b448fd3c3938 17 hours ago 561MB
创建deployment.yaml和service.yaml
- cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: springboot-test-demo
name: springboot-test-demo-deploy20230706
spec:
replicas: 4
selector:
matchLabels:
app: springboot-test-demo
template:
metadata:
labels:
app: springboot-test-demo
spec:
containers:
- image: springboot-test-demo:v0.0.1
name: springboot-test-demo
- cat service.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: springboot-test-demo
name: svc-20230707
spec:
ports:
- port: 8080
protocol: TCP
targetPort: 8080
nodePort: 31091
selector:
app: springboot-test-demo
type: NodePort
查询pod,svc,deploy、rs
kubectl create -f deployment.yaml
kubectl create -f service.yaml
kubectl get deploy,pod -o wide
kubectl get svc -o wide
kubectl get rs -o wide
kubectl logs springboot-test-demo-deploy20230706-58fb5d7cc8-dp2mc -f
kubectl exec -it springboot-test-demo-deploy20230706-58fb5d7cc8-dhltp bash
访问http://173.0.205.121/test/demo 请求容器内测试jar服务