Docker基本常用操作

一、運(yùn)行

docker run -it --rm \
ubuntu:18.04 \
bash
root@e7009c6ce357:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.1 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.1 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

docker run就是運(yùn)行容器的命令,具體格式我們會在 容器 一節(jié)進(jìn)行詳細(xì)講解, 我們這里簡要的說明一下上面用到的參數(shù)。

  • -it:這是兩個(gè)參數(shù),一個(gè)是 -i:交互式操作,一個(gè)是 -t終端。我們這里打算進(jìn)入bash執(zhí)行一些命令并查看返回結(jié)果,因此我們需要交互式終端。
  • --rm:這個(gè)參數(shù)是說容器退出后隨之將其刪除。默認(rèn)情況下,為了排障需求,退出的容器并不會立即刪除,除非手動 docker rm 。我們這里只是隨便執(zhí)行個(gè)命令,看看結(jié)果,不需要排障和保留結(jié)果,因此使用--rm可以避免 浪費(fèi)空間。
  • ubuntu:18.04:這是指用 ubuntu:18.04 鏡像為基礎(chǔ)來啟動容器。
  • bash :放在鏡像名后的是 命令,這里我們希望有個(gè)交互式 Shell,因此用的是 bash 。

進(jìn)入容器后,我們可以在 Shell 下操作,執(zhí)行任何所需的命令。這里,我們執(zhí)行了 cat /etc/os-release ,這是 Linux 常用的查看當(dāng)前系統(tǒng)版本的命令,從返回的 結(jié)果可以看到容器內(nèi)是 Ubuntu 18.04.1 LTS 系統(tǒng)。

最后我們通過exit退出了這個(gè)容器。

二、列出鏡像

要想列出已經(jīng)下載下來的鏡像,可以使用docker image ls命令

docker image ls

列表包含了倉庫名、標(biāo)簽 、鏡像 ID、創(chuàng)建時(shí)間以及所占用的空間。

其中倉庫名、標(biāo)簽在之前的基礎(chǔ)概念章節(jié)已經(jīng)介紹過了。鏡像 ID則是鏡像的唯一 標(biāo)識,一個(gè)鏡像可以對應(yīng)多個(gè) 標(biāo)簽。因此,在上面的例子中,我們可以看到 ubuntu:18.04 和 ubuntu:latest 擁有相同的 ID,因?yàn)樗鼈儗?yīng)的是同一個(gè)鏡像。

查看鏡像、容器、數(shù)據(jù)卷所占用的空間

docker system df

顯示中間層鏡像

為了加速鏡像構(gòu)建、重復(fù)利用資源,Docker 會利用 中間層鏡像。所以在使用一段 時(shí)間后,可能會看到一些依賴的中間層鏡像。默認(rèn)的 docker image ls 列表中 只會顯示頂層鏡像,如果希望顯示包括中間層鏡像在內(nèi)的所有鏡像的話,需要加 -a 參數(shù)。

docker image ls -a

這樣會看到很多無標(biāo)簽的鏡像,與之前的虛懸鏡像不同,這些無標(biāo)簽的鏡像很多都 是中間層鏡像,是其它鏡像所依賴的鏡像。這些無標(biāo)簽鏡像不應(yīng)該刪除,否則會導(dǎo) 致上層鏡像因?yàn)橐蕾噥G失而出錯(cuò)。實(shí)際上,這些鏡像也沒必要刪除,因?yàn)橹罢f 過,相同的層只會存一遍,而這些鏡像是別的鏡像的依賴,因此并不會因?yàn)樗鼈儽?列出來而多存了一份,無論如何你也會需要它們。只要刪除那些依賴它們的鏡像 后,這些依賴的中間層鏡像也會被連帶刪除。

列出部分鏡像

不加任何參數(shù)的情況下,docker image ls會列出所有頂層鏡像,但是有時(shí)候我們只希望列出部分鏡像。docker image ls有好幾個(gè)參數(shù)可以幫助做到這個(gè)事情。

根據(jù)倉庫名列出鏡像

docker image ls ubuntu

列出特定的某個(gè)鏡像,也就是說指定倉庫名和標(biāo)簽

docker image ls ubuntu:18.04

除此以外, docker image ls 還支持強(qiáng)大的過濾器參數(shù) --filter ,或者簡寫 -f 。之前我們已經(jīng)看到了使用過濾器來列出虛懸鏡像的用法,它還有更多的用 法。比如,我們希望看到在 mongo:3.2之后建立的鏡像,可以用下面的命令:

docker image ls -f since=mongo:3.2

想查看某個(gè)位置之前的鏡像也可以,只需要把since換成before即可。此外,如果鏡像構(gòu)建時(shí),定義了LABEL ,還可以通LABEL來過濾。

docker image ls -f label=com.example.version=0.1

以特定格式顯示

默認(rèn)情況下,docker image ls會輸出一個(gè)完整的表格,但是我們并非所有時(shí)候 都會需要這些內(nèi)容。比如,剛才刪除虛懸鏡像的時(shí)候,我們需要利用 docker image ls 把所有的虛懸鏡像的 ID 列出來,然后才可以交給 docker image rm 命令作為參數(shù)來刪除指定的這些鏡像,這個(gè)時(shí)候就用到了 -q 參數(shù)。

docker image ls -q

三、刪除本地鏡像

如果要刪除本地的鏡像,可以使用docker image rm命令,其格式為:

docker image rm [選項(xiàng)] <鏡像1> [<鏡像2> ...]

用 ID、鏡像名、摘要刪除鏡像
其中,<鏡像>可以是鏡像短 ID、鏡像長 ID、鏡像名或者鏡像摘要。

我們可以用鏡像的完整 ID,也稱為 長 ID ,來刪除鏡像。使用腳本的時(shí)候可能會 用長 ID,但是人工輸入就太累了,所以更多的時(shí)候是用 短 ID 來刪除鏡 像。 docker image ls 默認(rèn)列出的就已經(jīng)是短 ID 了,一般取前3個(gè)字符以上,

只要足夠區(qū)分于別的鏡像就可以了。

Untagged 和 Deleted

如果觀察上面這幾個(gè)命令的運(yùn)行輸出信息的話,你會注意到刪除行為分為兩類,一 類是 Untagged ,另一類是Deleted 。我們之前介紹過,鏡像的唯一標(biāo)識是其 ID 和摘要,而一個(gè)鏡像可以有多個(gè)標(biāo)簽。

因此當(dāng)我們使用上面命令刪除鏡像的時(shí)候,實(shí)際上是在要求刪除某個(gè)標(biāo)簽的鏡像。 所以首先需要做的是將滿足我們要求的所有鏡像標(biāo)簽都取消,這就是我們看到的 Untagged 的信息。因?yàn)橐粋€(gè)鏡像可以對應(yīng)多個(gè)標(biāo)簽,因此當(dāng)我們刪除了所指定 的標(biāo)簽后,可能還有別的標(biāo)簽指向了這個(gè)鏡像,如果是這種情況,那么Delete行為就不會發(fā)生。所以并非所有的 docker image rm都會產(chǎn)生刪除鏡像的行 為,有可能僅僅是取消了某個(gè)標(biāo)簽而已。

當(dāng)該鏡像所有的標(biāo)簽都被取消了,該鏡像很可能會失去了存在的意義,因此會觸發(fā) 刪除行為。鏡像是多層存儲結(jié)構(gòu),因此在刪除的時(shí)候也是從上層向基礎(chǔ)層方向依次 進(jìn)行判斷刪除。鏡像的多層結(jié)構(gòu)讓鏡像復(fù)用變得非常容易,因此很有可能某個(gè)其它 鏡像正依賴于當(dāng)前鏡像的某一層。這種情況,依舊不會觸發(fā)刪除該層的行為。直到 沒有任何層依賴當(dāng)前層時(shí),才會真實(shí)的刪除當(dāng)前層。這就是為什么,有時(shí)候會奇 怪,為什么明明沒有別的標(biāo)簽指向這個(gè)鏡像,但是它還是存在的原因,也是為什么 有時(shí)候會發(fā)現(xiàn)所刪除的層數(shù)和自己 docker pull 看到的層數(shù)不一樣的原因。

除了鏡像依賴以外,還需要注意的是容器對鏡像的依賴。如果有用這個(gè)鏡像啟動的 容器存在(即使容器沒有運(yùn)行),那么同樣不可以刪除這個(gè)鏡像。之前講過,容器 是以鏡像為基礎(chǔ),再加一層容器存儲層,組成這樣的多層存儲結(jié)構(gòu)去運(yùn)行的。因此該鏡像如果被這個(gè)容器所依賴的,那么刪除必然會導(dǎo)致故障。如果這些容器是不需 要的,應(yīng)該先將它們刪除,然后再來刪除鏡像。

用 docker image ls 命令來配合

像其它可以承接多個(gè)實(shí)體的命令一樣,可以使用 docker image ls -q 來配合使 用 docker image rm ,這樣可以成批的刪除希望刪除的鏡像。我們在“鏡像列表”章節(jié)介紹過很多過濾鏡像列表的方式都可以拿過來使用。

比如,我們需要刪除所有倉庫名為redis的鏡像:

docker image rm $(docker image ls -q redis)

或者刪除所有在mongo:3.2之前的鏡像:

docker image rm $(docker image ls -q -f before=mongo:3.2)

充分利用你的想象力和 Linux 命令行的強(qiáng)大,你可以完成很多非常贊的功能。

三、操作 Docker 容器

容器是 Docker 又一核心概念。

簡單的說,容器是獨(dú)立運(yùn)行的一個(gè)或一組應(yīng)用,以及它們的運(yùn)行態(tài)環(huán)境。對應(yīng)的, 虛擬機(jī)可以理解為模擬運(yùn)行的一整套操作系統(tǒng)(提供了運(yùn)行態(tài)環(huán)境和其他系統(tǒng)環(huán) 境)和跑在上面的應(yīng)用。

本節(jié)將具體介紹如何來管理一個(gè)容器,包括創(chuàng)建、啟動和停止等。

啟動容器

啟動容器有兩種方式,一種是基于鏡像新建一個(gè)容器并啟動,另外一個(gè)是將在終止 狀態(tài)(stopped )的容器重新啟動。

因?yàn)?Docker 的容器實(shí)在太輕量級了,很多時(shí)候用戶都是隨時(shí)刪除和新創(chuàng)建容器。

新建并啟動

所需要的命令主要為docker run。 例如,下面的命令輸出一個(gè) “Hello World”,之后終止容器。

docker run ubuntu:18.04 /bin/echo 'Hello world'

Hello world

這跟在本地直接執(zhí)行 /bin/echo 'hello world'幾乎感覺不出任何區(qū)別。 下面的命令則啟動一個(gè) bash 終端,允許用戶進(jìn)行交互。

docker run -t -i ubuntu:18.04 /bin/bash

root@af8bae53bdd3:/#

其中,-t 選項(xiàng)讓Docker分配一個(gè)偽終端(pseudo-tty)并綁定到容器的標(biāo)準(zhǔn)輸入 上,-i則讓容器的標(biāo)準(zhǔn)輸入保持打開。
在交互模式下,用戶可以通過所創(chuàng)建的終端來輸入命令,例如

root@af8bae53bdd3:/# pwd
/
root@af8bae53bdd3:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin
srv sys tmp usr var

當(dāng)利用 docker run 來創(chuàng)建容器時(shí),Docker 在后臺運(yùn)行的標(biāo)準(zhǔn)操作包括:

  • 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
  • 利用鏡像創(chuàng)建并啟動一個(gè)容器
  • 分配一個(gè)文件系統(tǒng),并在只讀的鏡像層外面掛載一層可讀寫層
  • 從宿主主機(jī)配置的網(wǎng)橋接口中橋接一個(gè)虛擬接口到容器中去
  • 從地址池配置一個(gè) ip 地址給容器
  • 執(zhí)行用戶指定的應(yīng)用程序 執(zhí)行完畢后容器被終止

啟動已終止容器

可以利用 docker container start命令,直接將一個(gè)已經(jīng)終止的容器啟動運(yùn)行。

容器的核心為所執(zhí)行的應(yīng)用程序,所需要的資源都是應(yīng)用程序運(yùn)行所必需的。除此 之外,并沒有其它的資源??梢栽趥谓K端中利用 pstop 來查看進(jìn)程信息。

root@ba267838cc1b:/# ps

可見,容器中僅運(yùn)行了指定的 bash 應(yīng)用。這種特點(diǎn)使得 Docker 對資源的利用率 極高,是貨真價(jià)實(shí)的輕量級虛擬化。

后臺運(yùn)行

更多的時(shí)候,需要讓 Docker 在后臺運(yùn)行而不是直接把執(zhí)行命令的結(jié)果輸出在當(dāng)前宿主機(jī)下。此時(shí),可以通過添加 -d參數(shù)來實(shí)現(xiàn)。 下面舉兩個(gè)例子來說明一下。 如果不使用 -d 參數(shù)運(yùn)行容器。

$ docker run ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
hello world
hello world
hello world
hello world

此時(shí)容器會在后臺運(yùn)行并不會把輸出的結(jié)果 (STDOUT) 打印到宿主機(jī)上面(輸出結(jié) 果可以用 docker logs 查看)。 注: 容器是否會長久運(yùn)行,是和 docker run 指定的命令有關(guān),和 -d 參數(shù)無 關(guān)。 使用 -d 參數(shù)啟動后會返回一個(gè)唯一的 id,也可以通過 docker container ls命令來查看容器信息。要獲取容器的輸出信息,可以通過docker container logs命令。

終止容器

可以使用 docker container stop 來終止一個(gè)運(yùn)行中的容器。 此外,當(dāng) Docker 容器中指定的應(yīng)用終結(jié)時(shí),容器也自動終止。 例如對于上一章節(jié)中只啟動了一個(gè)終端的容器,用戶通過 exit來退出終端時(shí),所創(chuàng)建的容器立刻終止。

終止?fàn)顟B(tài)的容器可以用 docker container ls -a 命令看到。

處于終止?fàn)顟B(tài)的容器,可以通過docker container start 命令來重新啟動。
此外,docker container restart 命令會將一個(gè)運(yùn)行態(tài)的容器終止,然后再重新啟動它。

進(jìn)入容器

在使用-d 參數(shù)時(shí),容器啟動后會進(jìn)入后臺。 某些時(shí)候需要進(jìn)入容器進(jìn)行操作,包括使用 docker attach 命令或 docker exec 命令,推薦大家使用 docker exec 命令,原因會在下面說明。

attach命令

下面示例如何使用docker attach命令。

docker run -dit ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550

docker container ls

docker attach 243c
root@243c32535da7:/#

注意: 如果從這個(gè) stdin 中 exit,會導(dǎo)致容器的停止。

exec命令

-i -t 參數(shù)

docker exec后邊可以跟多個(gè)參數(shù),這里主要說明-i -t 參數(shù)。
只用 -i 參數(shù)時(shí),由于沒有分配偽終端,界面沒有我們熟悉的 Linux 命令提示符,但命令執(zhí)行結(jié)果仍然可以返回。
當(dāng) -i -t 參數(shù)一起使用時(shí),則可以看到我們熟悉的 Linux 命令提示符。

docker run -dit ubuntu
69d137adef7a8a689cbcb059e94da5489d3cddd240ff675c640c8d96e84fe1f6

docker container ls

docker exec -i 69d1 bash
ls
bin
boot
dev

docker exec -it 69d1 bash
root@69d137adef7a:/#

如果從這個(gè) stdin 中 exit,不會導(dǎo)致容器的停止。這就是為什么推薦大家使用 docker exec 的原因。
更多參數(shù)說明請使用docker exec --help查看。

導(dǎo)出和導(dǎo)入容器

導(dǎo)出容器

如果要導(dǎo)出本地某個(gè)容器,可以使用docker export命令。

docker container ls -a

docker export 7691a814370e > ubuntu.tar
這樣將導(dǎo)出容器快照到本地文件。

導(dǎo)入容器快照

可以使用docker import從容器快照文件中再導(dǎo)入為鏡像,例如

cat ubuntu.tar | docker import - test/ubuntu:v1.0

docker image ls

此外,也可以通過指定 URL 或者某個(gè)目錄來導(dǎo)入,例如

docker import http://example.com/exampleimage.tgz example/imagerepo

注:用戶既可以使用 docker load來導(dǎo)入鏡像存儲文件到本地鏡像庫,也可以使用docker import來導(dǎo)入一個(gè)容器快照到本地鏡像庫。這兩者的區(qū)別在于容 器快照文件將丟棄所有的歷史記錄和元數(shù)據(jù)信息(即僅保存容器當(dāng)時(shí)的快照狀態(tài)),而鏡像存儲文件將保存完整記錄,體積也要大。此外,從容器快照文件導(dǎo)入時(shí)可以重新指定標(biāo)簽等元數(shù)據(jù)信息。

刪除容器

可以使用docker container rm來刪除一個(gè)處于終止?fàn)顟B(tài)的容器。例如

docker container rm trusting_newton

如果要刪除一個(gè)運(yùn)行中的容器,可以添加-f參數(shù)。Docker 會發(fā)送SIGKILL信號給容器。

清理所有處于終止?fàn)顟B(tài)的容器

docker container ls -a 命令可以查看所有已經(jīng)創(chuàng)建的包括終止?fàn)顟B(tài)的容器,如果數(shù)量太多要一個(gè)個(gè)刪除可能會很麻煩,用下面的命令可以清理掉所有處于終止?fàn)顟B(tài)的容器。

docker container prune

四、Docker 數(shù)據(jù)管理


這一節(jié)介紹如何在 Docker 內(nèi)部以及容器之間管理數(shù)據(jù),在容器中管理數(shù)據(jù)主要有兩種方式:

  • 數(shù)據(jù)卷(Volumes)
  • 掛載主機(jī)目錄 (Bind mounts)

數(shù)據(jù)卷

數(shù)據(jù)卷是一個(gè)可供一個(gè)或多個(gè)容器使用的特殊目錄,它繞過 UFS,可以提供很多有用的特性:

  • 數(shù)據(jù)卷 可以在容器之間共享和重用
  • 數(shù)據(jù)卷的修改會立馬生效
  • 數(shù)據(jù)卷的更新,不會影響鏡像
  • 數(shù)據(jù)卷默認(rèn)會一直存在,即使容器被刪除

注意: 數(shù)據(jù)卷的使用,類似于 Linux 下對目錄或文件進(jìn)行 mount,鏡像中的被指定為掛載點(diǎn)的目錄中的文件會隱藏掉,能顯示看的是掛載的數(shù)據(jù)卷

創(chuàng)建一個(gè)數(shù)據(jù)卷

docker volume create my-vol

查看所有的數(shù)據(jù)卷

docker volume ls

在主機(jī)里使用以下命令可以查看指定數(shù)據(jù)卷的信息

docker volume inspect my-vol
[
    {
      "Driver": "local",
      "Labels": {},
      "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
      "Name": "my-vol",
      "Options": {},
      "Scope": "local"
    }
]

啟動一個(gè)掛載數(shù)據(jù)卷的容器

在用 docker run 命令的時(shí)候,使用--mount 標(biāo)記來將數(shù)據(jù)卷掛載到容器里。在一次 docker run 中可以掛載多個(gè)數(shù)據(jù)卷。
下面創(chuàng)建一個(gè)名為web的容器,并加載一個(gè)數(shù)據(jù)卷到容器的/webapp目錄。

docker run -d -P \
--name web \
# -v my-vol:/wepapp \
--mount source=my-vol,target=/webapp \
training/webapp \
python app.py

查看數(shù)據(jù)卷的具體信息

在主機(jī)里使用以下命令可以查看web容器的信息

docker inspect web

數(shù)據(jù)卷信息在 "Mounts" Key 下面

"Mounts": [

    {
        "Type": "volume",
        "Name": "my-vol",
        "Source": "/var/lib/docker/volumes/my-vol/_data",
        "Destination": "/app",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
],

刪除數(shù)據(jù)卷

docker volume rm my-vol

數(shù)據(jù)卷是被設(shè)計(jì)用來持久化數(shù)據(jù)的,它的生命周期獨(dú)立于容器,Docker 不會在 容器被刪除后自動刪除數(shù)據(jù)卷,并且也不存在垃圾回收這樣的機(jī)制來處理沒有任何容器引用的數(shù)據(jù)卷 。如果需要在刪除容器的同時(shí)移除數(shù)據(jù)卷。可以在刪除容器的時(shí)候使用docker rm -v這個(gè)命令。
無主的數(shù)據(jù)卷可能會占據(jù)很多空間,要清理請使用以下命令

docker volume prune

掛載主機(jī)目錄

掛載一個(gè)主機(jī)目錄作為數(shù)據(jù)卷

使用--mount標(biāo)記可以指定掛載一個(gè)本地主機(jī)的目錄到容器中去。

docker run -d -P \
--name web \
# -v /src/webapp:/opt/webapp \
--mount type=bind,source=/src/webapp,target=/opt/webapp \
training/webapp \
python app.py

上面的命令加載主機(jī)的 /src/webapp 目錄到容器的 /opt/webapp 目錄。這個(gè) 功能在進(jìn)行測試的時(shí)候十分方便,比如用戶可以放置一些程序到本地目錄中,來查看容器是否正常工作。本地目錄的路徑必須是絕對路徑,以前使用 -v 參數(shù)時(shí)如果本地目錄不存在 Docker 會自動為你創(chuàng)建一個(gè)文件夾,現(xiàn)在使用 --mount 參數(shù)時(shí)如果本地目錄不存在,Docker 會報(bào)錯(cuò)。

Docker 掛載主機(jī)目錄的默認(rèn)權(quán)限是讀寫,用戶也可以通過增加 readonly指定為只讀

docker run -d -P \
--name web \
# -v /src/webapp:/opt/webapp:ro \
--mount type=bind,source=/src/webapp,target=/opt/webapp,readonly \
training/webapp \
python app.py

加了readonly 之后,就掛載為只讀了,如果你在容器內(nèi)/opt/webapp目錄新建文件,會顯示如下錯(cuò)誤

/opt/webapp # touch new.txt
touch: new.txt: Read-only file system

查看數(shù)據(jù)卷的具體信息

在主機(jī)里使用以下命令可以查看web容器的信息。

docker inspect web

掛載主機(jī)目錄的配置信息在 "Mounts" Key 下面

"Mounts": [
      {
        "Type": "bind",
        "Source": "/src/webapp",
        "Destination": "/opt/webapp",
        "Mode": "",
        "RW": true,
         "Propagation": "rprivate"
    }
],

掛載一個(gè)本地主機(jī)文件作為數(shù)據(jù)卷

--mount標(biāo)記也可以從主機(jī)掛載單個(gè)文件到容器中

$ docker run --rm -it \
# -v $HOME/.bash_history:/root/.bash_history \
    --mount type=bind,source=$HOME/.bash_history,target=/root/.ba
sh_history \
    ubuntu:18.04 \
    bash
root@2affd44b4667:/# history
1 ls
2 diskutil list

這樣就可以記錄在容器輸入過的命令了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,619評論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,155評論 3 425
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,635評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,539評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,255評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,646評論 1 326
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,655評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,838評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,399評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,146評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,338評論 1 372
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,893評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,565評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,983評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,257評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,059評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,296評論 2 376