docker命令

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("上传文件发生错误");

     }
 }

3. 上传遇到的问题

3.1 The field file exceeds its maximum permitted size of 1048576 bytes
  • 13
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Realistic-er

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值