docker技术入门与实战 第3版学习笔记之第3章

# 第3章 使用docker镜像

镜像是 Docker 三大核心概念中最重要的,自 Docker 诞生之日起镜像就是相关社区最为 热门的关键词。 Docker 运行容器前需要本地存在对应的镜像,如果镜像不存在, Docker 会尝试先从默 认镜像仓库下载(默认使用 Docker Hub 公共注册服务器中的仓库),用户也可以通过配置, 使用自定义的镜像仓库。

### 获取镜像

可以使用 `docker [image] pull` 命令直接从` Docker Hub 镜像源`来下载镜像。该命 令的格式为 `docker [image] pull NAME [: TAG] `其中, `NAME `是镜像仓库名称(用来区分镜像),`TAG`是镜像的标签(往往用来表示版本 信息)。通常情况下,描述一个镜像需要包括“名称+标签“信息。

对于` Docker 镜像` 说,如果不显式指定` TAG`, 则默认会选择 `latest标签`,这会下载仓库中最新版本的镜像。

> 一般来说,镜像的 `Iatest 标签`意味着该镜像的内容会跟踪最新版本的变更而变化,内容是不稳定的。因此,从稳定性上考虑,不要在生产环境中忽略镜像的标签信息或使用默认的 latest 标记的镜像。

```bash

PS C:\Users\fe> docker pull ubuntu:18.04

18.04: Pulling from library/ubuntu

284055322776: Pull complete

Digest: sha256:0fedbd5bd9fb72089c7bbca476949e10593cebed9b1fb9edf5b79dbbacddd7d6

Status: Downloaded newer image for ubuntu:18.04

docker.io/library/ubuntu:18.04

```

下载过程中可以看出,镜像文件一般由`若干层 (layer) 组成`, `6c953ac5d795` 这样的串是`层的唯一 id` (实际上完整的 id 包括 256 比特, 64 个十六进制字符组成)。使用 `docker pull `命令下载中会获取并输出镜像的各层信息。当不同的镜像包括相同的层时,本地仅存 储了层的一份内容,减小了存储空间。

严格地讲,镜像的仓库名称中还应该添加仓库地址(即 registry, 注册服务器)作为前 缀,只是默认使用的是官方 Do cket-:lub 服务,该前缀可以忽略。例如, `docker pull ubuntu:18.04` 命令相当于 `docker pull regis ry;hub. docker.com/ubuntu:18.04` 命令,即从默认的注册服务器 Do ckeHub Regis 中的 ubuntu 仓库来下载标记为 18.04 的镜像

pull 子命令支持的选项主要包括:

* `-a, --all-tags true I false`: 是否获取仓库中的所有镜像,默认为否;

* `--disable-content-trust`:取消镜像的内容校验,默认为真。

另外,有时需要使用镜像代理服务来加速 `Docker`镜像获取过程,可以在 Docker 服务 启动配置中增加 `--registry-mirror==proxy_URL` 来指定镜像代理服务地址(如 https:// registry.docker-cn. com)

### 查看镜像信息

#### 使用` images` 命令列出镜

使用 `docker images`或者` docker image ls` 命令可以列出本地主机上已有镜像的基 本信息。

```bash

PS C:\Users\fe> docker images

REPOSITORY  TAG      IMAGE ID      CREATED        SIZE

nginx        latest    605c77e624dd  22 months ago  141MB

mysql        5.7      c20987f18b13  23 months ago  448MB

ubuntu      18.04    5a214d77f5d7  2 years ago    63.1MB

node        8.14.0    3b7ecd51ffe5  4 years ago    889MB

PS C:\Users\fe> docker image ls

REPOSITORY  TAG      IMAGE ID      CREATED        SIZE

nginx        latest    605c77e624dd  22 months ago  141MB

mysql        5.7      c20987f18b13  23 months ago  448MB

ubuntu      18.04    5a214d77f5d7  2 years ago    63.1MB

node        8.14.0    3b7ecd51ffe5  4 years ago    889MB

```

在列出信息中,可以看到几个字段信息:

* 来自于哪个仓库,比如 `ubuntu` 表示 `ubuntu `系列的基础镜像;

* 镜像的标签信息,比如 `18.04、latest `表示不同的版本信息。标签只是标记,并不能标识镜像内容

* 镜像的 `ID (唯一标识镜像)`,如果两个镜像的 ID 相同,说明它们实际上指向了同一 个镜像,只是具有不同标签名称而已;

* 创建时间,说明镜像最后的更新时间;

* 镜像大小,优秀的镜像往往体积都较小。

其中`镜像的 ID `信息十分重要,它唯一标识了镜像。在使用镜像 ID 的时候,一般可以使 用该 ID 的前若干个字符组成的可区分串来替代完整的ID

`TAG 信息`用于标记来自同一个仓库的不同镜像。例如 `ubuntu 仓库`中有多个镜像,通过` TAG 信息`来区分发行版本,如 18.04 18.10 等。

镜像大小信息只是表示了该镜像的逻辑体积大小,实际上由于相同的镜像层本地只会存 储一份,`物理上占用的存储空间会小于各镜像逻辑体积之和`。

images 子命令主要支持如下选项:

* `-a, --all =true I false`: 列出所有(包括临时文件)镜像文件,默认为否;

* `--digests=true I false`: 列出镜像的数字摘要值,默认为否;

* `-f, --filter=[ ]`:过滤列出的镜像,如 `dangling =true` 只显示没有被使用的镜像;也可指定带有特定标注的镜像等;

* `--format= “TEMPLATE" `:控制输出格式,如`.ID`代表 ID 信息,`.Reposiory` 代表仓库信息等;

* `--no-trunc =true I false` :对输出结果中太长的部分是否进行截断,如镜像的 ID 信息,默认为是;

* `-q, --quiet=true I false` :仅输出 ID 信息,默认为否。

#### 使用 `tag` 命令添加镜像标

为了方便在后续工作中使用特定镜像,还可以使用 `docker tag `命令来为`本地镜像任意添加新的标签`。例如,添加一个新的 `myubuntu:latest` 镜像标签,再次使用` docker images` 列出本地主机上镜像信息,可以看到多了一个 `myubuntu:latest`标签的镜像

```bash

PS C:\Users\fe> docker images

REPOSITORY  TAG      IMAGE ID      CREATED        SIZE

nginx        latest    605c77e624dd  22 months ago  141MB

mysql        5.7      c20987f18b13  23 months ago  448MB

ubuntu      18.04    5a214d77f5d7  2 years ago    63.1MB

node        8.14.0    3b7ecd51ffe5  4 years ago    889MB

PS C:\Users\fe> docker tag ubuntu:18.04  myubuntu:latest

PS C:\Users\fe> docker images

REPOSITORY  TAG      IMAGE ID      CREATED        SIZE

nginx        latest    605c77e624dd  22 months ago  141MB

mysql        5.7      c20987f18b13  23 months ago  448MB

myubuntu    latest    5a214d77f5d7  2 years ago    63.1MB

ubuntu      18.04    5a214d77f5d7  2 years ago    63.1MB

node        8.14.0    3b7ecd51ffe5  4 years ago    889MB

```

`myubuntu:latest`镜像的 ID `ubuntu:18.04` 是 完全一致的,它们实际上指向了同一个镜像文件,只是别名不同而已。 `docker  tag 命令添加的标签实际上起到了类似链接的作用`。

#### 使用 `inspect` 命令查看详细信息

使用 `docker [image] inspect` 命令可以获取该镜像的详细信息,包括制作者、适应 架构、各层的数字摘要等:

```bash

PS C:\Users\fe> docker inspect myubuntu:latest

[

    {

        "Id": "sha256:5a214d77f5d747e6ed81632310baa6190301feeb875cf6bf9da560108fa09972",

        "RepoTags": [

            "myubuntu:latest",

            "ubuntu:18.04"

        ],

        "RepoDigests": [

            "ubuntu@sha256:0fedbd5bd9fb72089c7bbca476949e10593cebed9b1fb9edf5b79dbbacddd7d6"

        ],

        "Parent": "",

        "Comment": "",

        "Created": "2021-10-01T02:23:24.179667784Z",

        "Container": "20d614d2eca1b5a9ad6d5a56a80efce44096b87ca76a98256eb51f8dbaf7a8d2",

        "ContainerConfig": {

            "Hostname": "20d614d2eca1",

            "Domainname": "",

            "User": "",

            "AttachStdin": false,

            "AttachStdout": false,

            "AttachStderr": false,

            "Tty": false,

            "OpenStdin": false,

            "StdinOnce": false,

            "Env": [

                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

            ],

            "Cmd": [

                "/bin/sh",

                "-c",

                "#(nop) ",

                "CMD [\"bash\"]"

            ],

            "Image": "sha256:de5a48194cb6a383c018b7c57fa642457688605c5d6d4941db88fecabd225a55",

            "Volumes": null,

            "WorkingDir": "",

            "Entrypoint": null,

            "OnBuild": null,

            "Labels": {}

        },

        "DockerVersion": "20.10.7",

        "Author": "",

        "Config": {

            "Hostname": "",

            "Domainname": "",

            "User": "",

            "AttachStdin": false,

            "AttachStdout": false,

            "AttachStderr": false,

            "Tty": false,

            "OpenStdin": false,

            "StdinOnce": false,

            "Env": [

                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

            ],

            "Cmd": [

                "bash"

            ],

            "Image": "sha256:de5a48194cb6a383c018b7c57fa642457688605c5d6d4941db88fecabd225a55",

            "Volumes": null,

            "WorkingDir": "",

            "Entrypoint": null,

            "OnBuild": null,

            "Labels": null

        },

        "Architecture": "amd64",

        "Os": "linux",

        "Size": 63136384,

        "VirtualSize": 63136384,

        "GraphDriver": {

            "Data": {

                "MergedDir": "/var/lib/docker/overlay2/978d6229ccc535dc473448a47efe128bd4e4400d5abc4d8a2d3a455a5500c7f7/merged",

                "UpperDir": "/var/lib/docker/overlay2/978d6229ccc535dc473448a47efe128bd4e4400d5abc4d8a2d3a455a5500c7f7/diff",

                "WorkDir": "/var/lib/docker/overlay2/978d6229ccc535dc473448a47efe128bd4e4400d5abc4d8a2d3a455a5500c7f7/work"

            },

            "Name": "overlay2"

        },

        "RootFS": {

            "Type": "layers",

            "Layers": [

                "sha256:824bf068fd3dc3ad967022f187d85250eb052f61fe158486b2df4e002f6f984e"

            ]

        },

        "Metadata": {

            "LastTagTime": "2023-11-16T08:31:16.766340959Z"

        }

    }

]

```

上面代码返回的是一个 JSON 格式的消息,如果我们只要其中一项内容时,可以使 用`-f` 来指定

```bash

PS C:\Users\fe> docker inspect -f "{{.Id}}" myubuntu:latest

sha256:5a214d77f5d747e6ed81632310baa6190301feeb875cf6bf9da560108fa09972

```

#### 使用 `history` 命令查看镜像历史

既然镜像文件由多个层组成,那么怎么知道各个层的内容具体是什么呢?这时候可以使 `history 子命令`,该命令将列出各层的创建信息。

```bash

PS C:\Users\fe> docker history myubuntu:latest

IMAGE          CREATED      CREATED BY                                      SIZE      COMMENT

5a214d77f5d7  2 years ago  /bin/sh -c #(nop)  CMD ["bash"]                  0B

<missing>      2 years ago  /bin/sh -c #(nop) ADD file:0d82cd095966e8ee7…  63.1MB

```

> 过长的命令被自动截断了,可以使用前面提到的`--no-trunc` 选项来输出完整命令

>

> ```bash

> PS C:\Users\fe> docker history myubuntu:latest --no-trunc

> IMAGE                                                                    CREATED      CREATED BY                                                                                          SIZE      COMMENT

> sha256:5a214d77f5d747e6ed81632310baa6190301feeb875cf6bf9da560108fa09972  2 years ago  /bin/sh -c #(nop)  CMD ["bash"]                                                                    0B

> <missing>

> ```

### 搜寻镜像

使用 `docker search` 命令可以搜索 `Docker Hub` 官方仓库中的镜像。语法为 `docker search [opiion] keyword`。支持的命令选项主要包括:

* `-f, --filter filter`: 过滤输出内容;

* ` --format string`: 格式化输出内容;

* ` --limit int`:限制输出结果个数,默认为 25 个;

* ` --no-trunc` :不截断输出结果。

```bash

PS C:\Users\fe> docker search -f=is-official=true nginx

NAME      DESCRIPTION                                      STARS    OFFICIAL  AUTOMATED

nginx    Official build of Nginx.                        19236    [OK]

unit      Official build of NGINX Unit: Universal Web …  17        [OK]

```

搜索所有`收藏数超过4 `的关键词包括 `node`的镜像:

```bash

PS C:\Users\fe> docker search --filter=stars=4 node

NAME                          DESCRIPTION                                      STARS    OFFICIAL  AUTOMATED

node                          Node.js is a JavaScript-based platform for s…  13048    [OK]

mongo-express                Web-based MongoDB admin interface, written w…  1376      [OK]

nodered/node-red-docker      Deprecated - older Node-RED Docker images.      361                  [OK]

nodered/node-red              Low-code programming for event-driven applic…  643

circleci/node                Node.js is a JavaScript-based platform for s…  132

cimg/node                    The CircleCI Node.js Docker Convenience Imag…  17

bitnami/node-exporter        Bitnami Node Exporter Docker Image              18                  [OK]

bitnami/node                  Bitnami Node.js Docker Image                    75                  [OK]

nodered/node-red-dev          Dev/Test builds for Node-RED project (NOT st…  7

appdynamics/nodejs-agent      Agent for monitoring Node.js applications        14

selenium/node-chrome          Selenium Grid in Node mode with Chrome          254                  [OK]

kindest/node                  https://sigs.k8s.io/kind node image              96

selenium/node-firefox        Selenium Grid in Node mode with Firefox          147                  [OK]

selenium/node-chrome-debug    This image has been deprecated, we recommend…  73                  [OK]

selenium/node-firefox-debug  This image has been deprecated, we recommend…  44                  [OK]

opendronemap/nodeodm          Automated build for NodeODM                      12                  [OK]

selenium/node-edge            Selenium Grid in Node mode with Edge            7

```

### 删除和清理镜像

#### 使用标签删除镜像

使用 `docker rmi`或者 `docker image rm` 命令可以删除镜像,命令格式为 `docker rmi IMAGE [I MAGE... ]`,其中 `IMAGE` 可以为`标签或 ID`

支持选项包括:

* ` - f, - force` :强制删除镜像,即使有容器依赖它;

* `-no-prune`: 不要清理未带标签的父镜像

```bash

PS C:\Users\fe> docker images

REPOSITORY  TAG      IMAGE ID      CREATED        SIZE

nginx        latest    605c77e624dd  22 months ago  141MB

mysql        5.7      c20987f18b13  23 months ago  448MB

ubuntu      18.04    5a214d77f5d7  2 years ago    63.1MB

myubuntu    latest    5a214d77f5d7  2 years ago    63.1MB

node        8.14.0    3b7ecd51ffe5  4 years ago    889MB

PS C:\Users\fe> docker rmi node:8.14.0

Untagged: node:8.14.0

Untagged: node@sha256:dd2381fe1f68df03a058094097886cd96b24a47724ff5a588b90921f13e875b7

Deleted: sha256:3b7ecd51ffe5f735a3b2189bdb22098702b0b68e8e8ccb9a66577ed9ab651fef

Deleted: sha256:b43cb886e7ee087ef86f8f1e2b37369decdce12b53e164f9aa0d774740ab3e72

Deleted: sha256:f21af93c45896c4a0ac6c52069f06be001266e2b37a7ebc57fdf8fe32bc59dd6

Deleted: sha256:46007251be9b13c7a943773573227df3683bb4b369ce3103e43891cf6aa96bd9

Deleted: sha256:4ae80746f1129db339b77b93687aaa8a55359f86a9a616848bb8fe5454b4f95f

Deleted: sha256:eb91e8adb4541f0df58f6d896fee1355e04c0984b3104da1038178b8d6649b6b

Deleted: sha256:b7f634c63f4704fdffd2f4f2ec90a3e188448c5a99e7f4418555e61d63497d9f

Deleted: sha256:27a0b0f4d1e3c92972729fdb938c433c5b01107f895f2498e94929f2b096f4a3

Deleted: sha256:90d1009ce6fe3102fee728742a3bd73eea2b39c88cdda99977a3fb130dbc17ac

PS C:\Users\fe> docker images

REPOSITORY  TAG      IMAGE ID      CREATED        SIZE

nginx        latest    605c77e624dd  22 months ago  141MB

mysql        5.7      c20987f18b13  23 months ago  448MB

myubuntu    latest    5a214d77f5d7  2 years ago    63.1MB

ubuntu      18.04    5a214d77f5d7  2 years ago    63.1MB

```

当同一个镜像拥有多个标签的时候, `docker rmi `命令只是删除了该镜像多个标签中的指定标签而已,并不影响镜像文件,当镜像只剩下一个标签的时候,此时再使用 `docker rmi 命令`会彻底删 除镜像。

#### 使用镜像 ID 来删除镜

当使用` docker rmi 命令`,并且后面跟上镜像的 ID (也可以是能进行区分的部分 ID 前缀)时,会先尝试删除所有指向该镜像的标签,然后删除该镜像文件本身。当有该镜像创建的容器存在时,镜像文件默认是无法被删除的。如果想要强制删除需要使用`-f`参数,不推荐使用强制删除,一般是先删除依赖的镜像的所有容器,然后在删除镜像。

#### 清理镜像

可以通过 `docker image prune` 命令来进行清理临时的镜像文件以及没有使用的镜像

支持选项包括:

* `-a, -all`: 删除所有无用镜像,不光是临时镜像;

* ` -filter filter`: 只清理符合给定过滤器的镜像;

* `-f, -force`: 强制删除镜像,而不进行提示确认。

### 创建镜像

创建镜像的方法主要有三种:基于已有镜像的容器创建、基于本地模板导入、基于 `Dockerfile `创建。

#### 基于已有容器创建

该方法主要是使用`docker [container] commit`命令。 

命令格式为`docker [container] commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]` `docker commit [选项] 容器ID/名称 仓库名称:[标签]`,主要选项包括:

* `-a,-author=""`:作者信息;

* `-c,--change=[]`:提交的时候执行`Dockerfile指令`,包括`CMD|ENTRYPOINT ENV|EXPOSELABEL ONBUILD USER|VOLUME WORKDIR`;

* `-m,--message=""`:提交消息;

* `-p,-pause=true`:提交时暂停容器运行。

```bash

PS C:\Users\fe> docker commit -m "Added a new file" -a "Docker Newbee" 2676bfbef2a2 test:0.1

sha256:0234e669084faa2334137a2a5f3cb2f2bb35daade1b9fbc8810afdedcfafc6ec

PS C:\Users\fe> docker images

REPOSITORY  TAG      IMAGE ID      CREATED          SIZE

test        0.1      0234e669084f  11 seconds ago  63.1MB

nginx        latest    605c77e624dd  22 months ago    141MB

mysql        5.7      c20987f18b13  23 months ago    448MB

myubuntu    latest    5a214d77f5d7  2 years ago      63.1MB

ubuntu      18.04    5a214d77f5d7  2 years ago      63.1MB

```

#### 基于本地模板导入

用户也可以直接从一个操作系统模板文件导入一个镜像,主要使用`docker [container] import`命令。命令格式为`docker [image] import [OPTIONS]file|URL-[REPOSITORY :[TAG]]` 

要直接导入一个镜像,可以使用`OpenVZ`提供的模板来创建,或者用其他已导出的镜像 

模板来创建。OPENVZ模板的下载地址htp://openvz.org/Download/templates/precreated。。

#### 基于`Dockerfile `创建

基于`Dockerfile`创建是最常见的方式。`Dockerfile`是一个文本文件,利用给定的指令描述基于某个父镜像创建新镜像的过程。

### 存出和载入镜像

#### 存出镜像

如果想要将镜像保存到本地可以使用`dokcer [image] save`命令,该命令支持 `-o , -output ,string`参数导出到指定的文件中

` docker  save -o 保存的(路径)文件名称 镜像名称:标签`

```bash

docker  save -o test_0.1.tar test:0.1

```

#### 载入镜像

可以使用`docker [image] load`将导出的`tar`文件导入到本地镜像库中,支持`-i`、`-input string`选项,从指定文件中读入镜像内容。

` docker load -i F:\docker\image\myubuntu.0.1.tar` ` docker load -i 需要导入的镜像文件`

*  **--input , -i :**  指定导入的文件,代替 STDIN。

```bash

 17286@LAPTOP-IV46MOMH  ~  docker images

REPOSITORY  TAG      IMAGE ID      CREATED        SIZE

nginx        latest    605c77e624dd  22 months ago  141MB

ubuntu      latest    ba6acccedd29  2 years ago    72.8MB

 17286@LAPTOP-IV46MOMH  ~  docker load -i F:\docker\image\myubuntu.0.1.tar

Loaded image: myubuntu:latest

 17286@LAPTOP-IV46MOMH  ~  docker images

REPOSITORY  TAG      IMAGE ID      CREATED        SIZE

nginx        latest    605c77e624dd  22 months ago  141MB

myubuntu    latest    ba6acccedd29  2 years ago    72.8MB

ubuntu      latest    ba6acccedd29  2 years ago    72.8MB

```

### 上传镜像

可以使用`docker [image] push`命令上传镜像到仓库,默认是上传到官方仓库Docker Hub(需要登陆)

命令:`docker [image] push 镜像名称[:标签] |  [REGISTRY_HOST [: REGISTRY_PORT] /] NAME [: TAG]`

在第一次上传的时候会提示输入登录信息或进行注册,之后登录信息会记录到本地的docker目录下

上传的镜像名称需要在docker hub创建了对应的仓库,

```bash

 17286@LAPTOP-IV46MOMH  ~  docker tag ubuntu AAA/bbb

 17286@LAPTOP-IV46MOMH  ~  docker images

REPOSITORY      TAG      IMAGE ID      CREATED        SIZE

nginx            latest    605c77e624dd  22 months ago  141MB

banmag/changye  latest    ba6acccedd29  2 years ago    72.8MB

myubuntu        latest    ba6acccedd29  2 years ago    72.8MB

ubuntu          latest    ba6acccedd29  2 years ago    72.8MB

 17286@LAPTOP-IV46MOMH  ~  docker push AAA/bbb:latest

The push refers to repository [docker.io/AAA/bbb]

9f54eef41275: Pushed

latest: digest: sha256:7cc0576c7c0ec2384de5cbf245f41567e922aab1b075f3e8ad565f508032df17 size: 529

```

> AAA 是你的账号名称

>

> bbb是你的仓库名称

在官网docker hub中只能有一个私有仓库

#### 将镜像推送到阿里云

在阿里云创建镜像仓库


创建个人版


创建命名空间和镜像仓库,镜像仓库是用来存放镜像的,点击访问凭证,设置固定密码,回到刚才的镜像仓库中进入,然后根据提示记性操作,详细步骤后面再补充

 

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容