文章目录
1.docker命令解释
2.docker常用命令
3.进入容器内部命令
docker exec -it 容器名称 bash
4.docker目录卷
查看数据卷的详细信息:
docker volume inspect html
5.docker创建nginx容器
参考链接:docker创建nginx容器
6.Dockerfile
7.Dockerfile JDK镜像
8.自定义Dockerfile
9.docker部署java应用基本步骤
1.在Linux虚拟器中/home中新建demo文件夹
2.在moxbaterm中将打包好的java jar包:demo-demo.jar 进行上传到demo中
3.将Dockerfile文件上传到demo文件夹中,内容为:
# 基础镜像
# 11 表示jdk的版本是11
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]
4.执行下述命令,将docker-demo.jar以及jdk11打包成镜像
docker build -t docker-demo .
5.创建容器,映射端口
docker run -d --name dd -p 8080:8080 docker-demo
10.docker网络
11.查看容器的输出日志
docker logs -f 容器name
12.docker利用nginx部署前端项目
1.docker安装nginx
18080对应的是后台管理系统
18081对应的是用户移动端系统
docker run \
-p 18080:18080 \
-p 18081:18081 \
--name nginx \
--network heima \
-v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /home/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /home/nginx/log:/var/log/nginx \
-v /home/nginx/html:/usr/share/nginx/html \
-d nginx:latest
3.nginx.conf配置文件
/usr/share/nginx/html/backend:backend项目在虚拟机中的位置
proxy_pass http://dd:8080:dd表示后端项目在虚拟机中的名称
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
server {
listen 18080;
# 指定前端项目所在的位置
location / {
root /usr/share/nginx/html/backend;
rewrite /(.*) /$1 break;
proxy_pass http://dd:8080;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 18081;
# 指定前端项目所在的位置
location / {
root /usr/share/nginx/html/front;
rewrite /(.*) /$1 break;
proxy_pass http://dd:8080;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
4.两个location报错:相同的location要进行合并
location / {
root /usr/share/nginx/html/front;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location / {
rewrite /(.*) /$1 break;
proxy_pass http://dd:8080;
}
13.DockerCompose部署项目
1.java所用JDK:17
Dockerfile文件
# 基础镜像
FROM openjdk:17.0
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY reggie.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]
2.mysql:8.0.22
3.nginx最新版本
4.docker-compose文件
# 表示compose所用的语法为3.8版本
version: "3.8"
services:
mysql:
image: mysql:8.0.22
container_name: mysql
ports:
- "3306:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123456
volumes:
- "/home/mysql/cnf:/etc/mysql"
- "/home/mysql/data:/var/lib/mysql"
- "/home/mysql/log:/var/log"
- "/home/mysql/mysql-files:/var/lib/mysql-files"
networks:
- hm-net
dd:
build:
context: .
dockerfile: Dockerfile
container_name: dd
ports:
- "8080:8080"
networks:
- hm-net
depends_on:
- mysql
nginx:
image: nginx
container_name: nginx
ports:
- "18080:18080"
- "18081:18081"
volumes:
- "/home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf"
- "/home/nginx/conf/conf.d:/etc/nginx/conf.d"
- "/home/nginx/log:/var/log/nginx"
- "/home/nginx/html:/usr/share/nginx/html"
depends_on:
- dd
networks:
- hm-net
networks:
hm-net:
name: heima
14.部署命令
# -d表示所有容器都在后台运行
docker compose up -d
1.各个文件位置如下图所示,所有文件都在一个目录文件夹下
15.docker部署minio
1.docker部署minio命令
docker run -p 9000:9000 -p 9090:9090 \
--name minio \
-d --restart=always \
-e "MINIO_ACCESS_KEY=minioadmin" \
-e "MINIO_SECRET_KEY=minioadmin" \
-v /root/minio/data:/data \
minio/minio server \
/data --console-address ":9090" -address ":9000"
2.使用
依赖:
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.4.3</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.8.1</version>
</dependency>
(1)controller层
@ApiOperation("上传图片")
// consumes 复杂数据类型
// @RequestPart("filedata") 前端传过来的数据名称是filedata
// MultipartFile multipartFile 前端传过来的数据类型
@PostMapping(value = "/upload/coursefile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public UploadFileResultDto upload(@RequestPart("filedata") MultipartFile multipartFile) {
File minio = File.createTempFile("minio", ".temp");
filedata.transferTo(minio);
String absolutePath = minio.getAbsolutePath();
return null;
}
(2)service层
1. 配置yaml文件
minio:
endpoint: http://120.53.92.121:9000
accessKey: minioadmin
secretKey: minioadmin
bucket:
files: mediafiles
videofiles: video
2. 配置MinioClient类
@Configuration
public class MinioConfig {
@Value("${minio.endpoint}")
private String endpoint;
@Value("${minio.accessKey}")
private String accessKey;
@Value("${minio.secretKey}")
private String secretKey;
@Bean
public MinioClient minioClient() {
MinioClient minioClient =
MinioClient.builder()
.endpoint(endpoint)
.credentials(accessKey, secretKey)
.build();
return minioClient;
}
}
3. 上传核心方法
public UploadFileResultDto upload(Long companyId, UploadFileParamsDto uploadFileParamsDto, String localFilePath) {
// objectName
String date = getDate();
String md5 = getMd5(localFilePath);
// 获取文件的原始名称
String filename = uploadFileParamsDto.getFilename();
String substring = filename.substring(filename.lastIndexOf("."));
String mime = getMime(substring);
System.out.println(mime);
// 拼接日期+md值+后缀
String objectName = date + "/" + md5 + substring;
// 拼接路径
String url = "/" + bucket_mediafile + "/" + objectName;
boolean upload = upload(localFilePath, objectName, mime);
if (!upload) {
throw new XuechengException("上传文件失败!");
}
MediaFiles mediaFiles = mediaFilesMapper.selectById(md5);
if (mediaFiles == null) {
// 传入数据库
UploadFileResultDto uploadFileResultDto = new UploadFileResultDto();
uploadFileResultDto.setFilename(filename);
uploadFileResultDto.setId(md5);
uploadFileResultDto.setFileId(md5);
uploadFileResultDto.setFileType("001001");
uploadFileResultDto.setBucket(bucket_mediafile);
uploadFileResultDto.setFilePath(localFilePath);
uploadFileResultDto.setUrl(url);
uploadFileResultDto.setCreateDate(LocalDateTime.now());
uploadFileResultDto.setStatus("1");
uploadFileResultDto.setAuditStatus("002003");
uploadFileResultDto.setFileSize(uploadFileParamsDto.getFileSize());
// 执行插入操作
int insert = mediaFilesMapper.insert(uploadFileResultDto);
if (insert <= 0) {
return null;
}
return uploadFileResultDto;
}
return null;
}
3.1 获取日期
// 获取日期的核心方法
private String getDate() {
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
return simpleDateFormat.format(date);
}
3.2 获取md5
// 获取md5取值
private String getMd5(String absolutePath) {
try {
String s = DigestUtils.md5Hex(Files.newInputStream(new File(absolutePath).toPath()));
return s;
} catch (IOException e) {
log.error("获取md5取值没有找到相关文件");
throw new XuechengException("没有找到相关文件");
}
}
3.3 获取MIME类型
依赖:
<!--根据扩展名取mimetype-->
<dependency>
<groupId>com.j256.simplemagic</groupId>
<artifactId>simplemagic</artifactId>
<version>1.17</version>
</dependency>
// 获取mime类型
private String getMime(String extension) {
ContentInfo extensionMatch = ContentInfoUtil.findExtensionMatch(extension);
String mimeType = MediaType.APPLICATION_OCTET_STREAM_VALUE;
if (extensionMatch != null) {
mimeType = extensionMatch.getMimeType();
}
return mimeType;
}
3.4 上传文件操作
// 上传的核心方法
private boolean upload(String localFilePath, String objectName, String contentType) {
// 上传文件信息
try {
UploadObjectArgs testbucket = UploadObjectArgs.builder()
.bucket(bucket_mediafile)
.filename(localFilePath)
.object(objectName)
.contentType(contentType)
.build();
minioClient.uploadObject(testbucket);
return true;
} catch (IOException | ErrorResponseException | InsufficientDataException | InternalException |
InvalidKeyException | InvalidResponseException | NoSuchAlgorithmException | ServerException |
XmlParserException e) {
log.error("上传文件发生错误");
throw new XuechengException("上传文件发生错误");
}
}