「r<-教程」R Docker 教程

原英文網(wǎng)址:http://ropenscilabs.github.io/r-docker-tutorial

這是專門為具有 R 和 RStudio 知識(shí)的朋友設(shè)計(jì)的 Docker 教程婆芦。該介紹旨在幫助需要 Docker 進(jìn)行項(xiàng)目的人們。我們首先解釋 Docker 是什么以及為什么有用。然后润歉,我們將詳細(xì)介紹如何將其用于可復(fù)制的分析項(xiàng)目迫摔。

準(zhǔn)備

在開(kāi)始之前嵌屎,請(qǐng)根據(jù)自己的操作系統(tǒng)安裝下面的鏈接的介紹安裝 Docker

第一課:什么是 Docker新蟆?為什么我應(yīng)該使用它砚哗?

學(xué)習(xí)目標(biāo)

  • 理解 Docker 的基本思想
  • 明白為什么 Docker 非常有用

為什么我想要使用 Docker饰及?

想象一下蔗坯,你正在 R 中進(jìn)行分析,然后將代碼發(fā)送給朋友燎含。 你的朋友在完全相同的數(shù)據(jù)集上運(yùn)行此代碼宾濒,但結(jié)果略有不同。 這可能有多種原因屏箍,例如操作系統(tǒng)不同绘梦,R 軟件包的版本不同等橘忱。 Docker 可以解決這樣的問(wèn)題。

可以將Docker容器視為你計(jì)算機(jī)內(nèi)部的一臺(tái)計(jì)算機(jī)谚咬。 這個(gè)虛擬計(jì)算機(jī)的妙處在于你可以將其發(fā)送給你的朋友鹦付。 當(dāng)他們啟動(dòng)計(jì)算機(jī)并運(yùn)行你的代碼時(shí),他們將獲得與你完全相同的結(jié)果择卦。

簡(jiǎn)單來(lái)說(shuō)敲长,你因?yàn)橄旅娴囊恍┰蚴褂?Docker:

  • 封裝所有依賴
  • 分析可重復(fù)

還有一些 Docker 可以發(fā)揮用處的地方:

  • 可移植性:由于 Docker 容器可以輕松地發(fā)送到另一臺(tái)機(jī)器,因此你可以在自己的計(jì)算機(jī)上設(shè)置好所有內(nèi)容秉继,然后在更強(qiáng)大的機(jī)器上運(yùn)行分析祈噪。
  • 可共享性:你可以將 Docker 容器發(fā)送給任何知道如何使用 Docker 的人。

基本詞匯

下面會(huì)經(jīng)常出現(xiàn)鏡像和容器這兩個(gè)詞尚辑。映像的實(shí)例稱為容器辑鲤。映像是虛擬計(jì)算機(jī)的設(shè)置。如果運(yùn)行此映像杠茬,將擁有它的一個(gè)實(shí)例月褥,我們將其稱為容器∑昂恚可以有多個(gè)運(yùn)行相同映像的容器宁赤。

第二課:在 Docker 中啟動(dòng) RStudio

學(xué)習(xí)目標(biāo)

  • 在 Docker 中啟動(dòng) RStudio
  • 將磁盤與 Docker 鏡像鏈接
  • 載入容器

安裝

首先參考 install Docker 進(jìn)行安裝,沒(méi)有必要完成鏈接中所有的教程栓票,有需要再回看它們决左。

在 Docker 中啟動(dòng) RStudio

要啟動(dòng) Docker,我們需要做的第一件事是打開(kāi)一個(gè) Unix Shell走贪。如果你在 Mac 或 Windows 上佛猛,在最后一步,你安裝了一個(gè)叫做Docker快速啟動(dòng)終端;現(xiàn)在打開(kāi)它——它看起來(lái)應(yīng)該像一個(gè)普通的 shell 提示符(~$)坠狡,但實(shí)際上它指向的是一個(gè) Docker 默認(rèn)運(yùn)行的 linux 虛擬機(jī)继找,而在本教程的其余部分,除非另有說(shuō)明逃沿,你應(yīng)該在這里完成所有操作码荔。如果您在 linux 機(jī)器上,那么您可以使用普通的舊終端提示符感挥。

在 Mac上,你也可以選擇終端并配置 Docker越败。特別是如果你得到錯(cuò)誤不能連接到Docker守護(hù)進(jìn)程触幼。Docker 守護(hù)進(jìn)程在此主機(jī)上運(yùn)行嗎?。在教程的某個(gè)時(shí)候究飞,運(yùn)行下面的命令可能會(huì)解決你的問(wèn)題:

eval "$(docker-machine env default)"

接下來(lái)置谦,我們將要求Docker運(yùn)行一個(gè)已經(jīng)存在的映像堂鲤,我們將使用來(lái)自 Rockerverse Docker映像,它將允許我們?cè)谌萜鲀?nèi)運(yùn)行RStudio媒峡,并且已經(jīng)安裝了許多有用的R包瘟栖。

docker run --rm -p 8787:8787 -e PASSWORD=yourpassword rocker/verse

--rm-p-e是允許你自定義如何運(yùn)行容器的標(biāo)志谅阿。-p告訴 Docker 你將使用一個(gè)端口在你的瀏覽器中看到 RStudio(在一個(gè)位置半哟,我們隨后指定為端口 8787:8787)。—rm 確保當(dāng)我們退出容器時(shí)签餐,容器被刪除寓涨。如果我們不這樣做,每次我們運(yùn)行一個(gè)容器氯檐,它的一個(gè)版本將被保存到我們的本地計(jì)算機(jī)戒良。這最終會(huì)導(dǎo)致大量磁盤空間的浪費(fèi),直到我們手動(dòng)刪除這些容器冠摄。稍后糯崎,我們將向你展示如何保存容器(如果你想這樣做的話)。最后河泳,-ePASSWORD 環(huán)境變量設(shè)置為 yourpassword沃呢。在堆棧中運(yùn)行帶有RStudio的容器時(shí),Rocker 需要你設(shè)置密碼乔询。出于安全考慮樟插,我們建議你將 yourpassword 更改為您自己獨(dú)特的字符串。

如果你嘗試運(yùn)行一個(gè)沒(méi)有在本地安裝的 Docker 容器竿刁,那么Docker會(huì)自動(dòng)在Docker Hub(一個(gè)在線的Docker 鏡像存儲(chǔ)庫(kù))上搜索該容器黄锤,如果它存在,就下載它食拜。

上面的命令將導(dǎo)致 RStudio-Server 不可見(jiàn)地啟動(dòng)鸵熟。要連接到它,打開(kāi)一個(gè)瀏覽器负甸,輸入http://流强,然后加上你的 ip 地址,再加上:8787呻待。如果您運(yùn)行的是 Mac 或 Windows 機(jī)器打月,您將在啟動(dòng) Docker Quickstart終端時(shí)出現(xiàn)在終端中的第一行文本中找到 ip 地址。例如蚕捉,你應(yīng)該會(huì)看到:

                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/


docker is configured to use the default machine with IP 192.168.99.100
For help getting started, check out the docs at https://docs.docker.com

你應(yīng)該在瀏覽器中鍵入 URL http://192.168.99.100:8787 奏篙。

如果你在一臺(tái) Linux 機(jī)器上運(yùn)行,你可以使用 localhost 作為 ip 地址,例如:http://localhost:8787

這將會(huì)將你導(dǎo)向 RStudio 登錄界面秘通,使用下面的信息登錄:

username: rstudio password: password(上面你設(shè)置過(guò)這個(gè)東西)

現(xiàn)在你就可以在瀏覽器中使用 RStudio 工作了为严,就像你使用 Rstudio 桌面版一樣。

下面是一個(gè)截圖示例:

現(xiàn)在試試運(yùn)行下面的代碼吧:

# make x the numbers from 1 to 5, and y the numbers from 6-10
x <- 1:5
y <- 6:10

# plot x against y
plot(x, y)

因?yàn)槲覀儎偛艈?dòng)鏡像時(shí)使用了 --rm 標(biāo)記肺稀,所以在這個(gè)機(jī)器上創(chuàng)建的任何東西在關(guān)閉后都會(huì)消失第股。你可以試試將上面的代碼保存為一個(gè)文件,然后關(guān)閉瀏覽器话原,在終端上用 Control+C 關(guān)掉容器夕吻,然后重新啟動(dòng)容器,看是否創(chuàng)建的文件是否依然存在稿静。

將磁盤與 Docker 鏡像連接以便于訪問(wèn)和保存數(shù)據(jù)文件

既然數(shù)據(jù)文件會(huì)消失梭冠,那么我們退出容器后該如何保存我們的工作呢?一個(gè)解決的辦法是將一個(gè)磁盤(例如你的本地硬盤)與一個(gè)容器連接起來(lái)改备,這樣你就可以在本地磁盤上訪問(wèn)和保存數(shù)據(jù)了控漠。

這一次當(dāng)我們啟動(dòng)容器時(shí)使用 -v 標(biāo)記指定我們項(xiàng)目的根目錄,如下所示(你的目錄可能有所不同)悬钳,:左邊是你本地計(jì)算機(jī)的路徑盐捷,右邊是容器里的路徑,一般以 /home/rstudio/ 開(kāi)始(這個(gè)鏡像已經(jīng)默認(rèn)創(chuàng)建了用戶名 RStudio 和進(jìn)行了相關(guān)配置)默勾。

docker run --rm -p 8787:8787 -v /Users/tiffanytimbers/Documents/DC/r-docker-tutorial:/home/rstudio/r-docker-tutorial rocker/verse

再一次地碉渡,在你的瀏覽器進(jìn)行 RStudio。

這一次你在 Docker 容器中啟動(dòng) RStudio 后母剥,你可以查看到下面映射的文件目錄滞诺。然后就可以載入數(shù)據(jù)進(jìn)行分析工作了:

# load gapminder data from a csv on your computer
gap5yr <- read.csv(file = 'data/gapminder-FiveYearData.csv')

畫一個(gè)分析圖:

# load ggplot library
library(ggplot2)

# plot GDP against  life expectancy
qplot(gap5yr$lifeExp, gap5yr$gdpPercap)

# save the plot
ggsave(filename = 'data/GDP_LifeExp.pdf')

讓我們將腳本保存為 plot_GDP_LifeExp.R,然后關(guān)閉容器环疼,看在本地目錄下是否能看到腳本和繪圖文件习霹。

小結(jié)

這一課我們學(xué)習(xí)了如何通過(guò)容器在瀏覽器中運(yùn)行 RStudio。學(xué)習(xí)了 --rm 標(biāo)志的作用和如何連接磁盤文件炫隶。

第三課:安裝 R 包

在 RStudio 內(nèi)安裝 R 包

這跟我們使用 RStudio 桌面版沒(méi)什么區(qū)別十嘿,試試運(yùn)行:

# install package
install.packages('gapminder')

# load library
library(gapminder)

# peek at data
head(gapminder)

太好了奋岁!現(xiàn)在我們已經(jīng)安裝好包并可以進(jìn)行工作。但是等等翁授,如果我們退出了容器會(huì)發(fā)生什么低缩?安裝的包會(huì)被刪除糟描,因?yàn)槲覀儧](méi)有保存這個(gè)版本的 Docker 鏡像著瓶。我們需要?jiǎng)?chuàng)建一個(gè)鏡像洒扎,這樣當(dāng)利用它創(chuàng)建一個(gè)新的容器時(shí),gapminder 包也已經(jīng)安裝好了檐薯,可以直接使用桐早。

為了做到這一點(diǎn),我們需要運(yùn)行 docker commit(類似 git commit)保存修改。記住哄酝,這個(gè)操作需要在關(guān)閉容器前運(yùn)行,一般我們另外打開(kāi)一個(gè)終端進(jìn)行這個(gè)操作祷膳。

我們可以使用下面的命令進(jìn)行查看(類似 linux ps 命令):

docker ps

輸出應(yīng)該類似下面展示陶衅,哈希值記錄了容器 ID:

4a6a528b35da        rocker/verse        "/init"             2 minutes ago       Up 2 minutes        0.0.0.0:8787->8787/tcp   silly_meninsky

現(xiàn)在我們?cè)谛碌慕K端中運(yùn)行下面命令,并記錄修改信息:

docker commit -m "verse + gapminder" 4a6a528b35da verse_gapminder

-m 指定修改信息直晨,哈希值指定了我們要保存的容器搀军,verse_gapminder 為保存的鏡像設(shè)定了一個(gè)名字。

現(xiàn)在我們的電腦上就有 2 個(gè)鏡像了:

docker images 
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
verse_gapminder                      latest              bb38976d03cf        57 seconds ago      1.955 GB
rocker/verse                         latest              0168d115f220        3 days ago          1.954 GB

現(xiàn)在你可以測(cè)試下新鏡像的工作情況勇皇。

安裝 R 系統(tǒng)外部依賴

許多 R 包有外部依賴罩句,如 GSL, GDAL, JAGS,為了安裝它們敛摘,你需要進(jìn)行如下的操作:

docker ps # find the ID of the running container you want to add a package to
docker exec -it <container-id> bash # a docker command to start a bash shell in your container
apt-get install libgsl0-dev # install the package, in this case GSL

如果安裝報(bào)錯(cuò)门烂,先試試 apt-get update

為了保存安裝的依賴,依舊需要進(jìn)行修改的提交:

docker commit -m "verse + gapminder + GSL" <container id>  verse_gapminder_gsl

第四課:對(duì) Docker Hub 推送或拉取鏡像

學(xué)習(xí)目標(biāo)

  • 理解鏡像來(lái)自哪里
  • 從 Docker Hub 拉取鏡像
  • 推送鏡像到 Docker Hub

從 Docker Hub 獲取鏡像

Docker Hub 是一個(gè)存儲(chǔ) Docker 鏡像的地方兄淫,當(dāng)我們運(yùn)行下面的命令時(shí)屯远,軟件首選檢查鏡像是否存在于你的計(jì)算機(jī)上。如果不存在捕虽,它會(huì)自動(dòng)去 Docker Hub 搜索和下載慨丐。

docker run --rm -p 8787:8787 rocker/verse

如果你想要從 Docker Hub 上拉取鏡像而不運(yùn)行它,可以使用命令:

docker pull rocker/verse

將鏡像放到 Docker Hub

想象一下如果你自己創(chuàng)建了一個(gè)鏡像泄私,然后想要與其他人分享房揭,你可以在 https://hub.docker.com/ 創(chuàng)建一個(gè)賬號(hào)。驗(yàn)證完郵箱之后晌端,你就可以將你的鏡像上傳了:

  1. 登錄 https://hub.docker.com/

  2. 點(diǎn)擊創(chuàng)建倉(cāng)庫(kù)

  3. 設(shè)置名字后點(diǎn)擊創(chuàng)建

  4. 使用命令行登錄 Docker Hub

    docker login --username=yourhubusername --email=youremail@company.com
    

    如果沒(méi)問(wèn)題應(yīng)該會(huì)看到下面的信息

    WARNING: login credentials saved in /home/username/.docker/config.json
    Login Succeeded
    
  5. 檢查鏡像的 ID

    docker images
    

    然后你會(huì)看到類似下面的輸出:

    REPOSITORY              TAG       IMAGE ID         CREATED           SIZE
    verse_gapminder_gsl     latest    023ab91c6291     3 minutes ago     1.975 GB
    verse_gapminder         latest    bb38976d03cf     13 minutes ago    1.955 GB
    rocker/verse            latest    0168d115f220     3 days ago        1.954 GB
    
  6. 標(biāo)記你的鏡像(打標(biāo)簽)

    docker tag bb38976d03cf yourhubusername/verse_gapminder:firsttry
    

    這里鏡像 ID 必須匹配捅暴,fisttry 是標(biāo)簽,一般選擇一些容易識(shí)別的標(biāo)簽斩松。

  7. 推送你的鏡像:

    docker push yourhubusername/verse_gapminder
    

現(xiàn)在所有人都可以使用你的鏡像了伶唯!

保存和加載鏡像

將鏡像推送到 Docker Hub 非常使用,但它有些缺點(diǎn):

  1. 受帶寬限制
  2. 推送意味著發(fā)布(私密需要額外付費(fèi))
  3. 當(dāng)在一些計(jì)算節(jié)點(diǎn)上工作時(shí)惧盹,如果每一次你都拉取 Docker Hub 的鏡像乳幸,速度會(huì)很慢

解決方案的在本地對(duì)你的鏡像進(jìn)行存檔,這樣你可以在需要的時(shí)候輕松載入钧椰。

為了這一目的粹断,你可以使用 docker save 命令。讓我們?cè)囋嚢桑?/p>

docker save verse_gapminder > verse_gapminder.tar

如果我們想要從存檔中載入鏡像嫡霞,使用下面的命令:

docker load --input verse_gapminder.tar

第五課:Dockerfile

前面我們學(xué)習(xí)了一個(gè)可以在 Docker 中運(yùn)行 RStudio 的基礎(chǔ)鏡像瓶埋,學(xué)習(xí)如何使用 docker commit 修改鏡像的內(nèi)容。這是一個(gè)非常棒的技術(shù),它讓我們可以進(jìn)行重復(fù)养筒,但如果我們想要更簡(jiǎn)單地修改鏡像中的內(nèi)容曾撤,并有一份清晰的記錄,該怎么辦呢晕粪?這就是 Dockerfile 的用武之地了挤悉。

FROM rocker/verse:latest

這告訴 Docker 以 rocker/verse 基礎(chǔ)鏡像作為開(kāi)始。FROM 命令必須是第一條指令巫湘。

接下來(lái)装悲,讓我們基于該基礎(chǔ)鏡像添加一層,讓 gapminder 提取安裝好可以直接使用:

RUN R -e "install.packages('gapminder', repos = 'http://cran.us.r-project.org')"

RUN 命令可以執(zhí)行 Shell 命令尚氛,這個(gè)例子中诀诊,我們直接通過(guò) Shell 調(diào)用包安裝命令。保存你的 Dockerfile阅嘶,返回終端属瓣,現(xiàn)在我們可以利用下面的命令構(gòu)建一個(gè)自定義鏡像:

docker build -t my-r-image .

-t my-r-image 指定鏡像名字(要小寫),. 指定構(gòu)建鏡像所需要的資源來(lái)源奈懒,這里指當(dāng)前目錄奠涌。查看鏡像:

docker images

現(xiàn)在你可以運(yùn)行你的鏡像:

docker run --rm -p 8787:8787 my-r-image

在 RStudio 控制臺(tái)中嘗試運(yùn)行:

library('gapminder')
gapminder

現(xiàn)在該包已經(jīng)是直接可以使用了!

有時(shí)候我們想要添加一些靜態(tài)文件到鏡像中磷杏,這可以使用 ADD 命令:

ADD data/gapminder-FiveYearData.csv /home/rstudio/
高級(jí)技巧:緩存層

在構(gòu)建和重構(gòu)建你的 Docker 鏡像時(shí)溜畅,你可能注意到了類似下面的輸出:

Step 2 : RUN R -e "install.packages('gapminder', repos = 'http://cran.us.r-project.org')"
 ---> Using cache
 ---> fa9be67b52d1

注意到使用的是命令的緩存版本。當(dāng)你重新構(gòu)建映像時(shí)极祸,Docker 會(huì)檢查該映像的以前版本慈格,以查看以前是否執(zhí)行了相同的命令;每一個(gè)步驟都被保存為一個(gè)單獨(dú)的層遥金,Docker 非常聰明浴捆,可以重用那些層,如果它們沒(méi)有改變稿械,并且和前面一樣的順序选泻。因此,一旦你弄清楚了你的安裝過(guò)程的一部分(特別是如果它是一個(gè)緩慢的部分)美莫,把它放在你的Dockerfile的頂部页眯,不要在這些行上面或中間放任何東西,特別是那些經(jīng)常變化的東西;這可以大大加快你的構(gòu)建過(guò)程厢呵。

簡(jiǎn)單的說(shuō)窝撵,重構(gòu)建只修改有變動(dòng)的步驟,如果很多命令沒(méi)有問(wèn)題襟铭,盡量放到頂部碌奉。

小結(jié)

本節(jié)短曾,我們學(xué)習(xí)了如何組合一個(gè) Dockerfile 用于按我們自己的想法構(gòu)建鏡像,包括 3 個(gè)命令:

  • FROM 指定基礎(chǔ)鏡像
  • RUN 運(yùn)行命令
  • ADD 添加文件

使用 docker build -t my-r-image . 構(gòu)建赐劣。

小抄:

第六課:分享你的分析

既然我們已經(jīng)學(xué)會(huì)了如何利用 Dockerfile嫉拐,我們就能夠?qū)⑽覀兯械姆治霭l(fā)給合作者。我們將分享一個(gè)包含運(yùn)行我們分析的所有依賴的鏡像魁兼。

我們通過(guò) Dockerfile 構(gòu)建該鏡像椭岩。讓我們還是以之前使用過(guò)的 rocker 鏡像開(kāi)始。這一次我們使用指定的 R 版本璃赡,通過(guò)這里查看所有可獲取的鏡像列表。版本標(biāo)簽在可重復(fù)性分析中非常有用献雅。

FROM rocker/verse:3.3.2

作為分析的一部分碉考,我們將使用 gapminder 數(shù)據(jù)集,添加下面的內(nèi)容:

RUN R -e "install.packages('gapminder', repos = 'http://cran.us.r-project.org')"

接下來(lái)將我們的分析寫成腳本并將其添加到 Dockerfile 中挺身。

library(ggplot2)
library(gapminder)

life_expentancy_plot <- ggplot(data = gapminder) + 
    geom_point(aes(x = lifeExp, y = gdpPercap, colour = continent)) 

將其添加到 Docker 鏡像中的指定目錄中:

ADD analysis.R /home/rstudio/

現(xiàn)在我們可以構(gòu)建這個(gè)鏡像然后檢查是否我們已經(jīng)具備分享的一些內(nèi)容:

docker build -t my-analysis .

查看我們的分析鏡像:

docker images

啟動(dòng)鏡像:

docker run -dp 8787:8787 my-analysis

太好了侯谁,我們的分析腳本在里面,而且數(shù)據(jù)包也已經(jīng)安裝好了章钾。

現(xiàn)在將分析推送到 dockerhub墙贱。

創(chuàng)建倉(cāng)庫(kù)后,使用下面的命令進(jìn)行登錄贱傀。

docker login --username=yourhubusername --email=youremail@company.com

檢查鏡像 ID:

docker images
REPOSITORY                         TAG                 IMAGE ID            CREATED             SIZE
my-analysis                      latest              dc63d4790eaa        2 minutes ago       3.164 GB

給要提交的鏡像打標(biāo)簽:

docker tag dc63d4790eaa yourhubusername/gapminder_my_analysis:firsttry

推送到你創(chuàng)建好的倉(cāng)庫(kù):

docker push yourhubusername/gapminder_my_analysis

現(xiàn)在你的鏡像任何人都可以使用了惨撇。

合作者通過(guò)下面的命令可以下載它:

docker pull yourhubusername/gapminder_my_analysis:firsttry

更多資料:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市府寒,隨后出現(xiàn)的幾起案子魁衙,更是在濱河造成了極大的恐慌,老刑警劉巖株搔,帶你破解...
    沈念sama閱讀 206,013評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剖淀,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡纤房,警方通過(guò)查閱死者的電腦和手機(jī)纵隔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)炮姨,“玉大人捌刮,你說(shuō)我怎么就攤上這事〗A睿” “怎么了糊啡?”我有些...
    開(kāi)封第一講書人閱讀 152,370評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)吁津。 經(jīng)常有香客問(wèn)我棚蓄,道長(zhǎng)堕扶,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,168評(píng)論 1 278
  • 正文 為了忘掉前任梭依,我火速辦了婚禮稍算,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘役拴。我一直安慰自己糊探,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布河闰。 她就那樣靜靜地躺著科平,像睡著了一般。 火紅的嫁衣襯著肌膚如雪姜性。 梳的紋絲不亂的頭發(fā)上瞪慧,一...
    開(kāi)封第一講書人閱讀 48,954評(píng)論 1 283
  • 那天,我揣著相機(jī)與錄音部念,去河邊找鬼弃酌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛儡炼,可吹牛的內(nèi)容都是我干的妓湘。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼乌询,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼榜贴!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起楣责,我...
    開(kāi)封第一講書人閱讀 36,916評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤竣灌,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后秆麸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體初嘹,經(jīng)...
    沈念sama閱讀 43,382評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評(píng)論 2 323
  • 正文 我和宋清朗相戀三年沮趣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了屯烦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,989評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡房铭,死狀恐怖驻龟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情缸匪,我是刑警寧澤翁狐,帶...
    沈念sama閱讀 33,624評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站凌蔬,受9級(jí)特大地震影響露懒,放射性物質(zhì)發(fā)生泄漏闯冷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評(píng)論 3 307
  • 文/蒙蒙 一懈词、第九天 我趴在偏房一處隱蔽的房頂上張望蛇耀。 院中可真熱鬧,春花似錦坎弯、人聲如沸纺涤。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,199評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)撩炊。三九已至,卻和暖如春崎脉,著一層夾襖步出監(jiān)牢的瞬間衰抑,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,418評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工荧嵌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人砾淌。 一個(gè)月前我還...
    沈念sama閱讀 45,401評(píng)論 2 352
  • 正文 我出身青樓啦撮,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親汪厨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赃春,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評(píng)論 2 345