如何使用docker搭建開發(fā)環(huán)境

我的主力機是windows,windows下面有太多提升效率的軟件.但是開發(fā)的時候不得不使用linux.就單單開發(fā)而言.我還是喜歡使用linux.所以就造成了我得在windows下面使用虛擬機.這是最開始的辦法.后面得知有vagrant這個東西之后,用了一陣子感覺還不錯.但是我使用的時候動不動就會出現(xiàn)一些問題,所以一怒之下決定學(xué)學(xué)docker.然后使用docker來作為開發(fā)環(huán)境.

使用docker作為開發(fā)環(huán)境大概我有這幾點要求

部署快,不要換臺機子裝了一天的環(huán)境

穩(wěn)定...

輕輕輕!

container得可以訪問本機所在局域網(wǎng)

可以實現(xiàn)文件共享

在我接觸了一陣子docker之后,發(fā)現(xiàn)docker可以滿足我大部分意淫出來的美好開發(fā)環(huán)境.折騰一番之后終于搞定,于是祭出本文.希望可以幫助到需要的人.

學(xué)習(xí)本篇之前希望你對docker有一丟丟的了解,一丟丟就可以了.

安裝.

我一般不喜歡講如何安裝一個軟件,但是介于docker的一些問題.還是講講.

如果是windows10之前的用戶,那么安裝docker比較麻煩. 你可能需要一個Docker Toolbox的東西,具體安裝方式請自行g(shù)oogle.因為我的機子是Windows10的.

如果你是Windows10的用戶,恭喜你.你只要點這里下載一個exe文件,然后就可以無腦安裝了.但是要保證開啟Hyper-V功能.如何開啟看這里.注意,這個開啟之后就不能使用virtualbox虛擬機了.

安裝好之后,啟動docker在左下角就可以看到docker的logo了.之后我們的操作都是在PowerShell/CMD下面執(zhí)行的了.執(zhí)行docker info會看到下面的內(nèi)容

PSC:\Windows\system32\WindowsPowerShell\v1.0>dockerinfo

Containers: 1

Running: 1

Paused: 0

Stopped: 0

Images: 4

........

由于docker主機在外國,安裝好之后我們需要更改下源,不然下載image的時候會很慢.這里使用daoCloud提供的鏡像,你需要注冊登錄之后,獲取到每個人獨一無二的url.然后粘貼要下面就可以了.記得重啟啊喂...

基本概念

在使用docker之前你要明白兩個概念,兩個學(xué)docker過程中一定會一直強調(diào)的概念

image

container (這種術(shù)語直接使用英文,不做翻譯)

這兩個是整個docker的基礎(chǔ)概念,這里本著不負責(zé)任的僥幸心理大概的說一下這兩個的區(qū)別.

image是靜態(tài)的,類比為面向?qū)ο缶褪且粋€類

container是動態(tài)運行的,類比為面向?qū)ο缶褪且粋€實例化的對象.

一般,container是可運行的,我們啟動一個container之后,這個container里面就是我們的linux環(huán)境.

懂得了上面的意思,你就明白了我們要做的事情很簡單:找一個合適的image,這個image里面應(yīng)該包含一切開發(fā)時候所需要的東西, 然后啟動它,我們就可以在這個container環(huán)境上工作了.當然這個時候container應(yīng)該可以跟宿主共享文件.并且可以在本局域網(wǎng)內(nèi)可以被訪問到.

在繼續(xù)搭建我們的開發(fā)環(huán)境之前,我們還是要先學(xué)一點docker的命令和概念的.

id&&name

每個image都有一個唯一的id來標識,同樣container也有.這個唯一的id一般很長,比如:c59dc2dfad95,但是一般我們輸入的時候只要輸入若干位能標識當前系統(tǒng)內(nèi)唯一標識某一個image就可以了.比如只要輸入c59d可能就可以標識這個image.除了id,還可以給一個image起名字,這樣子也可以通過name來操作一個image.

run

通過docker run image_name可以直接啟動本地的一個image.這個命令后面可以加很多子參數(shù)來開啟其他功能.如果本地不存在這個image,那么docker會去官方的倉庫去下載,這個倉庫你可以理解為github一樣的網(wǎng)站,上面存放了許多別人push上去的image.

tag

每個image都有一個名稱.除了名稱之外還有一個叫做tag的東西,這個稱之為標簽的東西可以用來標識同一個image的不同版本.如果你沒有給一個image指定一個tag,那么docker會默認為這個iamge添加一個名為:latest的tag.如果你使用docker run ubuntu,那么就會默認運行ubuntu:latest.如果本地沒有這個image,那么就會去從倉庫下載ubuntu:latest的iamge.很多時候你會看到ubuntu:14.04的image.這個14.04就是代表這個image的tag.只是很多時候image制作者把tag用來標記version了而已.

docker images

這個命令會列出本地所有的images.每個image都會有一個獨一無二的id.如下面IMAGE ID字段.

PSC:\Windows\system32\WindowsPowerShell\v1.0>dockerimages

REPOSITORYTAGIMAGEIDCREATEDSIZE

ubuntu-oklatest5f93b91bc20826hoursago423.7MB

ubuntulatesta421b4d8494d27hoursago423.1MB

ubuntu14.043f755ca427302daysago188MB

docker ps

這個命令會列出所有在運行的container.當運行docker ps -a就會列出所有的container.包括已經(jīng)退出的container.

docker commit

這個命令可以把一個container制作成一個image.

docker rm && docker rmi

docker rm container_id可以用來刪除一個container.docker rmi image_id/image_name可以用來刪除一個image.

AUFS

很多文章講docker都會把這個放到后面一點講.反正不會在類似"使用docker做開發(fā)環(huán)境"的文章里面講. 但是我覺得這個東西是理解docker的關(guān)鍵.所以一定要講.

AUFS比不是docker獨有的,很多Linux的發(fā)行版中都用到了這個特性.說起AUFS,這個東西是UFS的升級版,前面的A就是代表advanced的意思.那AUFS/UFS到底是個什么東西?

所謂AUFS,Advanced Union File System 就是把不同物理位置的目錄合并mount到同一個目錄中.這種技術(shù)有一點典型的應(yīng)用:有些linux發(fā)行版只要插入一個光盤就可以直接運行.不用進行安裝.你對系統(tǒng)文件進行的增刪改只是反映在電腦的硬盤上面,不會影響到光盤的內(nèi)容.即對光盤只讀不寫.那么docker是如何使把這個技術(shù)應(yīng)用到docker上?

docker把一個鏡像分成了很多層layer.這些層合并在一起才成為了一個完整的image.這樣子有什么好處?最直觀的一點就是,ubuntu15.04跟ubuntu16.04的image可能只有一點點差別.這點差別體現(xiàn)在第四層layer上.那么ubuntu15.04跟16.04就可以共享前三層layer.這樣子如果你本地有了ubuntu15.04的image.那么再pull ubuntu16.06的時候只要把第四層的pull下來就可以了.

而且,image的所有層都是只讀的,當你啟動一個image當做container運行的時候,docker會在image的只讀層上加一層薄薄的可寫層.你在container里面做的所有操作都是反映在可寫層.當你退出container之后,下次啟動同一個image,之前操作的所有東西都會沒有掉.一個重新做人的image.

這個時候有一個問題就來了,我們pull一個image,啟動了container.好不容易把該安裝的軟件都安裝好了,然后退出了container.之前安裝的軟件就都沒有了!這個時候我們就要使用commit命令了.commit命令可以把當前的可寫層合并到image的只讀層里面.這樣子這個image又多了一層.下次我們啟動這個image的時候安裝的軟件就都還在了.

一個image由好幾層layer構(gòu)成.每個layer都是一個只讀層

當啟動一個container之后,就會在iamge的只讀層基礎(chǔ)上添加一個可寫層.所有對container執(zhí)行的操作都反映在container上.(以上圖片都來自docker文檔.)

這里提一點,當使用docker images命令查看iamge信息的時候,后面的SIZE是表示當前iamge所占用的大小,但是不意味著所有SIZE相加起來就是占用磁盤空間的總大小.一定要注意,可能有image共享若干層layer.這些layer在相加的時候被計算了好幾遍.

PSC:\Windows\system32\WindowsPowerShell\v1.0>dockerimages

REPOSITORYTAGIMAGEIDCREATEDSIZE

? ? ? ? ? ? ? ? ? ? ? ? ? ? 12e32b701daa25minutesago188MB

ubuntu14.043f755ca427303daysago188MB

centos6? ? ? ? ? ? ? ? ? 8315978ceaaa6weeksago194.6MB

刪除

上面的命令提到刪除有rm跟rmi兩個,rm是用來刪除一個已經(jīng)退出的container.rmi是用來刪除一個image的.有了上面AUFS的概念之后,要明白的是我們使用docker rm container_id的時候,其實只是刪除掉了一層可寫層的數(shù)據(jù).因為只讀層是container跟image共享的.只要iamge沒有被刪掉,那么只讀層的數(shù)據(jù)一定也不會被刪除掉.

同樣,當多個image共享若干層只讀層的時候,刪除掉一個image.只是刪除掉了這個image獨有的一層只讀層數(shù)據(jù).其他共享的數(shù)據(jù)并沒有被刪除掉,只有當刪除掉所有的image之后,共享的layer層才會被刪掉.

執(zhí)行刪除命令的時候會看到如下的信息,這里每一次deleted都是代表刪除掉了一層layer.

PSC:\Windows\system32\WindowsPowerShell\v1.0>dockerrmiubuntu-fin

Untagged:ubuntu-fin:latest

Deleted:sha256:9e0728e8edbaf72846c43c629590fba5f46b1d705111d3fb1d79b9cf03a6c50c

Deleted:sha256:d53e457ca7161cd6f2d1b6678ecaafd19043dcaeb1363471867e1047819268fa

Deleted:sha256:496ef4fa137e03d80cf821745f875860d3d3120447326b8609938aa70f2edbd9

Deleted:sha256:12e32b701daa90c435176a273b2b41b4bfb219523c1ae396dc2f7068bbb6c088

Deleted:sha256:e8f29656cf54ad60a17d4b38362d9207b52a846cce3cc13e245fc3b799ff53e9

Deleted:sha256:48f6b521c809e40468886b0a159040503d00a0abb1eabf310451edfea562b459

Deleted:sha256:e94abc94ab1aff00280016eaf0649a75270886a2b60c8fe862ca549a0601949f

Deleted:sha256:3f755ca4273009a8b9d08aa156fbb5e601ed69dc698860938f36b2109c19cc39

Deleted:sha256:565903b66233d5576592815ca4d499bd6fe09a9b4baf83f345aaf64544f1cd78

Deleted:sha256:b653e4373a4b35aa760ff67cfa3de2c9fe3c089823b63ec797eb04de256f86ba

Deleted:sha256:362e536c4e530b94ce4204461e4f8c998705bcb98c91be54dd40b22f50531f3a

Deleted:sha256:b69ad682d83af6a6962b4a60a0b5f033c8d39efcd20dbdf320b6dd8136e50aae

Deleted:sha256:bc224b1b676d12be2a49f99778dda08b90d22747244d0a0afcdf4cfeb7db5d89

我們再刪除iamge的時候有時候不能成功刪除.大概原因有一下幾點:

container正在運行,你刪除這個container會失敗.應(yīng)該使用docker stop container_id退出當前container再嘗試刪除.

container退出了,刪除當前image也會失敗.因為container雖然退出,當前container保存著運行環(huán)境等數(shù)據(jù).container是在image的基礎(chǔ)上添加了一層可寫層.所以他們是共享只讀層的.

刪除一個image會有Untagged: ubuntu:14.04.這個不是沒有刪除成功.這個是因為有其他image跟這個ubuntu:14.04共享layer層.所以刪除時候并沒有真正刪除掉layer層的數(shù)據(jù).

ok,有了上面的預(yù)備知識,我們現(xiàn)在可以開始準備我們的環(huán)境了.剛剛說過,我們退出一個container之后在container所安裝的軟件,添加的文件等等數(shù)據(jù)都會丟失掉,所以正確的辦法應(yīng)該是:在一個container環(huán)境中配置好所有開發(fā)要用到的東西之后,使用docker commit命令來把當前這個container制作成一個image.然后下次我們啟動這個image的時候環(huán)境就是我們所需要的了.但是這樣子會存在三個問題:

當別人給你一個image之后,你知道這個image里面安裝了哪些文件,修改了哪些數(shù)據(jù)么?

每次commit都會形成一個新的只讀層.commit次數(shù)多了會使得image變得越來越臃腫.

再著,一個image動輒2,3G.帶著這么大個文件跑也不優(yōu)雅.

要解決上面的這些問題,就要使用Dockerfile了.所以我們開始之前還要做點功課.

Dockerfile

Dockerfile是用來描述如何構(gòu)建一個image的,Dockerfile由一些指令構(gòu)成,全部指令大概有20個左右,這里不全部講解.只講一些我們下面會用到的.具體Dockerfile的全部用法參考Docker官方出的最佳實踐.

FROM

我們要制作的image必然是基于某個現(xiàn)有image的基礎(chǔ),from命令就是用來指定使用哪個基礎(chǔ)iamge的.像很多ubuntu官方在Docker Hub上維護由官方的image.我們下面開發(fā)環(huán)境的搭建就是基于ubuntu:14.04的環(huán)境下完成的.

COPY && ADD

copy命令是把宿主機上的文件拷貝到image中.add可以是copy的高級版.

copy要求拷貝的文件在宿主機上存在

add可以指定一個url座位源文件,docker會自動去下載這個url的文件, 然后拷貝到image中.

我們待會兒就會用到add指令,因為我們需要使用163的ubuntu源來替換ubuntu原生的apt-get源.所以我們的Dockerfile會有類似的指令 :ADD http://mirrors.163.com/.help/sources.list.trusty /etc/apt/sources.list.

CMD

這個是指定啟動一個container之后,默認執(zhí)行的命令.我們執(zhí)行docker run ubuntu:14.04啟動一個container之后,默認就進入了bash界面.這就說明這個ubuntu:14.04的CMD就是bash.

這里要澄清一個概念.使用docker run之后默認進入了bash會讓很多人以為啟動container跟啟動一個虛擬機沒什么區(qū)別.其實不是的.docker的container就是為了某個進程而存在的,這個進程就是CMD所指定的程序.比如:CMD /bin/bash就是啟動了bash.當我們退出了bash之后,整個container也就退出了.如果你的CMD寫成:CMD service nginx start.你會發(fā)現(xiàn)container執(zhí)行之后就馬上結(jié)束了.這是因為整個container只是為了service nginx start這條命令而存在的,它不會管你這條命令啟動了什么.默認啟動的bash正好是一直在前臺運行,只有你使用exit命令退出bash的時候才結(jié)束bash進程.這個時候container才結(jié)束.才會讓人有container跟虛擬機差不多的錯覺.

上面的這個概念很重要,一定要理解透徹.如果沒有搞清楚這點.你會一直覺得docker跟虛擬機沒有什么區(qū)別.

RUN

這個命令指定了在構(gòu)建image時候image中藥執(zhí)行的命令.這么說可能有點蹩腳.舉個例子,我們希望我們的鏡像構(gòu)建好的時候就安裝好了git.那么我們就可以在Dockerfile里面寫RUN apt-get -y install git.這樣子在構(gòu)建鏡像的時候就會去安裝git了.待會兒我們要安裝的軟件都是通過這個命令指定的.也是有了RUN指令,我們就可以知道一個image構(gòu)建過程中做了一些什么操作.

好了.Dockerfile我們目前只需要這些指令.下面我們就根據(jù)上面學(xué)到的東西來快速的搭建我們所需要的開發(fā)環(huán)境.

實戰(zhàn)--編寫Dockerfile

我知道,上面那樣子好像很隨意的講了一下Dockerfile,肯定也不會寫.所以,這里我給出我構(gòu)建image使用的Dockerfile作為參考.

FROM ubuntu:14.04

ADD http://mirrors.163.com/.help/sources.list.trusty /etc/apt/sources.list

COPY install.sh /usr/local/src/install.sh

COPY supervisord.conf /usr/local/src/supervisord.conf

RUN apt-getupdate&& \

apt-get-yinstallbuild-essential && \

apt-get-yinstallsupervisor && \

cp /usr/local/src/supervisord.conf /etc/supervisor/supervisord.conf && \

apt-get-yinstallopenssh-server&& \

apt-get-yinstallgit && \

apt-get-yinstallvim && \

apt-get-yinstalllrzsz && \

apt-get-yinstalllibxml2-dev && \

apt-get-yinstallpkg-config libssl-dev libsslcommon2-dev && \

apt-get-yinstalllibbz2-dev && \

apt-get-yinstalllibcurl4-gnutls-dev && \

apt-get-yinstalllibjpeg8-dev && \

apt-get-yinstalllibpng-dev && \

apt-get-yinstalllibfreetype6-dev && \

apt-get-yinstalllibmcrypt-dev && \

apt-get-yinstalllibxslt-dev && \

apt-get-yinstalllibgmp-dev && \

apt-get-yinstalllibreadline-dev && \

ln-s /usr/include/x86_64-linux-gnu/gmp.h /usr/include/gmp.h && \

bash /usr/local/src/install.sh && \

adduser--gecos '' --disabled-password chenjiayao && \

echo -e'1111\n1111'| passwd chenjiayao && \

echo -e'11\n11'| passwd root

CMD supervisord -n

上面的Dockerfile其實相當?shù)暮唵?指令都是我們上面用到的,這里再解釋一下每一行的作用.

第一行FROM ubuntu:14.04指明了使用ubuntu官方維護的14.04的image作為基礎(chǔ)image來構(gòu)建自己的image.執(zhí)行這條指令之后,如果你的本地沒有ubuntu:14.04這個image的話, 那么就會去hub docker下載

第二行ADD指令上面提到了,這里就是使用163的源代替ubuntu內(nèi)置的源,這樣子下載軟件的速度就會比較快.

接著是兩個copy指令.這里從宿主機拷貝了兩個文件到鏡像中.其中install.sh是我自己寫的編譯安裝php+apache的腳本文件,這里根據(jù)自己需要來決定.后面的supervisord是linux下面用來管理進程的軟件.你會發(fā)現(xiàn)CMD啟動的就是supervisord.后面-n參數(shù)說明是以前臺的方式啟動.而不是后臺啟動.這樣子就避免了container運行一下就退出了.

RUN 里面都是在安裝軟件.執(zhí)行一些必要的操作.你會發(fā)現(xiàn)我把所有的軟件安裝都寫成了一個RUN指令.你可能會有疑問為什么不使用很多個RUN來編寫.為什么要再一個RUN里面安裝全部軟件.這里就要說明一點 :每執(zhí)行一個Dockerfile的指令都會讓我們的image增加一層只讀層.所以,寫很多指令的話,我們的image就會有太多的layer.所以盡量要克制命令的個數(shù).

CMD命令.這里我沒有使用默認的bash作為啟動命令是因為:如果使用bash作為默認的啟動進程之后,當前container就只會有一個進程bash.那么其他的apache.ssh等服務(wù)都不會自動啟動.*每次運行container都得手動啟動這些服務(wù)很麻煩.所以這里使用supervisor來管理.配置好supervisor之后,只要啟動了supervisor,supervisor就會自動幫我們啟動其他進程.比如apache.ssh等等.這樣就比較方便.所以如果還不知道supervisor的童鞋,趕緊學(xué)起來,而且相當?shù)暮唵?如果就是不學(xué)的同學(xué),也不要急,后面我會給出我的Dockerfile和其他配置文件.可以直接clone我的.

好了,Dockerfile我們已經(jīng)準備好了,下面使用docker build -t ubuntu-php .來構(gòu)建自己的image了.但是在開始之前要強調(diào)一下build的命令.

build命令 接著-t ubuntu-php表示構(gòu)建好的image的名稱.注意后面的.,這參數(shù)表示的是當前目錄.很多時候我們在一個目錄下創(chuàng)建了Dockerfile,編寫好之后.使用powershell進入這個目錄. 然后執(zhí)行docker build -t image_name .就開始編譯.很容易就以為最后一個參數(shù)是指定Dockerfile所在的目錄.其實不是這樣子的.這個目錄指定的是當前docker編譯這個image的工作目錄.

要先明白,docker是一個C/S的軟件,我們使用powerShell輸入命令 .之后命令是被發(fā)送到服務(wù)端執(zhí)行,然后返回結(jié)果的.這跟MySQL一樣.只是我們把客戶端和服務(wù)端安裝在一臺主機上.

當我們構(gòu)建image的時候,執(zhí)行類似COPY指令,那么把文件拷貝到image中,但是構(gòu)建文件是在服務(wù)端完成的,如何讓docker服務(wù)端得到拷貝的文件?這里我們就要指定一個docker構(gòu)建的工作目錄了.當構(gòu)建開始的時候,docker會把工作目錄下的所有文件都發(fā)送到服務(wù)端.然后開始構(gòu)建.這樣子他就可以得到我們要copy到image的文件了.

所以我們構(gòu)建的時候指定.是想把當前目錄下的文件等發(fā)送到docker服務(wù)端進行構(gòu)建.只是在上面,我們的Dockerfile正好是放在了docker構(gòu)建image的工作目錄中了.

那么,既然上面的參數(shù)不是指定Dockerfile所在的目錄.那如果我的機子上有多個Dockerfile的話,那么docker會使用哪個?我編寫這個Dockerfile的目的就是希望使用這個Dockerfile.這個不用擔心. 如果你在build的時候沒有指定使用哪個Dockerfile.默認會使用構(gòu)建iamge的工作目錄下名字為Dockerfile的那個Dockerfile....聽著有點暈...如果不想理清楚這些問題.每次構(gòu)建的時候使用powerShell進入Dockerfile所在的目錄下,然后執(zhí)行docker build image_name .就可以了.

在構(gòu)建過程中會輸出類似下面的內(nèi)容

PS D:\code\docker\ubuntu> docker build -t ubuntu-fin .

Sending build context to Docker daemon8.192kB

Step1: FROM ubuntu:14.04

--->3f755ca42730

Step2: ADD http://mirrors.163.com/.help/sources.list.trusty /etc/apt/sources.list

Downloading [==================================================>]872B/872B

--->386d7ab302b9

Removing intermediate container f183c42cf864

Step3: COPY supervisord.conf /usr/local/src/supervisord.conf

--->8ce5250f8498

Removing intermediate container2c6d89b3be22

Step4: COPY install.sh /usr/local/src

---> efa055e7d1b3

Removing intermediate container e0c7dacd9136

Step5: RUN apt-getupdate &&? ? apt-get-y install build-essential &&? ? apt-get-y install supervisor &&? cp /usr/local/src/supervisord.conf /etc/supervisor/supervisord.conf &&? ? apt-get-y install openssh-server &&? ? apt-get-y install git &&? ? apt-get-y install vim &&? ? apt-get-y install lszrz &&? ? apt-get-y install libxml2-dev &&? ? apt-get-y install? pkg-config libssl-dev libsslcommon2-dev &&? ? apt-get-y install libbz2-dev &&? ? apt-get-y install libcurl4-gnutls-dev &&? ? apt-get-y install libjpeg8-dev &&? ? apt-get-y install libpng-dev &&? ? apt-get-y install libfreetype6-dev &&? ? apt-get-y install libmcrypt-dev &&? ? apt-get-y install libxslt-dev &&? ? apt-get-y install libgmp-dev &&? ? apt-get-y install libreadline-dev &&? ? ln -s /usr/include/x86_64-linux-gnu/gmp.h /usr/include/gmp.h &&? ? bash /usr/local/src/install.sh &&? ? adduser --gecos''--disabled-password chenjiayao &&? ? echo -e'1111\n1111'| passwd chenjiayao &&? ? echo -e'11\n11'| passwd root

---> Runningin1dd5ade41249

發(fā)現(xiàn),每一個Step其實就是執(zhí)行Dockerfile中的每一個指令.好了,構(gòu)建已經(jīng)開始,等待構(gòu)建結(jié)束之后,我們的環(huán)境也就搭建好了,建議把Dockerfile等構(gòu)建必須的文件放到github上面,以后換一個環(huán)境.只要下載文件.然后就可以構(gòu)建了.

這里我放出我構(gòu)建環(huán)境時寫的Dockerfile,有需要自取.傳送門.

最后我們還有三個問題需要解決:

文件共享

端口映射

commit制作鏡像

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末六孵,一起剝皮案震驚了整個濱河市敢靡,隨后出現(xiàn)的幾起案子宪拥,更是在濱河造成了極大的恐慌盯孙,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嫡锌,死亡現(xiàn)場離奇詭異宠蚂,居然都是意外死亡,警方通過查閱死者的電腦和手機宪潮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來趣苏,“玉大人狡相,你說我怎么就攤上這事∈晨模” “怎么了谣光?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長芬为。 經(jīng)常有香客問我萄金,道長,這世上最難降的妖魔是什么媚朦? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任氧敢,我火速辦了婚禮,結(jié)果婚禮上询张,老公的妹妹穿的比我還像新娘孙乖。我一直安慰自己,他們只是感情好份氧,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布唯袄。 她就那樣靜靜地躺著,像睡著了一般蜗帜。 火紅的嫁衣襯著肌膚如雪恋拷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天厅缺,我揣著相機與錄音蔬顾,去河邊找鬼。 笑死湘捎,一個胖子當著我的面吹牛诀豁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播窥妇,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼舷胜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了活翩?” 一聲冷哼從身側(cè)響起烹骨,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤翻伺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后展氓,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡脸爱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年遇汞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片簿废。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡空入,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出族檬,到底是詐尸還是另有隱情歪赢,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布单料,位于F島的核電站埋凯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏扫尖。R本人自食惡果不足惜白对,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望换怖。 院中可真熱鬧甩恼,春花似錦、人聲如沸沉颂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铸屉。三九已至钉蒲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間彻坛,已是汗流浹背子巾。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留小压,地道東北人线梗。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像怠益,于是被迫代替她去往敵國和親仪搔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容

  • p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px 'Helv...
    乾坤菠菜籽閱讀 1,904評論 0 6
  • docker基本概念 1. Image Definition 鏡像 Image 就是一堆只讀層 read-only...
    慢清塵閱讀 8,750評論 1 21
  • 五蜻牢、Docker 端口映射 無論如何烤咧,這些 ip 是基于本地系統(tǒng)的并且容器的端口非本地主機是訪問不到的偏陪。此外,除了...
    R_X閱讀 1,749評論 0 7
  • 一煮嫌、Docker 簡介 Docker 兩個主要部件:Docker: 開源的容器虛擬化平臺Docker Hub: 用...
    R_X閱讀 4,388評論 0 27
  • 沒有反思的人生不值得過——蘇格拉底 90天踐行2.0從2018年12月2日到2019年02月28日止?我要持續(xù)踐行...
    何小旋閱讀 142評論 0 0