Docker基礎(chǔ)、Machine、Compose、Swarm入門與實(shí)踐

前言

你是否曾經(jīng)和我一樣,想了解一個(gè)新的中間件,如redis、kafka、zookeeper等,發(fā)現(xiàn)無論是單點(diǎn)還是集群搭建過程都異常繁瑣,甚至占用了一半以上的學(xué)習(xí)時(shí)間?很多中間件都是基于linux系統(tǒng)的,但是你卻要在windows上做文章?作為一個(gè)后端程序員,我只想學(xué)習(xí)一下中間件怎么使用,卻被這種繁瑣的過程限制住了手腳,抑或是半途而廢?
正所謂,工欲善其事,必先利其器。Docker可以完美的解決我們以上的痛點(diǎn),而且安裝過程簡(jiǎn)單。
本文參照Docker官方文檔https://docs.docker.com/,基于windows系統(tǒng),Linux和Mac系統(tǒng)除了安裝過程不同之外其余過程均相同。

一、安裝Docker

步驟一

下載安裝DockerToolBox: https://docs.docker.com/toolbox/overview/

image.png

步驟二

安裝成功之后會(huì)有三個(gè)圖標(biāo)出現(xiàn),Docker Quickstart基本上不用,常用的是另兩個(gè),打開VM更新到最新版本(因?yàn)榕f版本打開Kitematic的時(shí)候容易卡死)


image.png

步驟三

打開Kitematic軟件,點(diǎn)擊hello-world-nginx的CREATE按鈕,創(chuàng)建一個(gè)容器,如果能正常跑起來就證明安裝成功了。


image.png

二、Docker Machine

經(jīng)過上面過程我們已經(jīng)在Windows里面成功安裝了docker環(huán)境,但本質(zhì)上Kitematic軟件底層利用的是VirtualBox虛擬機(jī)和DockerMachine,那么什么是Docker Machine?

1、Docker Machine概念

Docker Machine就是創(chuàng)建Docker環(huán)境的機(jī)器,簡(jiǎn)單說就是有了Docker Machine就可以在任何系統(tǒng)任何平臺(tái)上快速的搭建Docker環(huán)境了。

2、利用Docker Machine快速創(chuàng)建Docker環(huán)境

創(chuàng)建Docker虛擬機(jī)

打開cmd窗口,執(zhí)行命令 docker-machine create --driver=virtualbox machine1
該命令以virtualbox為介質(zhì)快速創(chuàng)建一個(gè)包含有docker環(huán)境的虛擬機(jī)。命令執(zhí)行完成之后打開virtualbox界面如下:
可以看到machine1正在運(yùn)行,雙擊進(jìn)入該虛擬機(jī)可以執(zhí)行docker的所有命令。
你可以利用上面的命令繼續(xù)創(chuàng)建多個(gè)含有Docker Engine的多個(gè)虛擬機(jī)


image.png

進(jìn)入Docker虛擬機(jī)

打開cmd窗口,執(zhí)行命令 docker-machine ssh machine1
該命令可以通過cmd窗口進(jìn)入到machine1環(huán)境,因?yàn)関irtualbox的復(fù)制粘貼操作沒有cmd窗口那么便捷,所以我一般復(fù)制命令的時(shí)候都使用cmd窗口ssh進(jìn)入

其他Docker machine命令

docker-machine start/stop 可以刪除容器關(guān)閉和不刪除容器關(guān)閉虛擬機(jī)
更多命令請(qǐng)參考 https://docs.docker.com/machine/reference/

三、Docker Compose

1、Dcoker Compose概念

Docker Compose可以有組織的啟動(dòng)同屬于一個(gè)服務(wù)的多個(gè)容器
換句話說 當(dāng)一個(gè)服務(wù)包含多個(gè)容器的時(shí)候,docker compose可以通過yaml文件預(yù)先配置,然后統(tǒng)一啟動(dòng)

2、Docker Compose安裝

三步走:進(jìn)入machine1、切換root用戶、安裝及更改compose權(quán)限
1.21.1為版本,可以到https://github.com/docker/compose/releases去查看可更換的compose版本

sudo -i
curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-uname -s-uname -m -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

3、Compose的使用

以三節(jié)點(diǎn)的zookeeper偽集群為例,最重要的就是yaml文件,這個(gè)是構(gòu)建服務(wù)的藍(lán)圖
首先:隨便在哪個(gè)目錄下創(chuàng)建一個(gè)docker-compose.yml文件(注意名稱必須為docker-compose),內(nèi)容如下
然后:進(jìn)入docker-compose.yml目錄,執(zhí)行docker-compose up -d (-d表示后臺(tái)運(yùn)行)結(jié)果如圖

version: '3.1'

services:
  zoo1:
    image: zookeeper
    restart: always
    hostname: zoo1
    ports:
      - 2181:2181
    environment:
      ZOO_MY_ID: 1
      ZOO_SERVERS: server.1=0.0.0.0:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888

  zoo2:
    image: zookeeper
    restart: always
    hostname: zoo2
    ports:
      - 2182:2181
    environment:
      ZOO_MY_ID: 2
      ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=0.0.0.0:2888:3888 server.3=zoo3:2888:3888

  zoo3:
    image: zookeeper
    restart: always
    hostname: zoo3
    ports:
      - 2183:2181
    environment:
      ZOO_MY_ID: 3
      ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=0.0.0.0:2888:3888

image.png

再次:檢查zookeeper偽集群是否安裝成功,使用docker ps 查看正在運(yùn)行的容器,記下ID
然后:通過docker exec -it id /bin/bash進(jìn)入zookeeper下,進(jìn)入bin目錄,執(zhí)行zkCli.sh就可以執(zhí)行zookeeper命令了!
image.png

就這樣偽集群瞬間搭建好,跟誰說理去?

4、yml模板說明:

  • version對(duì)應(yīng)compose和Engine版本


    image.png
  • services對(duì)應(yīng)多個(gè)容器
  • zoo1/2/3為容器名稱
  • image表示基于的鏡像為zookeeper
  • environment表示環(huán)境變量
  • ports前面的端口號(hào)表示容器宿主機(jī)的端口號(hào),后面的端口號(hào)表示容器的端口號(hào)
  • 其他顧名思義

4、Compose yml其他語法

https://docs.docker.com/compose/compose-file/


四、Docker Swarm

上面兩位劍客完成了Docker環(huán)境搭建和容器的編排工作,swarm則用來完成多臺(tái)機(jī)器(可物理可虛擬)之間容器集群的管理,Swarm是docker自帶的一種模式,內(nèi)嵌到docker里,不用額外安裝。

1、Swarm中的重要概念

  • 節(jié)點(diǎn):NODE,一個(gè)節(jié)點(diǎn)本質(zhì)上是一個(gè)包含Docker Engine環(huán)境的機(jī)器,可以是物理機(jī)也可以是虛擬機(jī),我們這里可以是自己構(gòu)建的docker machine。Node分為兩種,一種為leader,一種為worker,前者負(fù)責(zé)分派工作,后者負(fù)責(zé)執(zhí)行工作,同一個(gè)NODE可以同時(shí)有兩種角色。
  • 服務(wù):Service,運(yùn)行在節(jié)點(diǎn)上包含一個(gè)或者多個(gè)task的綜合體,每個(gè)task都由一個(gè)容器和容器內(nèi)部運(yùn)行的一些命令共同代表。
  • 負(fù)載均衡:使用內(nèi)部負(fù)載均衡,訪問任何節(jié)點(diǎn)端口都會(huì)通過負(fù)載均衡找到服務(wù),即便當(dāng)前node沒有服務(wù)
    image.png

2、快速搭建一個(gè)Swarm集群

步驟一:

打開cmd窗口,使用docker-machine create xxx 創(chuàng)建一個(gè)manager環(huán)境和兩個(gè)worker環(huán)境,創(chuàng)建完成可以打開virtualbox查看


image.png
步驟二:

在manager節(jié)點(diǎn)即圖中的machine1節(jié)點(diǎn)內(nèi),執(zhí)行命令
docker swarm init --advertise-addr 192.168.99.101 注意后邊的IP為當(dāng)前機(jī)器的IP可以通過cmd窗口的docker-machine ip machine1查看。--advertise-addr表示設(shè)置mannager

$ docker swarm init --advertise-addr 192.168.99.101
Swarm initialized: current node (bvz81updecsj6wjz393c09vti) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx \
    172.17.0.2:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
步驟三:

上一步中其實(shí)已經(jīng)給出了加入swarm的命令了,如果沒記住可以在mananger節(jié)點(diǎn)執(zhí)行docker swarm join-token worker 命令查看

docker swarm join --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2 192.168.99.101:2377
執(zhí)行完上述命令后會(huì)有成功的提示

在Manager節(jié)點(diǎn)執(zhí)行docker node ls可以查看當(dāng)前節(jié)點(diǎn)


image.png
步驟四:

至此Docker swarm集群搭建完成,該集群包含三個(gè)節(jié)點(diǎn),一個(gè)Manager和兩個(gè)worker,Manager本質(zhì)上也是一個(gè)worker,都可以執(zhí)行任務(wù)。

3、在Swarm上操作服務(wù)

  • 發(fā)布:
    隨便在哪個(gè)節(jié)點(diǎn)上執(zhí)行命令
    docker service create
    --replicas 3
    --name redis
    --update-delay 10s
    redis:3.0.6
    就可以發(fā)布一個(gè)3.0.6版本的Redis了,replicas表示有三個(gè)副本,update-delay表示當(dāng)升級(jí)的時(shí)候,一個(gè)節(jié)點(diǎn)升級(jí)成功之后的10秒后才升級(jí)另一個(gè)節(jié)點(diǎn)
  • 升級(jí):
    docker service update --image redis:3.0.7 redis
    這個(gè)過程是滾動(dòng)的,即一個(gè)接一個(gè)升級(jí)
  • 查看:
    docker service inspect --pretty redis
    或者docker service ps redis
  • 刪除:
    docker service rm redis
  • 停止/重啟節(jié)點(diǎn):
    docker node update --availability drain worker1
    該命令停止了節(jié)點(diǎn)worker1,停止之后不接受新的請(qǐng)求,不接受manager分派
    docker node update --availability active worker1
    該命令重啟了節(jié)點(diǎn),使其恢復(fù)active狀態(tài)
  • 指定端口:
    docker service create
    --name my-web
    --publish published=8080,target=80
    --replicas 2
    nginx
    該命令指定了訪問端口為8080,映射docker80端口,可以通過任何節(jié)點(diǎn)訪問到如192.168.99.101:8080

4、Swarm && Compose

上面Swarm發(fā)布的Service都是單個(gè)容器的,多個(gè)容器如何操作呢?首先我們會(huì)聯(lián)想到Compose,但是Comopse舊版本只支持在單個(gè)Host上發(fā)布,在集群里就需要Compose新版本了!先保證Compose是v3以上吧!
去這個(gè)網(wǎng)址https://github.com/docker/compose/releases/查看compose版本和compose yml版本的對(duì)應(yīng)關(guān)系

image.png

Swarm發(fā)布Compose編排的Service過程:

步驟一:

編排docker-compose.yml模板文件,此處命名可以隨便起,與Compose不同
下面的yml文件來自官方https://github.com/docker/labs/blob/master/beginner/chapters/votingapp.md

  • version必須是3及以上
  • 該服務(wù)包含redis、db、vote服務(wù)(投票功能)、result服務(wù)(統(tǒng)計(jì)結(jié)果)等等
version: "3"
services:
  redis:
    image: redis:alpine
    ports:
      - "6379"
    networks:
      - frontend
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure
  db:
    image: postgres:9.4
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend
    deploy:
      placement:
        constraints: [node.role == manager]
  vote:
    image: dockersamples/examplevotingapp_vote:before
    ports:
      - 5000:80
    networks:
      - frontend
    depends_on:
      - redis
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
      restart_policy:
        condition: on-failure
  result:
    image: dockersamples/examplevotingapp_result:before
    ports:
      - 5001:80
    networks:
      - backend
    depends_on:
      - db
    deploy:
      replicas: 1
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

  worker:
    image: dockersamples/examplevotingapp_worker
    networks:
      - frontend
      - backend
    deploy:
      mode: replicated
      replicas: 1
      labels: [APP=VOTING]
      restart_policy:
        condition: on-failure
        delay: 10s
        max_attempts: 3
        window: 120s
      placement:
        constraints: [node.role == manager]

  visualizer:
    image: dockersamples/visualizer
    ports:
      - "8080:8080"
    stop_grace_period: 1m30s
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    deploy:
      placement:
        constraints: [node.role == manager]

networks:
  frontend:
  backend:

volumes:
  db-data:
步驟二:

執(zhí)行命令 docker stack deploy --compose-file docker-compose.yml vote 啟動(dòng)基于yml文件的名稱為vote的服務(wù)
注意docker stack不支持build,需要事先指定鏡像


image.png
步驟三:

這樣多個(gè)容器就以服務(wù)的形式發(fā)布到集群里面了!通過192.168.99.101:5000訪問即可看到頁面!
docker stack services vote:可以查看服務(wù)狀態(tài)
docker stack rm vote:可以刪除服務(wù)

image.png

Docker-Compose所有命令參數(shù)可以參考:https://docs.docker.com/compose/compose-file/

五、Docker基礎(chǔ)

docker主要由倉(cāng)庫、鏡像、容器三個(gè)概念組成!下圖中顯示了三者之間的關(guān)系

  • 把鏡像理解為軟件安裝包
  • 把容器理解為使用的軟件
  • 把倉(cāng)庫理解為安裝包下載網(wǎng)站
image.png

一:對(duì)于鏡像:

1:增加鏡像:
A:從倉(cāng)庫下載:docker pull NAME:TAG
A1:例子:docker pull ubuntu:latest
A2:例子:docker pull ubuntu 同上
A3:例子:docker pull ubuntu:14.04
B:創(chuàng)建鏡像:
B1:基于已有鏡像的容器創(chuàng)建:docker commit已經(jīng)修改過的容器,如docker容器里創(chuàng)建了文件的鏡像
B11:docker commit -m “消息” -a “作者信息” a925948cb23d(容器ID) test:0.1(標(biāo)簽)
B2:基于本地模板導(dǎo)入
B3:基于Dockerfile創(chuàng)建
C:存出鏡像:docker save -o xxx.tar xxx:latest即可保存成tar文件
D:載入鏡像:docker load < xxx.tar即可載入tar文件
2:刪除鏡像:
A:刪除鏡像:docker rmi image image可以為標(biāo)簽也可以為id
A1:-f強(qiáng)行刪除
3:修改鏡像:
A:給鏡像打標(biāo)簽:docker tag ubuntu:latest myubuntu:latest

4:查看鏡像:
A:列出鏡像:docker images
A1:-a列出所有的鏡像文件
A2:-q僅輸出ID信息
B:詳細(xì)信息:docker inspect ubuntu:latest
C:查看歷史:docker history ubuntu:latest
5:搜索鏡像:
A:搜索鏡像:docker search -s 3 —automated ubuntu 搜索3星以上自動(dòng)創(chuàng)建的ubutnu鏡像
6:上傳鏡像:
A:先加標(biāo)簽:docker tag xxx:14.04 user/test:latest
再往上推:docker push user/test:latest
B:上傳到docker hub里面,跟git很類似

7:Dockerfile詳解:
構(gòu)建:
Kind1:在dockerfile所在目錄執(zhí)行:docker build -t nginx:v3 .
Kind2: 直接用gitRepo構(gòu)建:docker build git路徑:版本
解釋:BS架構(gòu),dockerfile所在目錄應(yīng)該為空目錄,所有需要復(fù)制或者添加的文件都應(yīng)該復(fù)制到該目錄下,這個(gè)路徑是一個(gè)上下文Context,構(gòu)建過程中會(huì)把上下文發(fā)送給Docker引擎
A:FROM命令:以什么為基礎(chǔ),可以是已經(jīng)存在的鏡像,也可以是虛擬鏡像scratch
B:RUN命令:與直接在容器內(nèi)命令行中輸入的命令一樣的效果,為了減少層數(shù),可以使用\和&&結(jié)合的方式,換行并繼續(xù)的意思
C:COPY命令:COPY package.json /usr/src/app,前者為上下文中的路徑,后者可以為絕對(duì)路徑,也可以為WORKDIR目錄的相對(duì)路徑
D:ADD命令:與COPY一至,源路徑可以為url,可以為tar文件,只在自動(dòng)解壓縮的場(chǎng)合使用ADD,其余一律用RUN
E:CMD命令:制定容器啟動(dòng)時(shí)所要執(zhí)行的命令,只能執(zhí)行一次,多次會(huì)覆蓋,CMD 【“可執(zhí)行程序”,“param1”,“parma2”】
F:ENTRYPOINT命令:格式與RUN相同,給容器配置一個(gè)可執(zhí)行程序格式與CMD相同,docker run指令不會(huì)覆蓋ENTRYPOINT命令而會(huì)覆蓋CMD命令,比如-i
G:ENV命令:設(shè)dockerfile的環(huán)境變量 ENV key value,之后的命令可以使用ENV定義的環(huán)境變量,容器內(nèi)也可以使用
H:VOLUME命令:VOLUME /data,匿名卷容器內(nèi)的/data映射入主機(jī)了
I:EXPOSE命令:聲明端口 EXPOSE 80 8080
J:WORKDIR:指定工作目錄,或者成為當(dāng)前目錄,如果目錄不存在WORKDIR會(huì)幫你創(chuàng)建
K:USER命令:制定當(dāng)前用戶

二:對(duì)于容器:
1:創(chuàng)建容器:
A:創(chuàng)建容器:docker create -it ubuntu:latest
保持標(biāo)準(zhǔn)輸入打開:-i
后臺(tái)運(yùn)行容器:-d
分配一個(gè)偽終端:-t
B:創(chuàng)建并啟動(dòng)容器:docker run ubuntu /bin/bash
2:刪除容器:
A:docker rm命令刪除:
B:刪除所有:sudo docker rm $(docker ps -a -q)
3:停止容器:
A:優(yōu)雅的停止:docker stop dockerID
B:直接殺死:docker kill id
4:查看容器:docker ps
A:獲取容器輸出信息:docker logs id
5:進(jìn)入容器:
A:exec命令:docker exec -it dockerID /bin/bash
B:nsenter工具:可以去查
6:容器互聯(lián):
A:docker run -d -P —name dockerName1 --link dockerName2:dockerName2Alias ubuntu:14.04
B:
7:啟動(dòng)容器:
A:docker start af(容器ID)
B:重啟:docker restart id
C:?jiǎn)?dòng)容器會(huì)自動(dòng)在鏡像層外掛載一層可讀寫層
D:直接從鏡像啟動(dòng)容器:docker run -i -t -d -p 8080:8080 --name myname ubuntu:latest
8:導(dǎo)入導(dǎo)出容器:
A:導(dǎo)出容器:docker export -o xxx.tar dockerID
B:導(dǎo)入容器:docker import xxx.tar - dockerName

三:對(duì)于倉(cāng)庫:
1:創(chuàng)建私有倉(cāng)庫:
A:創(chuàng)建本地/tmp/registry 位置的倉(cāng)庫 docker run -d -p 5000:5000 registry
B:創(chuàng)建制定路徑倉(cāng)庫 docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
2:從國(guó)內(nèi)鏡像下載鏡像:
A:從時(shí)速云下載鏡像:docker pull index.tenxcloud.com/docker_library/鏡像:標(biāo)簽

四:對(duì)于數(shù)據(jù):
1:數(shù)據(jù)卷:
A:容器內(nèi)數(shù)據(jù)直接映射到本地主機(jī)環(huán)境
B:數(shù)據(jù)卷可以被多個(gè)容器共享和重用
C:對(duì)數(shù)據(jù)卷修改立馬生效,并且更新數(shù)據(jù)卷不影響鏡像
D:數(shù)據(jù)卷會(huì)一直存在,直到?jīng)]有容器使用才可以安全卸載
E:掛載數(shù)據(jù)卷到容器內(nèi)目錄的兩種方法:
E1:docker run -d -P --name web -v /webapp ubuntu:14.04 把容器的webapp目錄映射到主機(jī)上
E2:掛載指定目錄到容器:docker run -d -P --name web -v /src/webapp(主機(jī)目錄):/opt/webapp(容器內(nèi)目錄):ro ubuntu:14.04 加上:ro后容器對(duì)鎖掛在的數(shù)據(jù)卷內(nèi)數(shù)據(jù)就無法修改了
E3:可以掛載單個(gè)文件到容器內(nèi)目錄作為數(shù)據(jù)卷,不推薦
F:刪除數(shù)據(jù)卷:docker rm -v
2:數(shù)據(jù)卷容器:
A:使用特定容器維護(hù)數(shù)據(jù)卷
B:操作流程:
B1:創(chuàng)建數(shù)據(jù)卷容器:docker run -v /dbdata —name dbdata ubuntu
B2:在其他容器使用—volumes-from dbdata即可掛載改容器,可以寄連掛在,也可以掛載多個(gè)數(shù)據(jù)卷容器

總結(jié):

本篇博客涵蓋了Docker自家的所有內(nèi)容,從Docker基礎(chǔ)到Docker三劍客都有解析,可以作為入門指導(dǎo)。
有了docker之后我們就可以隨便的安裝那些安裝過程復(fù)雜的軟件了,如果你看懂了,請(qǐng)給我一點(diǎn)鼓勵(lì)哦!

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

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