复习

  • nginx
    • /etc/nginx/nginx.conf
    • /var/log/nginx/error.log access.log
    • 静态资源托管
    • 反向代理: 在服务端的代理:隐藏内部结构;提供高性能的http服务,提供出错提示
      • proxy_pass
    • 负载均衡:将请求均衡的分发给后端服务器
      • upsteam xxx_cluster{}
      • proxy_pass http://xxx_cluster
      • 策略
        • 轮询: 按顺序调用后端服务器,每个服务器被调用的频率是均等的
        • 加权轮询: 按顺序调用后端服务器,每个服务器被调用的频率根据权重来分配
        • 随机:随机分配
        • IP Hash:对来源IP进行hash计算,根据结果分配到指定服务器,理论上一个IP固定分配到同一台服务器
  • docker
    • docker vs vm虚拟机区别
      • vm: 内部包含一个完整地操作系统,体积大,一般若干个G
      • docker:
        • 复用宿主机的操作系统,体积小,速度快,效率高,一般几十M
        • 资源隔离:linux的namespace机制,docker容器是进程级别
    • docker基本概念
      • 容器:container,程序,从镜像生成的一个实例,在进程中运行
      • 镜像: 文件,容器的模板,类似于Java类与Java对象中的Java类
      • 仓库 registry: 存储镜像文件,便于分发
      • docker-daemon
      • docker-client

2021年7月1日 Linux3 - 图12021年7月1日 Linux3 - 图2

  • 命令
    • 镜像
      • 查看 docker image ls <=> docker images;
        • docker images -q 只输出id
        • docker images -q | xargs docker image rm
      • 查看信息 docker inspect 查看镜像的详细信息
      • 拉取 docker image pull <=> docker pull 从仓库拉取镜像
      • 推送 docker image push <=> docker push 向仓库推送镜像
      • 删除 docker image rm
    • 容器
      • 查看容器 docker container ls <=> docker ps -aq
      • 创建容器 docker container create <=> docker create
      • 启动容器 docker container start <=> docker start {容器ID或名字}
      • 进入容器 docker exec -it {容器ID或名字} /bin/bash 进入容器并执行一个命令
      • 运行容器 docker container run <=> docker run {镜像名字:tag} 每次新建
        • 没有镜像,拉镜像 > 创建容器 > 启动容器
        • 选项
          • -p 端口映射 {宿主机端口}:{容器端口}
          • -i 保持住标准输出
          • -t 分配一个虚拟TTY,终端
          • -d 在后台运行
          • -v 挂载数据卷。将宿主机的文件或者文件夹映射到容器中 {宿主机的文件夹}:{容器的文件夹}
          • --name 取名字
          • -e 环境变量,向mysql容器传递一个root用户密码

image.png
容器是对于环境的封装;隐藏细节;开放接口

  1. - -v 数据卷
  2. - -p 端口映射
  3. - -e 环境变量 mysql容器需要配置,其他容器的一些功能开关
  4. - ...

jdk:
docker run —name=jdk openjdk
mysql:
docker run —name=mysql5 -p 3307:3306 -d -e MYSQL_ROOT_PASSWORD=root123 mysql:5
nginx:
docker run —name=nginx -p 81:80 -d -v ~/html:/usr/share/nginx/html nginx

image.png
docker cp 拷贝 宿主机到容器

docker cp ./a.txt nginx:/tmp/
docker cp 宿主机文件位置 容器名:容器路径
image.png

容器使用注意事项

  1. 尽量让一个容器做一件事情,或启动一个服务。
  2. 尽量使用挂载的方式将数据文件挂载到容器中,容器里面尽量不要保存数据。
  3. 尽量让容器按照Docker化的要求来使用容器,而不是安装一个虚拟机。
  4. 尽量不使用交互模式来直接操作容器,而是在宿主机上执行命令,或者使用Docker File。
  5. 只要能解决问题,高效地解决问题,无论怎么用,都行。

DockerFile

自行构建镜像
构建一个spring-boot项目的镜像 simple:latest
docker run -d -p 8080:8080 simple 启动spring-boot,运行,成功,直接访问
显然,运行springboot需要基于jdk

docker镜像是分层的
2021年7月1日 Linux3 - 图6

Dockerfile是一个构建镜像的脚本文件
docker执行dockerfile后,根据指令,构建出一个镜像
dockfile 本身有自己的指令集

  1. # Dockerfile
  2. # 基础镜像
  3. FROM openjdk:8-jdk-alpine
  4. # 设置工作目录
  5. WORKDIR /tmp
  6. # 将jar文件拷贝到镜像中
  7. ADD *.jar app.jar
  8. # 运行时设置JAVA环境参数
  9. ENV JAVA_OPTS="-Duser.timezone=Asia/Shanghai"
  10. # 端口暴露(推荐不暴露端口,在运行容器时才对端口进行绑定)
  11. # EXPOSE 9702
  12. #ENTRYPOINT不支持环境变量展开,specify spring.profiles.active
  13. ENTRYPOINT ["java", "-Duser.timezone=Asia/Shanghai -Dspring.profiles.active=docker", "-jar", "/tmp/app.jar"]

dockerfile存在target所在的目录

  1. 将项目打包 mvn clean package -Dmaven.test.skip=true
  2. 将jar包与dockerfile 上传到虚拟机的一个文件夹下
  3. 使用命令 docker build -t simple:latest . 构建镜像 ,注意末尾的 .
  4. docker images查看
  5. docker run 运行 ,绑定端口

mvn spring-boot:build-image

docker网络

docker image xxx
container xxx
volume xxx
network xxx
docker network

  • create 创建网络
  • connect 将容器加入到网络
  • rm 删除网络
  • ls 列出网络
  • inspect 查看网络的详细信息

实验:

  1. 启动一个名为mysql5的容器
  2. 将spring-boot项目封装成docker镜像,运行容器
    1. 将数据库地址的主机名改为 mysql5 url: jdbc:mysql://mysql5:3306/edu_56
    2. 封装镜像,运行,会失败
  3. 创建一个docker网络
  4. 将msyql5 和 项目加入同一个网络,项目通过网络可以访问到mysql5
    1. # 创建网络
    2. docker network create app-net
    3. # 查看网络列表
    4. docker network ls
    5. # 将mysql5容器加入到app-net网络中
    6. docker network connect app-net mysql5
    7. # 查看app-net的详情
    8. docker network inspect app-net
    9. # 将myapp容器加入到app-net网络中
    10. docker network connect app-net myapp
    11. # 查看日志 -f 跟随
    12. docker logs -f myapp
    13. # 测试是否连接成功
    14. curl localhost:8082/students

总结部署

前端脚手架项目部署:

  • npm run build 构建,成品在dist目录下,都成为了静态资源
  • 使用nginx进行静态资源托管

部署的配置问题

  • 环境
    • 开发环境: 本机mysql
    • 测试环境
    • 联调环境
    • 预发布环境
    • 生产环境
  • spring.profiles.active 环境配置

1)开发环境,通过运行配置设置profile
image.png
2)生产环境,通过环境变量设置profile,设置成prod
修改环境变量 /etc/profile ,修改完成记住source

  1. export SPRING_PROFILES_ACTIVE=prod

3)其他方式

  1. java -jar -Dspring.profiles.active=dev simple-0.0.1-SNAPSHOT.jar

不同环境变量对应的配置文件 为 application-{xxx}.yaml

docker容器部署之后,网页上的ajax发请求,地址写谁的地址?
image.png

redis

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。

  1. 存储使用内存,快
  2. 用作 缓存、数据库
  3. 数据结构
    1. string 字符串,对数值可以进行计算
    2. hash kv形式的存储,类似于Java中的Map
    3. list 列表
    4. set 集合
    5. sorted set 有序集合
    6. bitmap 位图
    7. hyperloglog
    8. geospatial 地理空间
  4. 副本 、lua脚本、持久化、LRU、事务
  5. Redis哨兵提供高可用
  6. Cluster提供了自动分区

centos安装

  1. 安装 epel-release
  2. yum install -y redis
  3. systemctl start redis

    windows安装

简单命令

k-v形式
k 字符串
v 是各种类型 ( string, hash ,bitmap,hyerloglogs)
2021年7月1日 Linux3 - 图9

Key操作

序号 命令及描述
1 DEL key
该命令用于在 key 存在时删除 key。
2 DUMP key
序列化给定 key ,并返回被序列化的值。
3 EXISTS key
检查给定 key 是否存在。
4 EXPIRE key
seconds 为给定 key 设置过期时间,以秒计。
5 EXPIREAT key timestamp
EXPIREAT 的作用和 EXPIRE 类似,都用于为 key 设置过期时间。 不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp)。
6 PEXPIRE key milliseconds
设置 key 的过期时间以毫秒计。
7 PEXPIREAT key milliseconds-timestamp
设置 key 过期时间的时间戳(unix timestamp) 以毫秒计
8 KEYS pattern
查找所有符合给定模式( pattern)的 key 。
9 MOVE key db
将当前数据库的 key 移动到给定的数据库 db 当中。
10 PERSIST key
移除 key 的过期时间,key 将持久保持。
11 PTTL key
以毫秒为单位返回 key 的剩余的过期时间。
12 TTL key
以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。
13 RANDOMKEY
从当前数据库中随机返回一个 key 。
14 RENAME key newkey
修改 key 的名称
15 RENAMENX key newkey
仅当 newkey 不存在时,将 key 改名为 newkey 。
16 TYPE key
返回 key 所储存的值的类型。
  1. # 增
  2. set k v ex 过期时间(秒) px 过期时间(毫秒)
  3. # 删
  4. del k
  5. # 改
  6. rename k newk
  7. # 过期
  8. expire k secs 设置过期时间(秒)
  9. pexpire k millis 设置过期时间(毫秒)
  10. persist k 取消过期时间
  11. # 查
  12. ttl / pttl 剩余过期时间
  13. get k 查看内容
  14. type k 查看类型
  15. exists k 是否存在