简单docker映像

技术头条:干货、简洁、多维全面。更多云计算精华知识尽在眼前,get要点、solve难题,统统不在话下!

作为云计算的当红明星Docker 来势汹汹,它就像一场森林大火,烧到了我们中间。因为工作的原因,每天都会和容器云打交道。但是,我发现经常会有些新加入的同事在理解Docker命令方面存在一些问题,尤其是在Docker 镜像底层的工作原理和容器与容器镜像的关系上。

通常情况下一项新的技术诞生时往往会伴随着较多的媒体宣传甚至炒作,且在推广产品的过程中往往会出现一些新的技术名词,让人感觉云里雾里。Docker 的诞生和推广正是在这种情况下进行的。

对于产品本身而言媒体的宣传和炒作可以帮助他们快速的在市场中进行推广,但是这种宣传和炒作也会导致很多用户很难看清被宣传产品的技术的本质,不利于用户对技术的掌握,更加不利于用户对产品的深度使用。

一般情况下只有真正理解了某门技术的原理才能真正掌握这一门技术,接下来才能去深入的使用这门技术。下面我们会由浅入深出的带大家了解下Docker 镜像及其相关技术的原理和本质。

容器 VS 容器镜像

在说Docker 镜像的原理知识之前,我们先看下docker 容器和docker 镜像的区别,因为这部分我们后面会涉及到。

简单说来,我们可以将Docker 镜像看成是Docker 容器的静态时,也可将Docker 容器看成是Docker镜像的运行时。

从Docker 的官方文档来看,Docker 容器的定义和 Docker 镜像的定义几乎是相同,Docker 容器和Docker 镜像的区别主要在于docker 容器多出了一个可写层。

容器中的进程就运行在这个可写层,这个可写层有两个状态,即运行态和退出态。当我们docker run 运行容器后,docker 容器就进入了运行态,当我们停止正在运行中的容器时,docker 容器就进入了退出态。

我们将容器从运行态转为退出态时,期间发生的变更都会写入到容器的文件系统中(需要注意的是,此处不是写入到了docker 镜像中),这方面的变化下文中我们还会再细说。

Docker 存储简介

简单说来Docker 镜像就是一组只读的目录,或者叫只读的 Docker 容器模板,镜像中含有一个Docker 容器运行所需要的文件系统,所以我们说Docker 镜像是启动一个Docker 容器的基础。

如果这样不是很好理解,我们可以通过一个图一起看下:

从图中可以看出除了最上面的一层为读写层之外,下面的其他的层都是只读的镜像层,并且除了最下面的一层外,其他的层都有会有一个指针指向自己下面的一层镜像。

虽然统一文件系统(union file system)技术将不同的镜像层整合成一个统一的文件系统,为构成一个完整容器镜像的层提供了一个统一的视角,隐藏了多个层的复杂性,对用户来说只存在一个文件系统,但图中的这些层并不是不能看到的,如果需要查看的话可以进入运行Docker的机器上进行查看,从这些层中可以看到Docker 内部实现的一些细节,接下来我们一起看下。

一般刚接触Docker 不久的话可能会不太清楚Docker 的存储方式是怎样的,并且可能也不太清楚Docker 容器的镜像到底存储在什么路径下,比较迷茫。

有些同学想了解下Docker 的镜像数据存储在什么位置,然后谷歌了下几篇博文,说是在/var/lib/docker 下有个aufs目录,结果在自己机器上进到这个路径后发现没有aufs相关的目录,然后以为是版本的问题,其实不然。

以Linux服务器为例,其实Docker 的容器镜像和容器本身的数据都存放在服务器的 /var/lib/docker/ 这个路径下。不过不同的linux发行版存储方式上有差别,比如,在ubuntu发行版上存储方式为AUFS,CentOS发行版上的存储方式为device mapper。

/var/lib/docker 路径下的信息在不同的阶段会有变化,从笔者个人经验来看,了解这几个阶段中新增的数据以及容器与镜像的存储结构的变化非常有利于我们对Docker容器以及Docker镜像的理解。

接下来我们一起看下Docker运行后、下载镜像后、运行容器后三个阶段中Docker 存储的变化。

环境信息:

系统发行版:CentOS7.2。

内核版本:3.10.0-327.36.1.el7.x86_64

Docker 版本:1.8

启动Docker后

在此我们假设大家已经安装好了Docker环境,具体安装的过程不再赘述。

# 启动Docker 服务

[root@influxdb ~]# systemctl start docker

# 查看/var/lib/docker路径下的文件结构

[root@localhost docker]# tree .

├── containers

├── devicemapper

│ ├── devicemapper

│ │ ├── data

│ │ └── metadata

│ └── metadata

│ ├── base

│ ├── deviceset-metadata

│ └── transaction-metadata

├── graph

├── linkgraph.db

├── repositories-devicemapper

├── tmp

├── trust

└── volumes

8 directories, 7 files

注:必须启动Docker 服务后查看,如果没有启动Docker 进程则路径/var/lib/docker 不存在。

前文中我们已经提到过,CentOS发行版中Docker 服务使用的存储方式为devicemapper,所以我们从前面tree命令的结果中可以看到出现了目录devicemapper。

有些同学可能会问什么是devicemapper?

太阳底下无新鲜事,devicemapper 并不是伴随着Docker 才出现的,早在linux2.6版本的内核时其实就已经引入了devicemapper,且当时是作为一个很重要的技术出现的。

简单说来devicemapper 就是Docker 服务的一个存储驱动,或者叫Docker 服务的存储后端。Devicemapper 其实是一个基于内核的框架,这个框架中对linux上很多的功能进行了增强,比如对linux上高级卷管理功能的增强。

Devicemapper 存储驱动将我们的每个docker镜像和docker容器都存在在自己的虚拟设备中,devicemapper的这些设备相当于我们常见的一般的写时复制快照设备的超配版本。通过上面的介绍,有些同学可能以为devicemapper 存储驱动是工作在块级别的,但是devicempper 实际是工作在文件级别的,也就是说devicemapper 存储驱动和写时复制操作都是直接操作块,而不是对文件进行操作。

以上是我们关于Docker 服务的devicemapper 存储驱动的一个简单的介绍,Docker 官方文档中提供了很多的有关Docker 存储驱动的介绍,感兴趣的同学可以自行查阅。

进一步的查看的话,可以看到路径/var/lib/docker/devicemapper下面有两个目录,分别为devicemapper和data,其中目录devicemapper 下存在两个名为data和metadata的文件,两个文件从名称即可看出一个是镜像数据的存储池,一个为镜像相关的元数据。接下去我们会逐个看下这个路径下的文件。

进入上面提到的目录metadata下,可以看到这个目录中已经存在三个文件,分别为:base、deviceset-metadata和transction-metadata,这三个文分别用来存放上文中我们提到的元数据的id、大小和uuid等信息。

[root@localhost metadata]# pwd

/var/lib/docker/devicemapper/metadata

[root@localhost metadata]# ls

base deviceset-metadata transaction-metadata

除了上面提到的几个目录,上文中tree的结果中还有几个目录,分别为:containers、devicemapper、graph、linkgraph.db、repositories-devicemapper、tmp、trust和volumes。这几个文件对于docker 的镜像存储来说都很重要,我们以文件repositories-devicemapper为例,看下这个文件对于镜像存储所起到的作用。

[root@localhost docker]# pwd

/var/lib/docker

[root@localhost docker]# ls

containers devicemapper graph linkgraph.db repositories-devicemapper tmp trust volumes

我们可以先看下repositories-devicemapper 这个文件中在当前的阶段中有什么:

root@localhost docker]# cat repositories-devicemapper

{“Repositories”:{}}[root@localhost docker]#

从上面cat的结果中我们不难看出,文件repositories-devicemapper 中其实记录的就是docker 镜像的属性信息,比如镜像名称、镜像标签、镜像的ID等信息,如果镜像刚好没有标签的话默认会以lastet作为标签。

以上是对Docker 服务运行后pull镜像之前/var/lib/docker 路径下数据的一个简单的解读,相信大家通过上面的描述已经对docker镜像有了一些更深入的认识。下面我们看下在我们pull 自己的第一个docker镜像之后路径/var/lib/docker 之下的数据会发生怎样的变化。

Pull 镜像后

在此我们以一个nginx镜像为例一起看下这个阶段的变化。

# pull 示例镜像

[root@localhost docker]# docker pull nginx

Using default tag: latest

latest: Pulling from library/nginx

22f3bf58cd09: Pull complete

ea2fc476f5f0: Pull complete

81d728438afe: Pull complete

303a6dec1190: Pull complete

d43816b44a22: Pull complete

dc02db50a25a: Pull complete

6f650a34b308: Pull complete

a634e96a9de9: Pull complete

72f3ebe1e4d7: Pull complete

c2c9e418b22c: Pull complete

Digest: sha256:a82bbaf63c445ee9b854d182254c62e34e6fa92f63d7b4fdf6cea7e76665e06e

Status: Downloaded newer image for nginx:latest

# 查看镜像是否已经在本地

[root@localhost docker]# docker images

REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE

nginx latest c2c9e418b22c 2 weeks ago 109.3 MB

[root@localhost docker]#

在此我们没有指定nginx镜像的tag,因此默认拉去了最新的版本。然后我们看下路径/var/lib/docker 下是否有变化:

[root@localhost docker]# tree .

.

├── containers

├── devicemapper

│ ├── devicemapper

│ │ ├── data

│ │ └── metadata

……

省略若干数据

……

│ │ ├── checksum

│ │ ├── json

│ │ ├── layersize

│ │ ├── tar-data.json.gz

│ │ └── v1Compatibility

│ ├── 303a6dec11900c97f5d7555d31adec02d2e5e4eaa1a77537e7a5ebd45bb7fcd2

│ │ ├── checksum

│ │ ├── json

│ │ ├── layersize

│ │ ├── tar-data.json.gz

│ │ └── v1Compatibility

│ ├── 6f650a34b3083c96cf8b7babc7a391227c0f78e0d07067071c46e31bd834de3a

│ │ ├── checksum

│ │ ├── json

│ │ ├── layersize

│ │ ├── tar-data.json.gz

│ │ └── v1Compatibility

│ ├── 72f3ebe1e4d793a50836d4e070c94ef7497c80111d178e867014981f64696a39

│ │ ├── checksum

│ │ ├── json

│ │ ├── layersize

│ │ ├── tar-data.json.gz

│ │ └── v1Compatibility

│ ├── 81d728438afe98602e2e692c20299ecf41b93173fb12351c1b59820b17fb16b9

│ │ ├── checksum

│ │ ├── json

│ │ ├── layersize

│ │ ├── tar-data.json.gz

│ │ └── v1Compatibility

│ ├── a634e96a9de9f1e280efaecdd43c7273ac43e109a42ab6c76ab2d2261c8cdc50

│ │ ├── checksum

│ │ ├── json

│ │ ├── layersize

│ │ ├── tar-data.json.gz

│ │ └── v1Compatibility

│ ├──

……

省略若干数据

……

│ ├── ea2fc476f5f055f9e44963987903ecfe0cb480b7e387d8b5cb64006832110afc

│ │ ├── checksum

│ │ ├── json

│ │ ├── layersize

│ │ ├── tar-data.json.gz

│ │ └── v1Compatibility

│ └── _tmp

├── linkgraph.db

├── repositories-devicemapper

├── tmp

├── trust

└── volumes

30 directories, 67 files

[root@localhost docker]#

从结尾的目录数和文件数也可以看出,在我们拉取镜像后/var/lib/docker 下多出了很多的文件(拉取镜像之前,只有8个目录,7个文件),下面我们一步步的分析。

如果这个时候看下路径/var/lib/docker下的文件的话,可以很容易的看到发生变化的主要是下面这三个文件:/var/lib/docker/devicemapper/metadata、/var/lib/docker/devicemapper/mnt以及/var/lib/docker/graph。我们先看下metadata这个文件:

从结果可以看出除了上一个阶段中已经有的base、deviceset-metadata等几个文件外,还多出了一些名字较长的文件,我们挨个看下这几个文件中的数据:

[root@localhost metadata]# cat base

{“device_id”:1,”size”:107374182400,”transaction_id”:1,”initialized”:true} [root@localhost metadata]# cat 22f3bf58cd0949b57df2dc161e7026a8cc77699b6a8be7d0e3085e252a5439c3

{“device_id”:2,”size”:107374182400,”transaction_id”:2,”initialized”:false}

[root@localhost metadata]# cat ea2fc476f5f055f9e44963987903ecfe0cb480b7e387d8b5cb64006832110afc

{“device_id”:3,”size”:107374182400,”transaction_id”:3,”initialized”:false}

[root@localhost metadata]# cat 81d728438afe98602e2e692c20299ecf41b93173fb12351c1b59820b17fb16b9

{“device_id”:4,”size”:107374182400,”transaction_id”:4,”initialized”:false} [root@localhost metadata]# cat d43816b44a2280148da8d9b6ce2f357bff9b2e59ef386181f36a4a433a9aad6c

{“device_id”:6,”size”:107374182400,”transaction_id”:6,”initialized”:false} [root@localhost metadata]# cat 303a6dec11900c97f5d7555d31adec02d2e5e4eaa1a77537e7a5ebd45bb7fcd2

{“device_id”:5,”size”:107374182400,”transaction_id”:5,”initialized”:false} [root@localhost metadata]# cat a634e96a9de9f1e280efaecdd43c7273ac43e109a42ab6c76ab2d2261c8cdc50

{“device_id”:9,”size”:107374182400,”transaction_id”:9,”initialized”:false} [root@localhost metadata]# cat dc02db50a25a87ca227492197721e97d19f1822701fe3ec73533a0811a6393a7

{“device_id”:7,”size”:107374182400,”transaction_id”:7,”initialized”:false} [root@localhost metadata]# cat 6f650a34b3083c96cf8b7babc7a391227c0f78e0d07067071c46e31bd834de3a

{“device_id”:8,”size”:107374182400,”transaction_id”:8,”initialized”:false} [root@localhost metadata]# cat 72f3ebe1e4d793a50836d4e070c94ef7497c80111d178e867014981f64696a39

{“device_id”:10,”size”:107374182400,”transaction_id”:10,”initialized”:false} [root@localhost metadata]# cat c2c9e418b22ca5a0b02ef0c2bd02c34ad792d1fc271e5580fdb3252979ccc092

{“device_id”:11,”size”:107374182400,”transaction_id”:11,”initialized”:false}

从上面的结果可以看出上面的几个文件中的device_id数值是按照顺序排列下来的,换句话说就是除了上一个阶段中已经存在的base文件,上面结果中其他的几个文件都是nginx镜像的中间镜像层,也就是我们经常执行的命令docker images –a 的结果中看到的构成当前镜像的各个镜像层。

接下来我们再看一个变化较大的文件/var/lib/docker/graph。

[root@localhost graph]# tree .

.

├── 22f3bf58cd0949b57df2dc161e7026a8cc77699b6a8be7d0e3085e252a5439c3

│ ├── checksum

│ ├── json

│ ├── layersize

│ ├── tar-data.json.gz

│ └── v1Compatibility

├── 303a6dec11900c97f5d7555d31adec02d2e5e4eaa1a77537e7a5ebd45bb7fcd2

│ ├── checksum

│ ├── json

│ ├── layersize

│ ├── tar-data.json.gz

│ └── v1Compatibility

├── 6f650a34b3083c96cf8b7babc7a391227c0f78e0d07067071c46e31bd834de3a

│ ├── checksum

│ ├── json

│ ├── layersize

│ ├── tar-data.json.gz

│ └── v1Compatibility

├── 72f3ebe1e4d793a50836d4e070c94ef7497c80111d178e867014981f64696a39

│ ├── checksum

│ ├── json

│ ├── layersize

│ ├── tar-data.json.gz

│ └── v1Compatibility

├── 81d728438afe98602e2e692c20299ecf41b93173fb12351c1b59820b17fb16b9

│ ├── checksum

│ ├── json

│ ├── layersize

│ ├── tar-data.json.gz

│ └── v1Compatibility

├── a634e96a9de9f1e280efaecdd43c7273ac43e109a42ab6c76ab2d2261c8cdc50

│ ├── checksum

│ ├── json

│ ├── layersize

│ ├── tar-data.json.gz

│ └── v1Compatibility

├── c2c9e418b22ca5a0b02ef0c2bd02c34ad792d1fc271e5580fdb3252979ccc092

│ ├── checksum

│ ├── json

│ ├── layersize

│ ├── tar-data.json.gz

│ └── v1Compatibility

├── d43816b44a2280148da8d9b6ce2f357bff9b2e59ef386181f36a4a433a9aad6c

│ ├── checksum

│ ├── json

│ ├── layersize

│ ├── tar-data.json.gz

│ └── v1Compatibility

├── dc02db50a25a87ca227492197721e97d19f1822701fe3ec73533a0811a6393a7

│ ├── checksum

│ ├── json

│ ├── layersize

│ ├── tar-data.json.gz

│ └── v1Compatibility

├── ea2fc476f5f055f9e44963987903ecfe0cb480b7e387d8b5cb64006832110afc

│ ├── checksum

│ ├── json

│ ├── layersize

│ ├── tar-data.json.gz

│ └── v1Compatibility

└── _tmp

11 directories, 50 files

从上面的结果中可以很明显的看到我们的镜像nginx及其每一个nginx镜像的中间层对应的目录下都包含如下几个文件:checksum、json、layerrize、tar-data.json.gz和v1Compatibility。我们任意找一个文件看下这几个文件中存放了什么数据。

(1) Checksum

其实从文件名称即可看出每个镜像层中的checksum文件存放的是当前镜像层的md5值,用于核对当前镜像层的数据是否完整。

(2) json

从cat 的结果中可以看出json文件中存放的数据较多,比如Hostname、Domainname、User、Image等信息,而且很多参数和我们经常接触的Dockerfile中的参数相似。相比较前面的checksum文件这个文件中的内容相对较复杂,在此我们也解释下。

此处的json文件中一般主要用于存放镜像中涉及的动态信息,但需要注意的是此处的json文件并不仅仅被用于存储docker镜像的动态信息(很多同学可能会认为此处的json文件只是被用来描述Docker容器的动态信息的),我们在使用Dockerfile 构建镜像时,Dockerfile 构建过程中涉及到的所有操作基本都被记录到这个json文件中。

说到这儿,有些同学可能会问这个json是在什么阶段被使用到的,好问题。通过下面这个图我想大家应该就能看明白了:

从图中我们可以看出每个镜像层的json文件其实是由Docker 守护进程进行解析的。Docker 守护进程通过json文件可以解析出运行容器需要的各种数据,比如环境变量、workdir以及容器启动时需要执行的ENTRYPOINT或者CMD命令等。Docker 守护进程从json文件中获取到这些数据后,接下来就开始进行容器进程的初始化。

(3) layersize

从文件名称即可看出,这个文件中存放的为当前镜像层的占用空间大小:

(4) repositories-devicemapper

上一阶段中我们解释过这个文件中记录的为当前镜像层的属性信息,比如镜像名称信息、镜像标签信息、镜像的ID信息等:

以上是对pull镜像之后运行容器之前镜像存储信息的简单介绍,相信大家在看下之后对docker容器镜像已经有了更加深入的认识。下面我们看下本文中我们要说的最后一个阶段,即运行容器后docker 的存储又发生了哪些变化。

运行容器后

我们运行下前面从dockerhub pull的镜像nginx:latest:

[root@localhost metadata]# docker images

REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE

nginx latest c2c9e418b22c 2 weeks ago 109.3 MB

[root@localhost metadata]#

[root@localhost metadata]#

[root@localhost metadata]#

[root@localhost metadata]# docker run –name nginx -d nginx:latest

814ec80839669e235c94978ed3d07eab0e2b2bebd7d7a64fd6488cddca51be41

[root@localhost metadata]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

814ec8083966 nginx:latest “nginx -g ‘daemon off” 3 seconds ago Up 2 seconds 80/tcp nginx

按照惯例,然后我们看下/var/lib/docker路径下的文件结构:

和上一阶段不同,这个阶段发生变化的文件主要是:/var/lib/docker/devicemapper/metadata、/var/lib/docker/devicemapper/mnt以及/var/lib/docker/container,下面我们逐个看下。

(1) metadata

我们看下metadata这个目录下的文件:

从图中的结果可以看出,相比上一个阶段,当前阶段中metadata目录下多出了两个文件,即以51be4e和51b44e-init结尾的两个文件。

我们都知道docker 借助容器镜像运行起容器之后,会在当前镜像的最顶层添加一个特殊的层,和其他的层相比这个层不但有可读的权限还有可写的权限。说到这,相信多出的两个文件的功能就不难理解了。

(2) mnt

在查看mnt下的数据之前,我们先看下这个目录下的文件结构:

对比上面说过的metadata目录,发现这两个目录下的文件是一样的,相比前一个阶段的话也是新增了两个文件,即以51be4e和51b44e-init结尾的两个文件。

(3) container

我们先看下当前目录下的文件结构:

Container目录为容器本身的目录,此目录中存放了诸如容器的配置文件等文件。如果我们删掉这个目录(docker 进程hang死导致docker rm、docker kill杀不掉容器时常用此种方式处理)的话正在运行的容器就会被删掉,我们看下这几个文件都存放了什么数据。

(1) xxx.json.log、config.json

从文件名称即可看出,这两个文件存放的为当前容器的配置信息及其数据:

(2) hosts

hosts配置信息,在此不再赘述。

(3) hostname

容器host名称,可以cat查看后再进入容器查看hostname,核对下看是否是一样的。

(4) resolv.conf

dns配置信息。

小结

前面分析了那么多涉及到docker 存储的文件,在查阅各个文件或者目录作用时可能不是很方便,在此我们给大家总结了一下各个文件的作用(每个文件都是在/var/lib/docker路径下):

(1) devicemapper/devicemapper/data

存储存储池相关的数据。

(2) devicemapper/devicemapper/metdata

存储元数据。

(3) devicemapper/metadata/

存储device_id、layersize等信息。

(4) devicemapper/mnt

存储挂载相关的信息。

(5) container/

存储容器本身的信息。

(6) graph/

存储各个镜像层的详细信息。

(7) repositores-devicemapper

存储镜像的一些基本信息。

(8) tmp

存储docker的临时目录。

(9) trust

存储docker的信任目录。

(10) volumes

存储docker的卷目录。

你知道IOS 14最值得使用的五大功能吗?

虽然iPhone 12并没有如期而至,但手机玩家们也不必太过失望,因为苹果给我们准备的iOS 14正式版,内藏不少惊喜。更新之后你的手机系统跟之前大有不同,四舍五入不就等于用了部新手机?

我们极客视界曾专门写过iOS 14的功能总结,大家或多或少也知道一些新特性,比如小部件让App的排列更美观也更实用;Siri和来电显示不再烦人地占满你的整个屏幕,而是分别占用底部和顶部的一小块位置,不影响你原来进行的操作 舒服了不少;还有画中画,初看很惊艳,再看贼鸡肋!

今天极客君给大家介绍5个可能你没留意甚至完全不知道的iOS 14新功能,总有一个你用的上,且巨好用。

对象查你图库?不可描述的隐藏起来!

如果你是iOS 14之前的系统版本,应该有发现「照片」应用里,一些你不想让别人直接看到的照片,是可以选择隐藏的,但这个隐藏并不彻底,可以在照片-相簿里,拉到最下面,就能看到「已隐藏」的照片,这不是告诉别人此地无银吗,所以只能凑合着用。

不过更新到iOS 14后,这个功能就变得实用了,打开设置-照片-"已隐藏"相簿,将其关闭。这样一番操作之后,你再隐藏的照片,别人从照片应用里就无迹可寻了!但还是要说,只能防君子不能防小人。对了,别让你对象知道这个功能,不然你白学了!

轻敲背面,奇迹发生了

你有没有羡慕过安卓手机的一些快捷的手势操作?比如双指下滑就截屏。但在iPhone上你是用机械按键来截图,还是用小圆点来截图?机械按键无疑是最笨的方法了,尤其是手机平放在桌面上的时候,非常不方便,甚至要两个手配合。此前我最常用的是小圆点设置快捷键,这也是我在全面屏时代保留小圆点的唯一理由。

但iOS 14来了之后,小圆点也可以彻底放弃了,打开设置-辅助功能-触控,拉到最下面,选择「轻点背面」,就可以用手指轻轻点两下手机背盖,或者点三下,实现诸如截屏或锁屏等快捷操作。

程序库,一键隐藏主页面

程序库里包含所有系统自带和你自己下载的App,并会根据你的使用习惯和应用分类自动排列。这意味着,主页面上,那些你半年都不会打开一次但又不舍得删的App,就可以移除(隐藏)了,需要的时候,直接划到程序库打开就行。

但你可能不知道,其实一整个主页面都可以全部移除,只需要长按主屏幕,然后点击下面的三颗小圆点,然后勾选你希望展示的页面,其余没被勾选到的都会直接被隐藏。对于现实生活中的收纳爱好者和喜欢极简风格的强迫症患者,应该会很喜欢这个功能。

忘了Google翻译吧,苹果自带翻译App不能再方便

目前支持12个国家的语言,选择你需要翻译成的某国语言,可以直接在文本框输入中文就能快速得到翻译结果。懒得打字你也可以直接语音输入,同样秒出翻译结果,很适合跟外国人面对面交流,如果你对自己的口语没自信,也可以直接播放翻译结果给对方听,实测翻译准确率还是OK的

默认浏览器可以更换

应该有不少用户只是用着iPhone手机,但电脑仍然还是是用Windows而非Mac,那Windows系统上,目前最主流的是用谷歌Chrome浏览器应该无疑义。这就意味着Chrome上收藏的页面,你在iPhone上注定无法同步。

在iOS 14上,你的默认浏览器可以更改了,选择Chrome浏览器后,就能很方便同步PC和手机的书签了。而且点击某个链接,将会自动选择用Chrome打开。

镜像前置镜头

在安卓手机上,打开前置镜头后,取景框里得到的画面是相反的,简单点说就是你坐在副驾驶位,拍出来的效果是你坐在司机位。iPhone的做法是,自动调整过来,真实情况是什么样,就什么样。

但喜欢自拍的女孩子可能就不太喜欢了,精心摆弄的表情,她就喜欢取景框里面那个角度,怎么按下快门就换了个方向了??所以完全真实,也并非每个人都喜欢的。而现在可以自由选择是否打开「镜像前置镜头」了,你自己来决定,你想要什么样的效果。

极客君有话说

其实iOS 14还有其他不少有趣的新特性,比如自定义充电提示音,每次插入lightning数据线,都能听到你女神的声音会不会更有意思?你还知道哪些有意思的新玩法,我们来唠嗑唠嗑。

8个免费论文下载网站,最后一个给你钱,还建议收集大一和大二学生

大家好,这里是秋叶PPT,转眼又到了毕业生们写论文的季节。

我们今天分享8个可以免费下载中英文资料的网站,看完你就不会再发愁找文献了~

Google 镜像导航

推荐指数:★★★★★

网站简介

说到论文下载,谷歌学术必须有姓名。可是因为众所周知的原因,我们无法正常登陆。

还在学校的时候,课题组师兄曾经推荐过一个谷歌学术的镜像网站,不用爬墙也能正常使用。

单个的链接很容易失效,所以这个网站丧心病狂地提供了多达20个的入口!!只要显示「现在访问」的,就表明该镜像可用。(第一次发现,我如此喜欢绿色……)

使用方法

进入谷歌学术,输入关键词,比如 “Artificial Intelligence”。右侧显示「PDF」字样的,表明该论文可直接下载。

点击右上角的下载图标,就可以得到PDF版本的论文啦~

Sci Hub

推荐指数:★★★★★

网站简介

谷歌学术的文献下载不了怎么办?来试试Sci-Hub吧~

这是一个来自俄罗斯的学术网站,你可以称它为学术界的罗宾汉,专门“劫富济贫”,因为所有的论文均可免费下载!它有一句感人的Slogan:Remove all barries(障碍)in the way of science。

这个网站的开发者是一位俄罗斯的女学霸。因为不满很多学术期刊的垄断,当时还研究生在读的Elbakyan利用业余时间开发了这个网站。

如今,已经成为了全球最大的开放获取(Open Access)学术资源站点,深受广大科研人员的喜爱。

使用方法

▌Step 1:复制论文的URL地址 / DOI / Pubmed ID

以这篇2019年新出的论文为例:

点开文章后,找到它的DOI,直接复制

▌Step 2:在Sci-Hub中粘贴,按Enter键!

一下的功夫,可以下载的PDF版本就出来了!点击右上角的下载图标,就可以免费得到这篇论文了!

Open Access Library

推荐指数:★★★★☆

网站简介

OALib也是一个免费下载学术论文的网站,所有的文章都来自顶级著名的出版商和数据库,可以满足各个领域学者的需求。

目前网站的文献数量已经达到了430万+,并且在不断增加。

使用方法

▌Step 1:输入论文标题,进行检索

▌Step 2 :找到目标文献,点击「Full-Text」,即可下载。就是这么的简单粗暴!!

Library Genesis

推荐指数:★★★★★

网站简介

Library Genesis翻译成中文就是“创世纪图书馆”,口气可不小,号称要帮助全人类知识无版权传播的计划!不过它真的是名不虚传!

华东师范大学的朱国华教授还说过:“俄罗斯人开的网站为全世界读书人带来了功德无量的便利,我的绝大部分英文书是从该网站中下载得到,但愿此网站万世不倒。”(这也是俺的心声…)

使用方法

电子书的下载这里暂且不表,今天先来说说怎么下载文献。

▌Step 1:指定搜索内容为「Scientific articles

▌Step 2:在「Links」里找到合适的链接,即可下载。

猫咪论文

推荐指数:★★★★★

网站简介

这个网站是国内一位计算机大神和他的小伙伴在学校开发的。虽然当时他是一名在校生,可以享受丰富的学术资源,但由于受不了学校论文检索的繁琐,一言不合就做出了这个聚合的开放论文数据库网站。

网站的定位就是让大家能够自由简单的下载论文。目前已经聚合的可检索论文总量已经超过了6,000W+,覆盖了Elsevier、Springer Nature、Wiley-Blackwell、American Chemical Society、Cambridge University Press 等重点出版机构。

使用方法

下载只需3步:输入论文标题或DOI → 回车 → 在线查看论文 或 下载到本地

我们来尝试下载一篇Nature 2019年4月出的关于猪脑死亡的论文 < Restoration of brain circulation and cellular functions hours post-mortem >

按照上面3个步骤进行检索,搜出来的也是可直接下载的PDF文献。

贵州数字图书馆

推荐指数:★★★★★★(六星!)

这个网站也可以免费下载知网文献。直接教大家怎么操作。

▌Step 1:点击「在线领卡」

点击网站首页右上角的「在线领卡」

▌Step 2:填写注册信息

〖地区〗那里随便选一个就行。

注册成功后,网站会自动分配一个帐号和密码。并且会贴心地以手机短信的形式发送给你。

▌Step 3:登录网站

▌Step 4:开始搜索!

这里以百度学术上的一篇文献为例,根据来源发现只能在〖知网〗和〖万方〗下载。

但是在贵州数字图书馆就可以!!

输入标题 < 深入研究防电磁辐射纺织品 >,选择〖期刊〗,选择〖中文检索〗

搜出的结果提供了两种获取途径:〖电子全文〗和〖 邮箱接收全文〗

我选择的是〖电子全文〗,文献就顺利下载下来了!!!没花一分钱!!

类似的网站还有:广西壮族自治区图书馆

百度学术

推荐指数:★★★★☆

网站简介

百度搜索虽然遭人诟病,但是他家出的这款学术产品还是很良心的,涵盖了各类学术期刊、会议论文。所以经常是我搜中文文献的首选。

我找了一篇文献,发现除了〖知网〗、〖万方〗,还可以在〖爱学术〗、〖道客巴巴〗、〖豆丁网〗这几个网站下载到。

其中〖爱学术〗支持每天下载2篇文献。不过它非常好的一点在于每篇文献都会给出PDF预览,如果你只是想参考部分内容,那么这个功能完全可以满足需求啦~

那如果我就是要下载〖道客巴巴〗、〖豆丁网〗上的论文,可以咋办?上面的资料下载都要积分的呀!

不怕!这里给大家准备了一枚神器【冰点文库】,只要复制文档的链接,冰点就会自动抓取,点击「下载」即可~

不过呀,也有的时候,文献偏偏只有〖知网〗这样的网站有!这可怎么办?!还是有办法的。

细心的你是否观察到百度学术在搜索结果里,还提供了一个〖求助全文〗的选项呢?

这里总共提供了3种求助方式。

发出求助后,就会有网友帮你找文献。在「我的求助」可以看到求助结果。

上海科技创新资源数据中心

推荐指数:★★★★★★★★★★(10星!)

这个网站可是隐形的土豪啊!

你只要注册成功,直接送你600元的知网充值金额!400元的万方充值金额!

并且还会送2000积分!每1000积分又可以送200元知网或万方的充值金额……

赶紧跟着我一起操作吧!

▌Step 1:注册账号

根据要求填写信息即可,工作单位可以随便填写。

▌Step 2:扫码关注公众号

▌Step 3:登录,金额已入账!

除了直接充值好的金额,平台还送了我们2000积分,这些积分又可以兑换成金额!

这么一算,我只是注册了一下,一下子就拥有了1400元的论文下载基金!!

我试着下了一篇硕士论文,证明确实是可以下载的!

既然如此,如果我们再换个思路,只要注册就送1400元,那我再注册一个新的账号呢??还是会再送1400元!!没有多余的手机号?可以拿家人的手机号去注册啊!

免费下知网文献,真的不是梦!而且我们使用的方法是完全正规的!

这种方法,用来应急还是可以的。

好啦,8个资料下载的神网站就介绍到这里。觉得有用的话,快快收藏~

你还知道哪些好用的学术类网站呢,在留言区分享吧!

升级Android l factory的图像并添加Google fit支持

既然是开发者预览的版本,那么就肯定能看到最新的行业发展趋势,尤其是在前段时间发布的下一代 Android 系统身上,任何趋势的变化都会反映在这个不断变化的产品身上。近日,谷歌悄然更新了 Android L 开发者预览版,目前在谷歌开发者站点中,新的工厂镜像的版本号已经从原先的 LPV79 版本升级至 LPV81C 版本。而最显著的变化在于加入了对 Google Fit 的支持。

新的镜像的出现表明谷歌依旧在不断地为 Android L 增加新的功能,而作为未来谷歌针对个人健康以及可穿戴设备领域的一次大胆尝试,Google fit 的竞争对手将会是苹果即将发布的 Healthkit,而后者也将会在今年秋季的 iOS 8 中正式对外发布。所以在新版的 Android L 出现这样的新功能也就不足为奇了。

与此同时,谷歌还发布了有关 Google Fit 的预览版 SDK,开发者可以在获取整套新系统镜像的同时,下载 Google Play services for Fit Preview 获得完整支持,先期将会有包含记录运动数据,运动传感器以及运动历史记录方面的 API 供开发者调用。

本文部分内容编译自 AndroidPolice

华为开发的基准HMS与谷歌GMS有何不同

用过安卓手机的用户都知道GMS,这是安卓系统的最底层框架,支撑着整个安卓系统,是安卓手机中必不可少的。不过华为近两年却自己开始研发起了HMS,今天HMS已经正式向全球开发者发布了HMS Core5.0。可是都已经有GMS了,为什么还要自制HMS,下面就为大家盘点一下这个原因所在。

详解GMS

GMS的全称是GoogleMoblie Service,也就是谷歌移动服务,它是谷歌程序运行的基础,是谷歌旗下的应用程序和基于云的软件服务。它可以为用户提供Googleplay、Search、Search by Voice、Gmail、Contact Sync、Calendar Sync、Talk、Maps、Street View、YouTube、Android Market等服务,以及基于Google账户的系统数据同步备份,包括通讯录、邮件、文件的同步等,可以说它是安卓系统中配置服务的一项,是安装谷歌程序不可缺少的一部分。

谷歌GMS包含两部分,一部分是面向用户的APP部分,另一部分就是后台服务部分的APK还有GMS Core,这也叫做Google Play服务。Google Play服务一开始是为了解决安卓早期混乱的情况,由于不同品牌,不同硬件的手机更新软件难度不一,所以谷歌就设置了一个Play Services平台,让平台的控制权增大,软件可以独立于安卓系统进行更新,这也就更加强调Google Play服务的重要性。

对于海外的安卓系统来说,它非常依赖GMS,谷歌三件套是登录谷歌商店的必备,它们分别是Google服务框架、Google play商店和Google Play服务,他们都是基于GMS来运行的。有很多APP在没有GMS的情况下,根本无法使用或者安装错误,所以没有GMS的安卓手机在海外基本上无法使用,这也凸显出GMS的重要性。

而国内并非如此,GMS对于国内用户来说几乎是没有任何存在感。由于国内并不支持谷歌,各大厂商都打造了自己的服务平台,通过让用户创建自己平台的账号来为用户提供云空间,账号同步等功能,让手机更加本土化。

所以各大厂商一般也就不太重视GMS,有的内置了阉割版本的,有的将框架隐藏起来,不过这个框架是可以自行下载的,并且国内有各类型的应用市场,并不依赖于Google Play,可以随意下载软件,所以GMS在国内可有可无。

华为作为现在前三的手机厂商,海外业务自然也是大头,而缺少了海外用户必备的GMS,就如同国内用户没有了应用商店、爱奇艺、还有163邮箱等,这简直是寸步难行。

这都是由于GMS并不是AOSP,也就是常说的安卓开源项目,而是完全掌握在谷歌手中,想要使用GMS,一定要经过谷歌的认可,并且遵守谷歌提出来的一系列要求,这也就是说安卓系统是开放的,但是谷歌却可以控制安卓。

而在去年,华为被美国列入黑名单中,GMS就被禁止用在华为手机中,所以华为不得不自行研制自己的移动服务平台,以满足海外用户的需求。就在去年8月,华为正式开放HMS生态,准备打造一个自有的指挥输资云服务平台。

HMS也同样分为两部分,一是主要面向用户的应用部分,另一个是核心后台服务,基本思路与GMS一致,它同样可以独立于系统更新,为不同硬件提供相同的使用体验。它采用了AppGallery代替了GMS中的Google Play应用商店,并为开发者提供了包括Account Kit(账号工具包)、Location Kit(定位套件)、Map Kit(地图套件)等API,这些是HMS替代GMS所不能缺少的部分,这也是为不能安装HMS的海外华为手机提供了解决方案。

今年2月,华为在欧洲发布了搭载HMS服务的荣耀 V30 Pro 5G版和华为Mate Xs智能手机,这说明HMS代替GMS已经不再是计划,而是落实到现实中,这也表示华为在系统方面不再受制于人,而是有了自己的主动权。

也不仅仅是华为,曾今有微软、三星、黑莓等品牌都建立过自己的移动生态,但是基本上现在都已经销声匿迹,不过华为这次并不是雷声大雨点小。所谓万事开头难,华为已经走好了第一步,虽然这次属于被迫走上了自研道路,但是如果成功,就会形成麒麟芯片+鸿蒙系统+HMS全部自研的情况,对于目前来说,除了苹果还没有人可以做到。

方舟:安卓黑屏闪回中的生存与进化

今天官方修复了安卓部分问题,已解决以下问题,

1,兼容设备问题

2,黑色屏幕触摸控制问题

3,购买错误问题

关于手机配置要求:

1、运行内存3G以上

2、安卓7.0版本

3、支持VulkanSupport软件。 PS: Vulkan Support是一-个跨平台的2D和3D绘图应用程序接口,主要是用来支持方舟的高画质需求功能软件。Vulkan就是图形驱动,大家可以下载devcheck进行检测你的手机是否支持。

注意:

1、看看自己手机配置符合要求没有。(这个尤为重要,安卓7.0,以.上,运存3GB以上)没满足的,装不了很正常,等厂商优化吧,就别再问为什么装不了了。 PS:如果安装的过程提示CPU不兼容的话,基本是说你的手机配置目前还玩不了。

2、储存空间是否足够。

3、进入游戏黑屏卡住或闪退的玩家下载谷歌三件套试试看

4、如出现这种情况,这是数据包储存失败了,请确认手机开启储存权限,重新下载安装包试试看~

5、初次登录游戏,会有初始化加载,根据手机配置加载时间不一,有可能需要很长时间,请耐心等待。

6、如果出现画面卡顿,掉帧可尝试将画面效果调到LOW,分辨率降低

7、解析包错误的玩家,请先检查手机储存空间是否足够,请确保手机剩余存储空间大于2.5G

8、这个黑屏可能是你配置达到了,但是 Vulkan 不支持导致的,有玩家有偶发调整画质为最低成功,但是暂时无100%解决办法。

9、玩游戏时突然锁屏解决办法 目前已知有成解决案例的办法:打开手机设置>开发者选项一打开HW叠加。

你不能在中国玩口袋妖怪吗?伟大的上帝教你三件套

最近炒鸡火的Pokemon Go,虽然在中国处于锁区状态,但阻挡不了人们对它的热衷。媒体目光纷纷聚焦,朋友圈刷屏炫耀抓到宠物。任天堂这家濒临破产的公司,也因此翻身,市值一举超过索尼。育碧眼馋,也要开发AR游戏。

VR近年被炒得沸沸扬扬,今年被称为VR元年,不过VR领域似乎还没有谁赚到甜头,门槛更高的VR一直是概念大过产品。而任天却另辟蹊径,放弃AR核心技术,直接以内容与硬件主体,让玩家实现虚拟与现实的交互。

玩过Pokemon Go的纷纷“中毒”,这款游戏到底有什么魔性?

游戏模式本身只是一个宠物养成记,所及抓宠物——孵蛋——升级——与其他宠物打擂台。亮点在于虚拟道具与现实场景的结合,融合了现实地图GPS定位,抓鱼必须去水边,森林里只有虫子,补给站在几公里外,就得走过去。玩家借助一个手机就能真实世界的“猎手”,体验狩猎的刺激。

对于中国区玩不了,有消息称主要是因为地图问题,Pokemon Go依托的是Google地图,Google退出中国后,面临难以落地的问题,虽然Google地图在国外数据丰富、更新及时,但在中国却面临困难。

不过有大神玩家提出了解决方案,先准备谷歌三件套: Google应用商店、Google账户管理器、Google 服务框架;安装GPS模拟定位软件;注册google账号。

装好之后,打开gmail设置账号,然后启动游戏既可以了。

不过对于此游戏,建议谨慎玩耍。因为其不是在家里或者某个固定点玩,而是要走到户外,一边走路,一边又要集中精神在手机上搜索宠物,发生意外是难免的。据报道,附带伤害已出现:玩游戏太入迷而坠崖,白宫争夺战,硬闯博物馆,罪犯利用其抢劫,华盛顿交通部提示司机,还有人把其当成捉奸利器。

支持GMS服务的新版华为P30 Pro约5700元

近日消息,据外媒报道,新版华为P30 Pro上架,售价749欧元(8GB+256GB,约合人民币5700元)。它支持谷歌移动服务(GMS,全称为Google Mobile Service),海外平台依赖GMS,当使用登录海外网站的谷歌商店就必须使用谷歌三件套(Google服务框架、Google Play商店和Google Play服务)。

而这些基于GMS来运行,如没有将无法安装海外应用程序或将被禁止下载,很多APP没有GMS甚至根本无法运行,即使安装成功运行也会出现“闪退”,或者是出现”已停止服务”,没有办法正常使用。

除了支持谷歌移动服务,新版P30 Pro加入了P40系列上的新配色——冰霜银,其它规格保持不变。

核心配置上,P30 Pro采用6.47英寸OLED显示屏,搭载麒麟980处理器,配备8GB内存+256GB存储,前置3200万像素,后置4000万超感光主摄+2000万超广角+800万潜望式长焦+TOF四摄,电池容量为4200mAh。

目前这款旗舰将于5月31日在德国发售,首批下单用户可以获赠FreeBuds 3真无线耳机以及华为CM-510迷你蓝牙音箱,还能以99欧元(约合人民币760元)价格购买华为Watch GT2。

面对谷歌的封锁,华为这次如何利用HMS来亮剑?

谷歌切断GMS服务,华为在海外自谋生路?

怎么谋?

凭芯片通信技术拼刺刀?人家谷歌可是做纯软件出身的,马再好你得上个好马鞍啊,对于华为目前来说,海思+5G这匹马固然重要,但是HMS牌的马鞍套上了才能策马奔腾。

谷歌主要面向海外服务,一般包括谷歌商店的软件提供,谷歌系统服务的Gmail、谷歌地图、谷歌云服务,

华为自然也是从这些方面对标。

服务用户,以Appgallery(华为应用市场)为核心

  • 华为应用市场在国外名为Appgallery,直接怼上的是Google Play谷歌应用商店。

华为ID和华为云是基础,早就在国内华为手机上使用了;华为助手也在EMUI10上统一出现;华为主题,华为音乐,华为视频,华为浏览器全家桶相信各位也不陌生。

这些华为服务已经在荣耀9X Pro,华为Mate XS,和荣耀V30 Pro上通过预装或者升级的形式已经搭载,并且会出现在接下来的华为P40等一系列设备上。

  • 有关软件应用的丰富度,就不谈国内了。

目前在Appgallery上,已经有Snapchat,TikTok,Deezer,亚马逊,Booking,金融时报,BBC新闻这类海外主流软件,但是,像国外用户使用频率最高的社交软件——脸书,WhatsApp,Instagram,华为都没有。综合考虑来看,出于政治敏感性,这类用户粘性极强、涉及到隐私及数据收集的软件,在之后很长一段时间都不会出现在华为生态中。

谷歌系的油管,贵为世界第一大视频网站,也进不了国门;流媒体之王网飞出于版权问题和数据搜集问题也不可能登陆华为。

尽管华为官方一再强调,这类软件将来会有一部分,要添加到Appgallery中,可对于即时消费意愿极强的流媒体和社交App用户来说,"将来"是多久?

  • 于是华为推出了Quick Apps快应用。

目前已经有2000多个涵盖各个方面的快应用上线,官方表示总共只会占用1GB的空间,还有1700个快应用正在开发中。目标是在未来的一段时间内,在全球170多个国家上线。华为为此投了十亿美元,目标是全球潜在的四亿月活量。

  • 还有消息说,华为要联合小米,Vivo和Oppo打造中国Play

而现在,小米、vivo、OPPO成立了个"互传联盟",并没有带上老大哥华为。

给予开发者便利,搭建HMS Core

  • 由于谷歌原生安卓的特性,根植于谷歌的应用离开了谷歌三件套便无法使用,华为以HMS Core为核心,接入了APIs、SDKs等开发资源,并且自行开发了不同的应用接口供开发者使用

华为将这些技术同步在了在各个主流开发系统上。

从去年十二月开始,华为便向开发者承诺,只需要十分钟,开发者就能把谷歌商店的软件移植到HMS上来。为此华为还特意推出了现金激励的政策。

该做的都做了,依然任重而道远

鉴于2019谷歌服务覆盖全球超过十几亿的主要消费人群,几乎是国外安卓手机标配的情况下,

海外用户深入骨髓的脸书+推特+YouTube+Ins的使用逻辑几乎不可能被动摇。

还有苹果和谷歌分庭抗礼。

HMS恐怕只能根植于国内,把国内的十几亿手机用户"归化"后,再进一步说话吧。

最好的局面可能就是美国方面解禁,大家握手言和,皆大欢喜。

醉了醉了。

#华为# #谷歌# #数码爱好者# #数码新发现#

如何在没有VPN的情况下玩Android

因为腾讯的关服了,所以安卓的玩家们开始焦急不知道怎么玩,之前有个是谷歌下载的但是需要VPN也是麻烦,今天小编看见一个新的。希望对大家有所帮助。

楼主 安卓没有关 只是腾讯代理的关了而已 游戏可以到taptap或者当乐下载 需要谷歌三件套 不过不需要vpn 如果没有三件套则无法下载数据包 不过安卓版无法充值 并且很多活动只支持ios用户。

来自贴吧的挽歌丶葬解答。

疾风之刃手游交流讨论群:336187897。更多精彩资讯、攻略请关注97973手游疾风之刃手游专区。

扫描二维码下载疾风之刃手游攻略

全民手游攻略微信公众号二维码:

扫描二维码关注全民手游攻略微信

关于全民手游攻略

全民手游攻略致力于为广大玩家提供最新、最全、最详尽的手游攻略,在这里你可以查询到任何你想要了解的内容。问答社区服务为玩家们提供了相互交流并相互解惑的平台,让玩家们的疑问尽快得到解决。

97973手游网声明:97973手游网登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。