容器化

词汇

  • docker主机(host): 安装了Docker程序的机器(Docker直接安装在操作系统上);
    安装了docker的电脑

  • docker客户端(Client): 链接docker主机进行操作

  • docker仓库(registy) : 用来保存各种打包好的软件镜像
    所有镜像的存放地址

  • docker镜像(Images): 软件打包好的镜像, 放在docker仓库中
    一个软件打包生成的镜像 , 比如linux打包的docker镜像 就是linux docker镜像

  • docker 容器(Container): 镜像启动后的实例称为一个docker容器,容器是独立运行的一个或一组应用
    镜像启动起来就是,一个容器

  • 作用:解决了运行环境和配置问题软件容器, 方便做持续继承并有助于整体发布的容器虚拟化技术。交镜像, 别人就不需要再搭建一套环境, 直接使用镜像运行就好了

  • 镜像(Image): 就是一个只读的模版, 镜像可以用来创建docker容器, 一个镜像可以创建多个容器

  • Docker容器 相当于 Java的对象

  • Docker镜像 相当于 Java类
    镜像 ==> 模版, ==> Java类

  • 容器(container): 独立运行的一个或一组应用; 容器是用镜像创建的运行实例;
    它可以被启动, 开始, 停止, 删除, 每个容器都是相互隔离的, 保证安全的平台
    可以把容器看做是一个简易版的Linux环境(包括root用户权限, 进程空间, 用户空间和网络空间) 和运行在其中的应用程序;
    容器的定义和镜像几乎是一模一样, 也是一堆层的统一视角, 唯一区别在于容器的最上面那一层是可读可写的;

  • 容器 ==> Linux小镜像小实例 ==> Java对象

  • 仓库(Repository): 是集中存放镜像文件的场所;
    仓库(Repository)和仓库注册服务器(Registry)是有区别的; 仓库注册服务器上往往存放着多个仓库, 每个仓库中又包含了多个镜像, 每个镜像有不同的标签(tag)
    仓库分为公开仓库(public) 和私有仓库(private)两种形式
    最大的公开仓库是Docker Hub(https://hub.docker.com/)

使用docker的步骤:

1, 安装docker
2, 去docker仓库找这个软件对应的镜像
3, 使用docker运行这个镜像,这个镜像就会生成一个docker容器
4,对容器的启动停止就是对软件的启动停止

image.png

Docker命令

yum install docker
安装docker
cat /etc/sysconfig/docker   #查看配置文件

启动docker
systemctl start docker   启动docker
systemctl stopdocker   停止docker
docker -v     查看docker版本

systemctl enable docker   开机启动docker

docker search mysql    搜索需要的docker 镜像
docker search mysql:5.5   下载指定版本的镜像
(就是从dockerhub里搜索镜像)
docker pull mysql      拉取/下载镜像 (最新的)

docker images    查看下载好的镜像
docker rmi IMAGE_ID   删除指定镜像
    注意IMAGE_ID  是通过docker images 里查看到的IMAGE_ID

卸载docker

yum list installed|grep dock
yum -y remove docker.x86_64 
yum -y remove docker-client.x86_64
yum -y remove docker-common.x86_64 
启动容器(镜像)
docker run –-name 容器名字 -d tomcat: latest
    容器名字: 自定义自己启动的容器名字
    -d  后台启动
    tomcat: latest   启动tomca并指定版本
  注意启动tomcat之后,使用ip加端口是访问不了tomcat的,因为是通过docker启动的
因此需要映射端口,如下启动

docker run --name 容器名字 -d -p 8888:8080 tomcat: latest
    把主机的8888端口映射到容器内部tomcat的8080上
    把主机的端口映射到容器的一个端口上

docker run --name mysql01 -d mysql
    这样运行是错误的,mysql会因启动时没有配置密码….等而启动错误

docker run --name mysql01 -e MYSQL-ROOT_PASSWORD=jia -d mysql
    启动时候映射端口

docker run -p 3306:3306 --name mysql02 -e MYSQL-ROOT_PASSWORD=jia -d mysql:5.7.30

启动成功
docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=jia mysql:5.7.30
docker 特殊操作:
docker run --name mysql03 -v /conf/mysql:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
    把主机的/conf/mysql文件夹挂载到 mysqldocker容器的/etc/mysql/conf.d文件夹里面
启动指定编码为utf-8
docker run -p 3306:3306 --name mysql03 -e MYSQL_ROOT_PASSWORD=jia -d mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
service firewalld status   查看防火墙状态
service firewalld stop   关闭防火墙

docker ps   查看运行的docker 容器
docker ps  -a  查看全部的docker 容器

docker stop 容器运行的id    (通过docker ps 找到运行的id)

docker rm 容器运行的id   (注意区分删除镜像的rmi)

docker logs   查看容器启动日志

Docker 部署

1、下载一个tomcat镜像到我本地
    docker pull tomcat:7

2、在Docker工具里执行指令让镜像跑起来
    docker run -d -p 8080:8080 tomcat

3、把文件部署在Tomcat的镜像下
docker cp C:/Users/Distance/Desktop/CO2Monitor.war 05fea6175ff2:/usr/local/tomcat/webapps
    3.1、查看Tomcat文件位置
    docker exec -it 05fea6175ff2 /bin/bash
    root@05fea6175ff2:/usr/local/tomcat# cd webapps
    root@05fea6175ff2:/usr/local/tomcat/webapps# ls
4、对容器进行了修改(copy了war包),首先要提交修改
    docker commit 05fea6175ff2 kaluli/co2
    提交完后,要push上仓库,在这之前,要登录自己的docker账户
    docker login
    登录后,上传到仓库;前面是自己的docker账号名,后面是给容器取的名字
    docker push kaluli/co2:latest

5、其他人只要docker pull ivyusing/demo,都可以下载这个容器

修改阿里云镜像加速器

登录阿里云开放平台, 找到自己的加速地址

https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

image.png

image.png

复制自己的加速器, 修改配置

vim /etc/docker/daemon.json 

#把下图的json串加进去,然后重启

systemctl daemon-reload
systemctl restart docker
image.png

学习 - docker 命令

docker version
dokcer info
docker help

镜像相关知识
docker images  #列出本地主机上的镜像
    docker images -a #列出全部镜像
    docker images -q #列出镜像id
    docker images -qa  #列出所有的镜像id, 方便批量删除
    docker images --digests   #查看该镜像的摘要信息 
    docker iamges --no-trunc   # 显示完整的镜像信息
docker search 某个XXX镜像名字
    #注意虽然修改了镜像加速器地址为阿里云, 但是docker search命令还是从dockerhub中查找镜像, 只是说拉取的时候从阿里云里拉取了
     docker search  mysql
     docker search  -s 30 tomcat   #STAR超过30的才列出来, 作为筛选
     docker search tomcat --automated   #只列出自动构建的镜像, 筛选
docker pull 某个XXX镜像名字
docker rmi 某个XXX镜像名字ID
    docker rmi -f 某个XXX镜像名字ID   强制删除 
    docker rmi -f  镜像1名字, 镜像2名字   删除多个
    docker rmi -f ${docker images -qa}  删除所有的镜像 
    
    
docker images 选项说明
image.png
容器相关知识
docker run [OPTIONS] IMAGE [COMMAND] [ARGS]  本地有就启动本地,没有就去dockerhub拉取
    docker run -it 镜像ID    #开启容器, 运行镜像ID, 
                            #-it 并且开启与容器交互, 登录进容器里边去, 退出使用exit(容器停止退出)或者 Ctrl+P+Q(容器不停止退出)
    docer run -it --name my-centos-name centos  指定容器名字,根据镜像启动容器
                            
docker ps    #查询所有运行着的docker镜像
    docker ps -l  #上一次运行的容器
    docker ps -n 3 #上三次运行的容器
    
docker stop 容器id  #停止容器
docker kill 容器id  #停止容器

docker rm 容器id  #删除容器
docker rm -f 容器id  #强制删除容器
docker rm -f ${docker ps -a -q}  #全部删除
docker ps -a -q | xagrs docker rm  #全部删除


=================================================================================
docker run -d centos   #后台运行容器, 守护进程启动容器
docker logs -f -t --tail 容器ID   #查看容器日志  -t是加入时间戳   -f 跟随最新的日志打印   --tail 数字显示最后多少条
docker top 容器ID     #查看容器内运行的进程
docker inspect 容器ID   # 查看容器内部细节

docker attach 容器ID  # 进入宿主机, 
dokcer exec -t 8a7193d3ae96 ls -l /tmp    # 不进入宿主机, 执行命令, 输出结果
    attach 和 exec的区别:
        attach: 直接进入容器启动命令的终端, 不会启动新的进程
        exec:   是在容器中打开新的终端, 并且可以启动新的进程
        
docker cp 容器ID:容器内路径  目的主机路径     
    docker cp 8a7193d3ae96:/tmp/ks-script-xm1o5azb /hong/docker-file #将宿主机centos里的/tmp下拷贝ks-script-xm1o5azb到主机的  /hong/docker-file/ 
    
镜像提交
docker commmit 提交容器副本使之成为一个新的镜像
docker commit -m "描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]


docker run -it -p 8888:8080 tomcat    #主机端口8888映射到宿主机8080端口,这样192.168.71.133:8888就能访问容器内tomcat的8080端口了
docker run -it -P tomcat   #自动映射, 通过docker ps可以看到映射的端口信息 32768--> 8080
image.png

后台启动, 守护进程启动

docker run -d centos   #后台运行容器, 守护进程启动容器
#注意, 这样可能启动后, 一会该容器就消失了, 这是docker的机制, 如果没人和他交互, 他就自杀了
image.png

测试记录:

docker run -d centos /bin/sh -c "while true; do echo hello zzyyl;sleep 2; done"
#后台形式启动centos, 并打印日志
docker ps  #因为有日志打印交互, 所以这个容器不会自杀,一直存活
#查看日志
docker logs 00d9133c2dd2
docker logs  -t 00d9133c2dd2
docker logs -tail 00d9133c2dd2
docker logs -t -f 00d9133c2dd2
docker logs -t -f --tail 3 00d9133c2dd2  #查看最后3行,和实时日志
自定义镜像(commit 重建镜像) commit 持久化
docker exec -it caed58ded956 /bin/bash  #进去tomcat路径
        mkdir docs  添加一个docs文件夹

docker commit -a="Hong" -m="My-Tomcat" caed58ded956  hong/mytomcat:1.2

docker images   #查看到commit的镜像

docker run -it -p 7777:8080 hong/mytomcat:1.2  #启动自定义镜像

Docker容器数据卷(就是持久化, U盘)

就是学生下课查到笔记本上,拷贝的活动硬盘, 主要用来持久化,

Docker的理念:

将运用与运行的环境打包形成容器运行, 运行可以伴随着容器, 但是我们对数据的要求希望是持久化的

容器之间希望有可能共享数据

Docker容器产生的数据, 如果不通过docker commit生产新的镜像,使得数据做成镜像的一部分保存下来, 那么当容器删除后, 数据自然就没有了,为了能保存数据, 在docker中使用卷的概念

作用:

1, 容器的持久化

2, 容器间继承 + 共享数据
docker run -it 镜像名
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名    # rw权限, 宿主机和容器完全同步, 包括删除
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名   # ro: read only

测试记录:

读写模式

这个模式, 宿主机和容器都可以进行修改, 而且完全同步
docker run -it -v /hong/myDataVolume:/hong/myDataVolume centos   #rw权限 
#注意此时, 宿主机和容器 / 下都没有hong/myDataVolume文件夹, 相当于宿主机的/hong/myDataVolume 和容器的/hong/myDataVolume挂载在一起了

docker inspect 容器id   
#可以看到HostConfig已经有显示RW: true, 宿主机和容器进行了卷的挂载,而且运行随意修改
测试结论
#1, 如果宿主机新建文件,容器也会跟着建立, 宿主机修改, 容器也跟着修改了, 就像是U盘已经同步了
#2, 如果容器关机了, 这时,  宿主机修改了文件, 容器再次启动上来,  宿主机改的文件也会同步过来

只读模式

这个模式, 只允许宿主机进行修改,同步宿主机的修改, 容器不能进行任何修改

(相当于容器只能从宿主机中拷,但是自己能新建)
docker run -it -v /hong/myDataVolume:/hong/myDataVolume:ro centos  #只读
备注(我就出现了,容器不能写)

Docker挂载主机目录Docker 访问出现cannot open directory. : Permission denied

解决办法: 在挂载目录后多加一个 --privileged=true 参数即可

Dockerfile形式添加数据卷

1, 编写dockerfile

vim /hong/dockerFile/Dockerfile
#volume test
FROM centos
VOLUME ["/hong/dataVolumeContainer1","/hong/dataVolumeContainer2"]
CMD echo "finished , --------  success"
CMD /bin/bash

2, 根据编写的dockerfile构建镜像

docker build  -f /hong/dockerFile/Dockerfile  -t hong-dockerfile/centos .
image.png

3, 启动dockerfile建立的镜像

docker run -it hong-dockerfile/centos

查看容器内是否建立了, dockerfile指定的两个文件夹


image.png

4, 那么如何看容器和宿主机的哪个卷进行了绑定呢?

docker inspect ea56fccd987d
image.png

5, 验证一下, 在容器内建立1.txt文件


image.png

6, 查看宿主机


image.png

数据卷容器(volumes-from)

容器间传递共享

容器挂载在宿主机, 其他的容器又挂载在这个挂载在宿主机上的容器, 进行数据间的共享

老师(宿主机)和班长(容器)进行绑定, 各个组长(其他容器)又和班长进行挂载, 都挂在了一条线上

测试:

1, 开启容器doc1


image.png

2, 启动doc2,doc3 继承自doc1

 docker run -it --name doc2 --volumes-from  dc01 hong-dockerfile/centos

3, 在doc3中新建文件


image.png

4, 查看结果

image.png

发现doc3新建文件, doc1和doc2也能看到了

5, doc2删除文件


image.png

6,查看结果

发现doc1 和doc3中的文件也被删除了

7, 注意关键点

如果把doc1删了, 虽然都继承自doc1, 但是即使删了doc1,  doc2和doc3 仍然可以进行数据的共享,因为

**容器之间配置信息的传递, 数据卷的生命周期一直会持续到没有容器使用它为止**

也就是说, 只要关联了, 就会一直数据共享, 直到剩下最后一个没有容器为止
image.png

scratch 相当于java中的Object类, 是所有构建镜像的父类

bin/bash 启动, 这样在每次docker run -it centos就相当于默认后边加了一句/bin/bash得以让容器启动, 如果非手动的添加了 docker run -it centos /bin/bash 就相当于在这个文件中又多加了一行 CMD ["/bin/bash"] 让镜像运行

Dockerfile章节

注意点: dockerfile 中每条指令都会创建一个新的镜像层, 并对镜像进行提交

dockerfile的大致执行流程:

1, docker 从基础镜像运行一个容器

2, 执行一条指令并对容器作出修改

3, 执行类似docker commit 的操作提交一个新的镜像层

4, docker再基于刚提交的镜像运行一个新容器

5, 执行dockerfile中的下一条指令直到所有指令都执行完成
image.png

Docker体系关键字

1,FROM

    基础镜像, 当前新镜像是基于哪个镜像的

    Hong: 指定镜像构建的源头, 最大的源头就是挠痒痒 >>> scratch

2, MAINTAINER 

    镜像维护者的姓名和邮箱地址

    Hong: 就是镜像的作者信息啥啥的

3, RUN

    容器构建时需要运行的命令

    Hong: 启动命令

4, EXPOSE

    当前容器对外暴露的端口

5, WORKDIR

    指定在创建容器后, 终端默认登陆的进来工作目录, 一个落脚点

    Hong: 就是启动镜像后, 你默认当前处于在哪个文件夹下, 相当于登录镜像默认文件夹

6, ENV

    用来构建镜像构成中设置环境变量

    Hong: 镜像需要运行的环境变量

7, ADD

    将宿主机目录下的文件拷贝进镜像且ADD命令会**自动处理URL和解压tar压缩包**

    Hong: 镜像需要的其他文件, 用ADD添加过来并解压, 区别于COPY, ADD就是多了个解压 

8, COPY

    类似ADD, 拷贝文件和目录到镜像中; 将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径> 位置

    Hong: 和ADD类似, 都是拷贝过来, 但是COPY不进行后续处理

9, VOLUME

    容器数据卷, 用来数据保存和持久化工作

    Hong:  就是前边的卷概念, 用来连接宿主机和容器的U盘

10, CMD

    指定一个容器启动时要运行的命令,  **Dockerfile中可以有多个CMD命令, 但只有最后一个生效, CMD会被docker run 之后的参数替代**

    Hong: 容器启动的命令, 注意这比会被最后一个CMD覆盖, 相当于只有最后一个CMD生效, 而且还会被docker run 后边跟的命令覆盖 

11, ENTRYPOINT

    指定一个容器启动时要运行的命令, ENTRYPOINT的目的和CMD一样, 都是在指定容器启动程序及参数

    Hong: 类似于CMD, 但是这货不会被覆盖, 而是追加在后边, 联合docker run 可以实现更贴切的命令

12, ONBUILD

    当构建一个被继承的Dockerfile时运行命令, 父镜像在被子继承后父镜像的onbuild被触发

    Hong: 相当于一个触发器, 有子镜像继承时候, 父镜像设置了ONBUILD, 这时候, **子镜像被构建的时候, 父镜像的ONBUILD就会执行**

测试CMD

#volume test
FROM centos
MAINTAINER Hong9752@qq.com
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools #安装ifconifg 指令
CMD echo $MYPATH
CMD echo "finished , --------  success"
CMD /bin/bash
docker build -f Dockerfilecmd2 -t  mycentoscmd/1.0 .   #使用dockfile构建镜像
docker run -it mycentoscmd/1.0   #启动容器
#测试vim 和ifconfig能不能用
ifconfig
vim 1.txt
docker history  6f45277af51b  #使用history查看镜像构建历史, 第一步是最下边,最后一行

测试ENTRYPOINT

#volume test
FROM centos
RUN yum install -y curl
CMD echo "finished , --------  success"
ENTRYPOINT ["curl","-s","https://ip.cn"]
#省略构建镜像, 启动容器步骤
docker run -it mycentosentrypoint/2.0 -i
#此时这个-i 就相当于追加到  ENTRYPOINT ["curl","-s -i","https://ip.cn"]

测试ONBUILD

#volume test
FROM centos
ONBUILD RUN echo "father go go go!"
 docker build -f Dockerfileonbuild4 -t  mycentosonbuild/3.0 .
image.png

视频自定义tomcat的dockerfile

测试之前前提需要在 /usr/local/ 有tomcat9 和jdk8的压缩包, 而且名字得和下边文件配置的对应起来

还有当前目录下有c.txt


image.png
#启动自定义tomcat容器命令
docker run -d -p 9080:8080 --name mytomcat -v /hong/tomcat-test/:/usr/local/apache-tomcat-9.0.8/webapps/test -v /hong/tomcat-log/:/usr/local/tomcat-9.0.8/logs --privileged=true mytomcat9

#命令解释
-d 后台启动
--name  自定义名字
-v /hong/tomcat-test/:/usr/local/apache-tomcat-9.0.8/webapps/test   
-v /hong/tomcat-log/:/usr/local/tomcat-9.0.8/logs
挂载卷, 方便在宿主机上能看到容器中的东西, 也方便传数据
mytomcat9  镜像名

docker 安装mysql

拉取mysql镜像省略

mysql启动


image.png
docker exec 容器id sh -c ' exec mysqldbump --all-database -uroot -p "123456" ' > /hong/all-database.sql

#执行mysqldump命令, 将所有的数据库(all-database) 导出( > ) 到宿主机的 all-database.sql文件中


docker 安装redis

#启动redis
docker run -p 6379:6379 -v /zzyyuse/myredis/data:/data -v /zzyyuse/myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis:3.2 redis-server /usr/local/etc/redis/redis.conf --appendonly yes

#链接redis
docker exec -it 运行着redis服务器的容器id  redis-cli 

注意配置redis.conf的时候不要使用 bind 0.0.0.0 绑定主机, 直接注释掉就行了

docker 推送到阿里云

docker run -it mycentoscmd/1.0   #运行带有vim和ifconfig的镜像容器
docker commit -a Hong -m "new mycentosvim from local" 5f25863290a6 commitcentos:4.0
#提交创建新的镜像

登录阿里云,创建镜像仓库


image.png

image.png
docker login --username=天卿不负 registry.cn-hangzhou.aliyuncs.com
如果需要输入密码输入:   Hong545.
image.png

使用上边代码推送镜像到阿里云仓库

docker tag 6bd081759b0e registry.cn-hangzhou.aliyuncs.com/hong_sky/studycentos:4.0.1
docker push registry.cn-hangzhou.aliyuncs.com/hong_sky/studycentos:4.0.1
docker images 

可以看到镜像已经推送上去了


image.png

image.png

从阿里云上搜索


image.png

看到也可以搜出来, 删除本地镜像, 从阿里云上拉下来, 测试vim和ifconfig能不能用
docker rmi  -f 6bd081759b0e  #删除构建的镜像
#拉取阿里云的镜像
docker pull  阿里云地址
    docker pull registry.cn-hangzhou.aliyuncs.com/hong_sky/studycentos:4.0.1

使用边地址pull的时候, 主要后边要加对应的版本(4.0.1),不然他也不知道要拉哪一个镜像


image.png

安装docker CE版

cat /etc/redhat-release p   # centos版本要高于7
yum remove docker docker-client  docker-client-latest   docker-common  docker-latest  docker-latest-logrotate  docker-logrotate   docker-engine
#卸载安装过的docker的老版本

yum install -y yum-utils
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo   
    #这句话链接的是外网, 经常报ERROR14 ERROR12 , 所以需要换成阿里云的
yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo   
cat /etc/yum.repos.d/docker-ce.repo    #执行完可以查看,镜像源已经被修改
yum makecache fast  #更新yum
yum -y install docker-ce
systemctl start docker
docker version

配置镜像加速
mkdir -p /etc/docker
vim /etc/docker/daemon.json
systemctl daemon-reload
systemctl restart docker

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

推荐阅读更多精彩内容