SpringBoot21-springboot的数据访问-引入Docker

来源:互联网 发布:淘宝天猫店铺托管 编辑:程序博客网 时间:2024/06/01 08:19

       Spring Data项目是Spring用来解决数据访问问题的一揽子解决方案,Spring Data是一个伞形项目,包含了大量关系型数据库及非关系型数据库的数据访问解决方案。Spring Data使我们可以快速且简单地使用普通的数据访问技术及新的数据访问技术。Spring Data包含的子项目有:Spring Data JPA,Spring Data MongoDB,Spring Data Neo4j,Spring Data Redis,Spring Data Hadoop,Spring Data REST等。

      Spring Data为我们使用统一的API来对上述的数据存储技术进行数据访问操作提供了支持。这是Spring通过提供Spring Data Commons项目来实现的,它是上述各种Spring Data项目的依赖。Spring Data Commons让我们在使用关系型或非关系型数据访问技术时都使用基于Spring的统一标准,该标准包含CRUD(创建,获取,更新,删除),查询,排序和分页的相关操作。

      这里介绍下Spring Data Commons的一个重要概念:Spring Data Repository抽象。使用Spring Data Repository可以极大地减少数据访问层的代码。既然是数据访问操作的统一标准,那肯定定义了各种各样和数据访问相关的接口:

public interface Repository<T,ID extends Sericalizable>

上面的接口接受领域类(JPA为实体类)和领域类的id类型作为类型参数

它的子接口CrudRepository定义了和CRUD操作相关的内容,

CrudRepository的子接口PagingAndSortingRepository定义了与分页和排序操作相关的内容

不同的数据访问技术提供了不同的Repository,如Spring Data JPA有JpaRepository,Spring Data MongonDB有MongoRepository。

    spring Data项目还给我们提供了一个激动人心的功能,即可用根据属性名进行计算,删除,查询方法等操作。


一:引入Docker

    Docker这两年大受追捧,风光无二。Docker是一个轻量级容器技术,类型于虚拟机技术。Docker是直接运行在当前操作系统(Linux)之上,而不是运行在虚拟机中,但是也实现了虚拟机技术的资源隔离,性能远远高于虚拟机技术。

     Docker支持将软件编译成一个镜像(image),在这个镜像里做好对软件的各种配置,然后发布这个镜像,使用者可以运行这个镜像,运行中的镜像称之为容器container,容器的启动时非常快的,一把都是以秒为单位。这个有点象我们平时安装的ghost操心系统。

     目前各大主流云计算平台都支持Docker容器技术,包括阿里云,百度云平台等。

     这里的云计算平台一般指的是Paas(平台即服务),它是一个这样的云计算:平台提供了存储,数据库,网络,负载均衡,自动扩展等功能,你只需要将你的程序交给云计算平台就可以了。

1,Docker的安装

      因为Docker的运行原理是基于Linux的,所以Docker只能在Linux下运行。但是在开发测试的时候,Docker也是可以在Windows下运行的,运行原理是启动一个VirtualBox虚拟机,在此虚拟机里运行Docker。

1)Linux下安装

sudo yum update

sudo yum install docker

2)查看docker版本

docker -v

或者docker version


2,docker常用命令及参数

通常情况下docker的镜像都放置在docker官网的docker hub上地址是:https://registry.hub.docker.com

国外的访问网速比较慢,可以使用网易镜像中心的:https://c.163yun.com/hub#/m/home/

1)可以到网易镜像中心进行搜索也可以使用下面的命令进行搜索镜像

docker search 镜像名

比如搜索redis:docker search redis


2)镜像下载

下载进行通过下面的命令实现:

docker pull 镜像名

比如:docker pull hub.c.163.com/public/redis:2.8.4

docker pull hub.c.163.com/library/redis:latest

3)镜像列表

查看本地镜像列表命令:

docker images


4)镜像删除命令

删除某个镜像:

docker rmi image-id 

删除所有镜像命令:

docker rmi $(docker images -q)



3,docker容器命令

1)容器基本操作

    最简单的运行镜像为容器的命令如下:

    docker run --name container-name -d image-name

     运行一个容器只要通过docker run命令即可实现,其中,--name参数是为了容器取得名称;-d表示detached,意味着执行完这句命令后控制台将不会被阻碍,可继续输入命令操作;最后的image-name是要使用哪一个镜像来运行容器。


2)容器列表

通过下面的命令,查看运行中的容器列表,如下:

docker ps


这条命令会列出运行中的容器,其中CONTAINER ID是在启动的时候生成的ID;IMAGE是该容器使用的镜像;COMMAND是容器启动时调用的命令;CREATED是容器创建的时间;STATUS是当前容器的状态;PORTS是容器系统所使用的端口号,redis默认使用6379端口;NAMES是上面启动时给容器定义的名称。

   通过下列命令可查看运行和停止状态的容器:

docker ps -a



3)停止和启动容器

1,停止容器

停止容器通过下面的命令:

docker stop container-name/container-id


2,启动容器

启动容器通过下面的命令:

docker start container-name/container-id


3,端口映射

     docker容器中运行的软件所使用的端口,在本机和本机局域网是不能访问的,所以我们需要将docker容器的端口映射到当前主机的端口上,这样我们在本机和本机所在的局域网就能访问该软件了

    docker的端口映射是通过一个-p参数来实现的,我们以redis为例,映射容器的6379端口到本机的6378端口,命令如下:

     docker run -d -p 6378:6379 --name port-redis


4,删除容器

    删除单个容器,可通过下面的命令:

    docker rm container-id

    删除所有容器,可通过下面的命令:

    docker rm $(docker ps -a -q)


5,容器日志

      查看当前容器日志,可通过下面的命令:
docker logs container-name/container-id

     我们查看下上面的容器日志,如下:

    docker logs port-redis


6,登入容器

     运行中的容器其实是一个功能完备的linux操作系统,所以我们可以像常规的系统一样登入并访问容器。

     我们可以使用下面的命令,登入访问当前容器,登入后我们可以在容器中进行常规的linux系统操作命令,还可以使用exit命令退出。

docker exec -it container-id/cantainer-name bash


7,例子:

1)centos启动docker服务:service docker start

2)运行mysql镜像,并同步docker和机器的时间一致:

docker run --name jack_mysql -v /etc/localtime:/etc/localtime -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d hub.c.163.com/library/mysql


3)docker提交:

    docker commit -m='提交的信息' --author='提交人'   容器id   新镜像名/版本

4)查看容器启动日志:

docker logs 容器id

5)docker映射多个本地文件到docker中,以mysql为例:

docker run --name jack_mysql -v /etc/localtime:/etc/localtime -v /usr/local/jack/mysql:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -itd --privileged=true hub.c.163.com/library/mysql

     上面的命令是同步机器时间和docker的时间,并映射本地的一个文件到docker的/var/lib/mysql 文件中,把docker中msyql数据保存到本地,避免docker容器删除了,导致mysql数据丢失的问题

注意:可能文件没有权限查看docker启动日志出现:chown: changing ownership of '/var/lib/mysql/': Permission denied错误,所以需要加入:--privileged=true参数


6)查看容器的详细信息:

    docker inspect 容器id


7)解决spring boot项目java在docker里面获取时区不正确的问题

      centos6.8环境下(或其他linux系统下) java在docker里面获取到的时区不正确,获取到的时区是UTC,不是国内东八区的时区,Asia/Shanghai的时间,导致前端展示时间错误,相差了几个小时。

      解决:设置jdk读取时间文件 执行 echo "Asia/shanghai" > /etc/timezone 命令 替换掉该文件下的"Etc/UTC"改成Asia/shanghai,  jre是通过该配置文件读取本地时间的,如没有该文件,添加该文件(一定要注意自己的操作系统),cat  /etc/timezone 可见内容已被置为Asia/shanghai,好了,为以防万一,重新启动docker容器即可,此时LocaldateTime.now()已经获取正确.

     java.util.Calendar.getInstance().getTimeZone()获取的信息如下:

sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null]