還沒弄懂 Docker 嗎恳谎?萬字詳解讓你“醍醐灌頂”

一芝此、簡介

1、了解Docker的前生LXC

LXC為Linux Container的簡寫因痛』槠唬可以提供輕量級的虛擬化,以便隔離進程和資源鸵膏,而且不需要提供指令解釋機制以及全虛擬化的其他復雜性膊升。相當于C++中的NameSpace。容器有效地將由單個操作系統(tǒng)管理的資源劃分到孤立的組中谭企,以更好地在孤立的組之間平衡有沖突的資源使用需求廓译。

與傳統(tǒng)虛擬化技術(shù)相比,它的優(yōu)勢在于:

(1)與宿主機使用同一個內(nèi)核债查,性能損耗蟹乔;
(2)不需要指令級模擬盹廷;
(3)不需要即時(Just-in-time)編譯征绸;
(4)容器可以在CPU核心的本地運行指令,不需要任何專門的解釋機制;
(5)避免了準虛擬化和系統(tǒng)調(diào)用替換中的復雜性管怠;
(6)輕量級隔離淆衷,在隔離的同時還提供共享機制,以實現(xiàn)容器與宿主機的資源共享渤弛。

總結(jié):Linux Container是一種輕量級的虛擬化的手段祝拯。

Linux Container提供了在單一可控主機節(jié)點上支持多個相互隔離的server container同時執(zhí)行的機制。Linux Container有點像chroot暮芭,提供了一個擁有自己進程和網(wǎng)絡空間的虛擬環(huán)境鹿驼,但又有別于虛擬機欲低,因為lxc是一種操作系統(tǒng)層次上的資源的虛擬化辕宏。

2、LXC與docker什么關(guān)系砾莱?

docker并不是LXC替代品瑞筐,docker底層使用了LXC來實現(xiàn),LXC將linux進程沙盒化腊瑟,使得進程之間相互隔離聚假,并且能夠課哦內(nèi)閣制各進程的資源分配。

在LXC的基礎之上闰非,docker提供了一系列更強大的功能膘格。

3、什么是docker

docker是一個開源的應用容器引擎财松,基于go語言開發(fā)并遵循了apache2.0協(xié)議開源瘪贱。

docker可以讓開發(fā)者打包他們的應用以及依賴包到一個輕量級、可移植的容器中辆毡,然后發(fā)布到任何流行的linux服務器菜秦,也可以實現(xiàn)虛擬化。

容器是完全使用沙箱機制舶掖,相互之間不會有任何接口(類iphone的app)球昨,并且容器開銷極其低。

4眨攘、docker官方文檔

https://docs.docker.com/

5主慰、為什么docker越來越受歡迎

官方話語:

  • 容器化越來越受歡迎,因為容器是:

  • 靈活:即使是最復雜的應用也可以集裝箱化鲫售。

  • 輕量級:容器利用并共享主機內(nèi)核共螺。

  • 可互換:您可以即時部署更新和升級。

  • 便攜式:您可以在本地構(gòu)建龟虎,部署到云璃谨,并在任何地方運行。

  • 可擴展:您可以增加并自動分發(fā)容器副本。

  • 可堆疊:您可以垂直和即時堆疊服務佳吞。

  • 鏡像和容器(contalners)

通過鏡像啟動一個容器拱雏,一個鏡像是一個可執(zhí)行的包,其中包括運行應用程序所需要的所有內(nèi)容包含代碼底扳,運行時間铸抑,庫、環(huán)境變量衷模、和配置文件鹊汛。容器是鏡像的運行實例,當被運行時有鏡像狀態(tài)和用戶進程阱冶,可以使用docker ps 查看刁憋。

  • 容器和虛擬機

容器時在linux上本機運行,并與其他容器共享主機的內(nèi)核木蹬,它運行的一個獨立的進程至耻,不占用其他任何可執(zhí)行文件的內(nèi)存,非常輕量镊叁。虛擬機運行的是一個完成的操作系統(tǒng)尘颓,通過虛擬機管理程序?qū)χ鳈C資源進行虛擬訪問,相比之下需要的資源更多晦譬。

6疤苹、docker版本

Docker Community Edition(CE)社區(qū)版Enterprise Edition(EE) 商業(yè)版

7、docker和openstack的幾項對比
8敛腌、容器在內(nèi)核中支持2種重要技術(shù)

docker本質(zhì)就是宿主機的一個進程卧土,docker是通過namespace實現(xiàn)資源隔離,通過cgroup實現(xiàn)資源限制迎瞧,通過寫時復制技術(shù)(copy-on-write)實現(xiàn)了高效的文件操作(類似虛擬機的磁盤比如分配500g并不是實際占用物理磁盤500g)

1)namespaces 名稱空間

2)control Group 控制組cgroup的特點是:

  • cgroup的api以一個偽文件系統(tǒng)的實現(xiàn)方式夸溶,用戶的程序可以通過文件系統(tǒng)實現(xiàn)cgroup的組件管理

  • cgroup的組件管理操作單元可以細粒度到線程級別,另外用戶可以創(chuàng)建和銷毀cgroup凶硅,從而實現(xiàn)資源載分配和再利用

  • 所有資源管理的功能都以子系統(tǒng)的方式實現(xiàn)缝裁,接口統(tǒng)一子任務創(chuàng)建之初與其父任務處于同一個cgroup的控制組

四大功能:

  • 資源限制:可以對任務使用的資源總額進行限制

  • 優(yōu)先級分配:通過分配的cpu時間片數(shù)量以及磁盤IO帶寬大小,實際上相當于控制了任務運行優(yōu)先級

  • 資源統(tǒng)計:可以統(tǒng)計系統(tǒng)的資源使用量足绅,如cpu時長捷绑,內(nèi)存用量等

  • 任務控制:cgroup可以對任務執(zhí)行掛起、恢復等操作

9氢妈、了解docker三個重要概念

1)image鏡像docker鏡像就是一個只讀模板粹污,比如,一個鏡像可以包含一個完整的centos首量,里面僅安裝apache或用戶的其他應用壮吩,鏡像可以用來創(chuàng)建docker容器进苍,另外docker提供了一個很簡單的機制來創(chuàng)建鏡像或者更新現(xiàn)有的鏡像,用戶甚至可以直接從其他人那里下周一個已經(jīng)做好的鏡像來直接使用

2)container容器docker利用容器來運行應用鸭叙,容器是從鏡像創(chuàng)建的運行實例觉啊,它可以被啟動教硫,開始殖卑、停止、刪除执泰、每個容器都是互相隔離的宋下,保證安全的平臺嗡善,可以吧容器看做是要給簡易版的linux環(huán)境(包括root用戶權(quán)限、鏡像空間学歧、用戶空間和網(wǎng)絡空間等)和運行再其中的應用程序

3)repostory倉庫倉庫是集中存儲鏡像文件的滄桑罩引,registry是倉庫主從服務器,實際上參考注冊服務器上存放著多個倉庫撩满,每個倉庫中又包含了多個鏡像蜒程,每個鏡像有不同的標簽(tag)倉庫分為兩種绅你,公有參考伺帘,和私有倉庫,最大的公開倉庫是docker Hub忌锯,存放了數(shù)量龐大的鏡像供用戶下周伪嫁,國內(nèi)的docker pool,這里倉庫的概念與Git類似偶垮,registry可以理解為github這樣的托管服務张咳。

10、docker的主要用途

官方就是Bulid 似舵、ship脚猾、run any app/any where,編譯砚哗、裝載龙助、運行、任何app/在任意地放都能運行蛛芥。就是實現(xiàn)了應用的封裝提鸟、部署、運行的生命周期管理只要在glibc的環(huán)境下仅淑,都可以運行称勋。運維生成環(huán)境中:docker化。

  • 發(fā)布服務不用擔心服務器的運行環(huán)境涯竟,所有的服務器都是自動分配docker赡鲜,自動部署空厌,自動安裝,自動運行

  • 再不用擔心其他服務引擎的磁盤問題银酬,cpu問題蝇庭,系統(tǒng)問題了

  • 資源利用更出色

  • 自動遷移,可以制作鏡像捡硅,遷移使用自定義的鏡像即可遷移哮内,不會出現(xiàn)什么問題

  • 管理更加方便了

11、docker改變了什么
  • 面向產(chǎn)品:產(chǎn)品交付

  • 面向開發(fā):簡化環(huán)境配置

  • 面向測試:多版本測試

  • 面向運維:環(huán)境一致性

  • 面向架構(gòu):自動化擴容(微服務)

二壮韭、docker架構(gòu)

1北发、總體架構(gòu)
  • distribution 負責與docker registry交互,上傳洗澡鏡像以及v2 registry 有關(guān)的源數(shù)據(jù)

  • registry負責docker registry有關(guān)的身份認證喷屋、鏡像查找琳拨、鏡像驗證以及管理registry mirror等交互操作

  • image 負責與鏡像源數(shù)據(jù)有關(guān)的存儲、查找屯曹,鏡像層的索引狱庇、查找以及鏡像tar包有關(guān)的導入、導出操作

  • reference負責存儲本地所有鏡像的repository和tag名恶耽,并維護與鏡像id之間的映射關(guān)系

  • layer模塊負責與鏡像層和容器層源數(shù)據(jù)有關(guān)的增刪改查密任,并負責將鏡像層的增刪改查映射到實際存儲鏡像層文件的graphdriver模塊

  • graghdriver是所有與容器鏡像相關(guān)操作的執(zhí)行者

2、docker架構(gòu)2

如果覺得上面架構(gòu)圖比較亂可以看這個架構(gòu):

從上圖不難看出偷俭,用戶是使用Docker Client與Docker Daemon建立通信浪讳,并發(fā)送請求給后者。而Docker Daemon作為Docker架構(gòu)中的主體部分涌萤,首先提供Server的功能使其可以接受Docker Client的請求淹遵;而后Engine執(zhí)行Docker內(nèi)部的一系列工作,每一項工作都是以一個Job的形式的存在负溪。Job的運行過程中透揣,當需要容器鏡像時,則從Docker Registry中下載鏡像川抡,并通過鏡像管理驅(qū)動graphdriver將下載鏡像以Graph的形式存儲辐真;當需要為Docker創(chuàng)建網(wǎng)絡環(huán)境時,通過網(wǎng)絡管理驅(qū)動networkdriver創(chuàng)建并配置Docker容器網(wǎng)絡環(huán)境猖腕;當需要限制Docker容器運行資源或執(zhí)行用戶指令等操作時拆祈,則通過execdriver來完成。而libcontainer是一項獨立的容器管理包倘感,networkdriver以及execdriver都是通過libcontainer來實現(xiàn)具體對容器進行的操作放坏。當執(zhí)行完運行容器的命令后,一個實際的Docker容器就處于運行狀態(tài)老玛,該容器擁有獨立的文件系統(tǒng)淤年,獨立并且安全的運行環(huán)境等钧敞。

3、docker架構(gòu)3

再來看看另外一個架構(gòu)麸粮,這個個架構(gòu)就簡單清晰指明了server/client交互溉苛,容器和鏡像、數(shù)據(jù)之間的一些聯(lián)系弄诲。

這個架構(gòu)圖更加清晰了架構(gòu)docker daemon就是docker的守護進程即server端愚战,可以是遠程的,也可以是本地的齐遵,這個不是C/S架構(gòu)嗎寂玲,客戶端Docker client 是通過rest api進行通信。docker cli 用來管理容器和鏡像梗摇,客戶端提供一個只讀鏡像拓哟,然后通過鏡像可以創(chuàng)建多個容器,這些容器可以只是一個RFS(Root file system根文件系統(tǒng))伶授,也可以ishi一個包含了用戶應用的RFS断序,容器再docker client中只是要給進程,兩個進程之間互不可見糜烹。用戶不能與server直接交互违诗,但可以通過與容器這個橋梁來交互,由于是操作系統(tǒng)級別的虛擬技術(shù)景图,中間的損耗幾乎可以不計较雕。

三、docker架構(gòu)2各個模塊的功能(帶完善)

主要的模塊有:Docker Client挚币、Docker Daemon、Docker Registry扣典、Graph妆毕、Driver、libcontainer以及Docker container贮尖。

1笛粘、docker client

docker client 是docker架構(gòu)中用戶用來和docker daemon建立通信的客戶端,用戶使用的可執(zhí)行文件為docker湿硝,通過docker命令行工具可以發(fā)起眾多管理container的請求薪前。

docker client可以通過一下三宗方式和docker daemon建立通信:tcp://host:port;unix:path_to_socket;fd://socketfd。关斜,docker client可以通過設置命令行flag參數(shù)的形式設置安全傳輸層協(xié)議(TLS)的有關(guān)參數(shù)示括,保證傳輸?shù)陌踩浴?/p>

docker client發(fā)送容器管理請求后,由docker daemon接受并處理請求痢畜,當docker client 接收到返回的請求相應并簡單處理后垛膝,docker client 一次完整的生命周期就結(jié)束了鳍侣,當需要繼續(xù)發(fā)送容器管理請求時,用戶必須再次通過docker可以執(zhí)行文件創(chuàng)建docker client吼拥。

2倚聚、docker daemon

docker daemon 是docker架構(gòu)中一個常駐在后臺的系統(tǒng)進程,功能是:接收處理docker client發(fā)送的請求凿可。該守護進程在后臺啟動一個server惑折,server負載接受docker client發(fā)送的請求;接受請求后枯跑,server通過路由與分發(fā)調(diào)度唬复,找到相應的handler來執(zhí)行請求。

docker daemon啟動所使用的可執(zhí)行文件也為docker全肮,與docker client啟動所使用的可執(zhí)行文件docker相同敞咧,在docker命令執(zhí)行時,通過傳入的參數(shù)來判別docker daemon與docker client辜腺。

docker daemon的架構(gòu)可以分為:docker server休建、engine、job评疗。daemon

3测砂、docker server

docker server在docker架構(gòu)中時專門服務于docker client的server,該server的功能時:接受并調(diào)度分發(fā)docker client發(fā)送的請求百匆,架構(gòu)圖如下

在Docker的啟動過程中砌些,通過包gorilla/mux(golang的類庫解析),創(chuàng)建了一個mux.Router加匈,提供請求的路由功能存璃。在Golang中,gorilla/mux是一個強大的URL路由器以及調(diào)度分發(fā)器雕拼。該mux.Router中添加了眾多的路由項纵东,每一個路由項由HTTP請求方法(PUT、POST啥寇、GET或DELETE)偎球、URL、Handler三部分組成辑甜。

若Docker Client通過HTTP的形式訪問Docker Daemon衰絮,創(chuàng)建完mux.Router之后,Docker將Server的監(jiān)聽地址以及mux.Router作為參數(shù)磷醋,創(chuàng)建一個httpSrv=http.Server{}猫牡,最終執(zhí)行httpSrv.Serve()為請求服務。

在Server的服務過程中子檀,Server在listener上接受Docker Client的訪問請求镊掖,并創(chuàng)建一個全新的goroutine來服務該請求乃戈。在goroutine中,首先讀取請求內(nèi)容亩进,然后做解析工作症虑,接著找到相應的路由項,隨后調(diào)用相應的Handler來處理該請求归薛,最后Handler處理完請求之后回復該請求谍憔。

需要注意的是:Docker Server的運行在Docker的啟動過程中,是靠一個名為”serveapi”的job的運行來完成的主籍。原則上习贫,Docker Server的運行是眾多job中的一個,但是為了強調(diào)Docker Server的重要性以及為后續(xù)job服務的重要特性千元,將該”serveapi”的job單獨抽離出來分析苫昌,理解為Docker Server。

4幸海、engine

Engine是Docker架構(gòu)中的運行引擎祟身,同時也Docker運行的核心模塊。它扮演Docker container存儲倉庫的角色物独,并且通過執(zhí)行job的方式來操縱管理這些容器袜硫。

在Engine數(shù)據(jù)結(jié)構(gòu)的設計與實現(xiàn)過程中,有一個handler對象挡篓。該handler對象存儲的都是關(guān)于眾多特定job的handler處理訪問婉陷。舉例說明,Engine的handler對象中有一項為:{“create”: daemon.ContainerCreate,}官研,則說明當名為”create”的job在運行時秽澳,執(zhí)行的是daemon.ContainerCreate的handler。

5阀参、job

一個Job可以認為是Docker架構(gòu)中Engine內(nèi)部最基本的工作執(zhí)行單元肝集。Docker可以做的每一項工作,都可以抽象為一個job蛛壳。例如:在容器內(nèi)部運行一個進程,這是一個job所刀;創(chuàng)建一個新的容器衙荐,這是一個job,從Internet上下載一個文檔浮创,這是一個job忧吟;包括之前在Docker Server部分說過的,創(chuàng)建Server服務于HTTP的API斩披,這也是一個job溜族,等等讹俊。

Job的設計者,把Job設計得與Unix進程相仿煌抒。比如說:Job有一個名稱仍劈,有參數(shù),有環(huán)境變量寡壮,有標準的輸入輸出贩疙,有錯誤處理,有返回狀態(tài)等况既。

6这溅、docker registry

Docker Registry是一個存儲容器鏡像的倉庫。而容器鏡像是在容器被創(chuàng)建時棒仍,被加載用來初始化容器的文件架構(gòu)與目錄悲靴。

在Docker的運行過程中,Docker Daemon會與Docker Registry通信莫其,并實現(xiàn)搜索鏡像癞尚、下載鏡像、上傳鏡像三個功能榜配,這三個功能對應的job名稱分別為”search”否纬,”pull” 與 “push”。

其中蛋褥,在Docker架構(gòu)中临燃,Docker可以使用公有的Docker Registry,即大家熟知的Docker Hub烙心,如此一來膜廊,Docker獲取容器鏡像文件時,必須通過互聯(lián)網(wǎng)訪問Docker Hub淫茵;同時Docker也允許用戶構(gòu)建本地私有的Docker Registry爪瓜,這樣可以保證容器鏡像的獲取在內(nèi)網(wǎng)完成。

7匙瘪、Graph

Graph在Docker架構(gòu)中扮演已下載容器鏡像的保管者铆铆,以及已下載容器鏡像之間關(guān)系的記錄者。一方面丹喻,Graph存儲著本地具有版本信息的文件系統(tǒng)鏡像薄货,另一方面也通過GraphDB記錄著所有文件系統(tǒng)鏡像彼此之間的關(guān)系。

Graph的架構(gòu)如下:

其中碍论,GraphDB是一個構(gòu)建在SQLite之上的小型圖數(shù)據(jù)庫谅猾,實現(xiàn)了節(jié)點的命名以及節(jié)點之間關(guān)聯(lián)關(guān)系的記錄。它僅僅實現(xiàn)了大多數(shù)圖數(shù)據(jù)庫所擁有的一個小的子集,但是提供了簡單的接口表示節(jié)點之間的關(guān)系税娜。

同時在Graph的本地目錄中坐搔,關(guān)于每一個的容器鏡像,具體存儲的信息有:該容器鏡像的元數(shù)據(jù)敬矩,容器鏡像的大小信息概行,以及該容器鏡像所代表的具體rootfs。

8谤绳、driver

Driver是Docker架構(gòu)中的驅(qū)動模塊占锯。通過Driver驅(qū)動,Docker可以實現(xiàn)對Docker容器執(zhí)行環(huán)境的定制缩筛。由于Docker運行的生命周期中消略,并非用戶所有的操作都是針對Docker容器的管理,另外還有關(guān)于Docker運行信息的獲取瞎抛,Graph的存儲與記錄等艺演。因此,為了將Docker容器的管理從Docker Daemon內(nèi)部業(yè)務邏輯中區(qū)分開來桐臊,設計了Driver層驅(qū)動來接管所有這部分請求胎撤。

在Docker Driver的實現(xiàn)中,可以分為以下三類驅(qū)動:graphdriver断凶、networkdriver和execdriver伤提。

graphdriver主要用于完成容器鏡像的管理,包括存儲與獲取认烁。即當用戶需要下載指定的容器鏡像時肿男,graphdriver將容器鏡像存儲在本地的指定目錄;同時當用戶需要使用指定的容器鏡像來創(chuàng)建容器的rootfs時却嗡,graphdriver從本地鏡像存儲目錄中獲取指定的容器鏡像舶沛。

在graphdriver的初始化過程之前,有4種文件系統(tǒng)或類文件系統(tǒng)在其內(nèi)部注冊窗价,它們分別是aufs如庭、btrfs、vfs和devmapper撼港。而Docker在初始化之時坪它,通過獲取系統(tǒng)環(huán)境變量”DOCKER_DRIVER”來提取所使用driver的指定類型。而之后所有的graph操作帝牡,都使用該driver來執(zhí)行哟楷。

graphdriver的架構(gòu)如下:

networkdriver的用途是完成Docker容器網(wǎng)絡環(huán)境的配置,其中包括Docker啟動時為Docker環(huán)境創(chuàng)建網(wǎng)橋否灾;Docker容器創(chuàng)建時為其創(chuàng)建專屬虛擬網(wǎng)卡設備;以及為Docker容器分配IP鸣奔、端口并與宿主機做端口映射墨技,設置容器防火墻策略等惩阶。networkdriver的架構(gòu)如下:

execdriver作為Docker容器的執(zhí)行驅(qū)動,負責創(chuàng)建容器運行命名空間扣汪,負責容器資源使用的統(tǒng)計與限制断楷,負責容器內(nèi)部進程的真正運行等。在execdriver的實現(xiàn)過程中崭别,原先可以使用LXC驅(qū)動調(diào)用LXC的接口冬筒,來操縱容器的配置以及生命周期,而現(xiàn)在execdriver默認使用native驅(qū)動茅主,不依賴于LXC舞痰。

具體體現(xiàn)在Daemon啟動過程中加載的ExecDriverflag參數(shù),該參數(shù)在配置文件已經(jīng)被設為”native”诀姚。這可以認為是Docker在1.2版本上一個很大的改變响牛,或者說Docker實現(xiàn)跨平臺的一個先兆。

execdriver架構(gòu)如下:

9赫段、libcontainer

libcontainer是Docker架構(gòu)中一個使用Go語言設計實現(xiàn)的庫呀打,設計初衷是希望該庫可以不依靠任何依賴,直接訪問內(nèi)核中與容器相關(guān)的API糯笙。

正是由于libcontainer的存在贬丛,Docker可以直接調(diào)用libcontainer,而最終操縱容器的namespace给涕、cgroups豺憔、apparmor、網(wǎng)絡設備以及防火墻規(guī)則等稠炬。這一系列操作的完成都不需要依賴LXC或者其他包焕阿。libcontainer架構(gòu)如下:

另外,libcontainer提供了一整套標準的接口來滿足上層對容器管理的需求首启∧郝牛或者說,libcontainer屏蔽了Docker上層對容器的直接管理毅桃。又由于libcontainer使用Go這種跨平臺的語言開發(fā)實現(xiàn)褒纲,且本身又可以被上層多種不同的編程語言訪問,因此很難說钥飞,未來的Docker就一定會緊緊地和Linux捆綁在一起莺掠。而于此同時,Microsoft在其著名云計算平臺Azure中读宙,也添加了對Docker的支持彻秆,可見Docker的開放程度與業(yè)界的火熱度。

暫不談Docker,由于libcontainer的功能以及其本身與系統(tǒng)的松耦合特性唇兑,很有可能會在其他以容器為原型的平臺出現(xiàn)酒朵,同時也很有可能催生出云計算領域全新的項目。

10扎附、docker container

Docker container(Docker容器)是Docker架構(gòu)中服務交付的最終體現(xiàn)形式蔫耽。Docker按照用戶的需求與指令,訂制相應的Docker容器:

  • 用戶通過指定容器鏡像留夜,使得Docker容器可以自定義rootfs等文件系統(tǒng)匙铡;

  • 用戶通過指定計算資源的配額,使得Docker容器使用指定的計算資源碍粥;

  • 用戶通過配置網(wǎng)絡及其安全策略鳖眼,使得Docker容器擁有獨立且安全的網(wǎng)絡環(huán)境;

  • 用戶通過指定運行的命令即纲,使得Docker容器執(zhí)行指定的工作具帮。

四、docker簡單使用

1低斋、安裝
yum install docker -y 
systemctl enable docker
systemctl start docker

注意:啟動前應當設置源

vim /usr/lib/systemd/system/docker.service

這里設置阿里的蜂厅,注冊阿里云賬戶號每個用戶都有:

[root@web1 ~]# vim /usr/lib/systemd/system/docker.service

[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.com
After=network.target
Wants=docker-storage-setup.service
Requires=docker-cleanup.timer

[Service]
Type=notify
NotifyAccess=main
EnvironmentFile=-/run/containers/registries.conf
EnvironmentFile=-/etc/sysconfig/docker
EnvironmentFile=-/etc/sysconfig/docker-storage
EnvironmentFile=-/etc/sysconfig/docker-network
Environment=GOTRACEBACK=crash
Environment=DOCKER_HTTP_HOST_COMPAT=1
Environment=PATH=/usr/libexec/docker:/usr/bin:/usr/sbin
ExecStart=/usr/bin/dockerd-current --registry-mirror=https://rfcod7oz.mirror.aliyuncs.com  #這個值可以登陸阿里云賬號請參考下圖
          --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current 
          --default-runtime=docker-runc 
          --exec-opt native.cgroupdriver=systemd 
          --userland-proxy-path=/usr/libexec/docker/docker-proxy-current 
          --init-path=/usr/libexec/docker/docker-init-current 
          --seccomp-profile=/etc/docker/seccomp.json 
          $OPTIONS 
          $DOCKER_STORAGE_OPTIONS 
          $DOCKER_NETWORK_OPTIONS 
          $ADD_REGISTRY 
          $BLOCK_REGISTRY 
          $INSECURE_REGISTRY 
          $REGISTRIES
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
TimeoutStartSec=0
Restart=on-abnormal
KillMode=process

[Install]
WantedBy=multi-user.target
2、docker版本查詢
[root@web1 ~]# docker version
Client:
 Version:         1.13.1
 API version:     1.26
 Package version: docker-1.13.1-96.gitb2f74b2.el7.centos.x86_64
 Go version:      go1.10.3
 Git commit:      b2f74b2/1.13.1
 Built:           Wed May  1 14:55:20 2019
 OS/Arch:         linux/amd64

Server:
 Version:         1.13.1
 API version:     1.26 (minimum version 1.12)
 Package version: docker-1.13.1-96.gitb2f74b2.el7.centos.x86_64
 Go version:      go1.10.3
 Git commit:      b2f74b2/1.13.1
 Built:           Wed May  1 14:55:20 2019
 OS/Arch:         linux/amd64
 Experimental:    false
3膊畴、搜索下載鏡像
docker pull alpine          #下載鏡像
docker search nginx          #查看鏡像
docker pull nginx
4掘猿、查看已經(jīng)下載的鏡像
[root@web1 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
zxg/my_nginx        v1                  b164f4c07c64        8 days ago          126 MB
zxg/my_nginx        latest              f07837869dfc        8 days ago          126 MB
docker.io/nginx     latest              e445ab08b2be        2 weeks ago         126 MB
docker.io/alpine    latest              b7b28af77ffe        3 weeks ago         5.58 MB
docker.io/centos    latest              9f38484d220f        4 months ago        202 MB
[root@web1 ~]#
5、導出鏡像
docker  save nginx >/tmp/nginx.tar.gz
6唇跨、刪除鏡像
docker rmi -f nginx
7稠通、導入鏡像
docker load </tmp/nginx.tar.gz
8蝇摸、默認配置文件

vim /usr/lib/systemd/system/docker.service

[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.com
After=network.target
Wants=docker-storage-setup.service
Requires=docker-cleanup.timer

[Service]
Type=notify
NotifyAccess=main
EnvironmentFile=-/run/containers/registries.conf
EnvironmentFile=-/etc/sysconfig/docker
EnvironmentFile=-/etc/sysconfig/docker-storage
EnvironmentFile=-/etc/sysconfig/docker-network
Environment=GOTRACEBACK=crash
Environment=DOCKER_HTTP_HOST_COMPAT=1
Environment=PATH=/usr/libexec/docker:/usr/bin:/usr/sbin
ExecStart=/usr/bin/dockerd-current --registry-mirror=https://rfcod7oz.mirror.aliyuncs.com 
          --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current 
          --default-runtime=docker-runc 
          --exec-opt native.cgroupdriver=systemd 
          --userland-proxy-path=/usr/libexec/docker/docker-proxy-current 
          --init-path=/usr/libexec/docker/docker-init-current 
          --seccomp-profile=/etc/docker/seccomp.json 
          $OPTIONS 
          $DOCKER_STORAGE_OPTIONS 
          $DOCKER_NETWORK_OPTIONS 
          $ADD_REGISTRY 
          $BLOCK_REGISTRY 
          $INSECURE_REGISTRY 
          $REGISTRIES
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
TimeoutStartSec=0
Restart=on-abnormal
KillMode=process

[Install]
WantedBy=multi-user.target
~
~
~
~

如果更改存儲目錄就添加

--graph=/opt/docker

如果更改DNS——默認采用宿主機的dns

--dns=xxxx的方式指定
9尼变、運行hello world

這里用centos鏡像echo一個hello word

[root@web1 overlay2]#  docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
zxg/my_nginx        v1                  b164f4c07c64        8 days ago          126 MB
zxg/my_nginx        latest              f07837869dfc        8 days ago          126 MB
docker.io/nginx     latest              e445ab08b2be        2 weeks ago         126 MB
docker.io/alpine    latest              b7b28af77ffe        3 weeks ago         5.58 MB
docker.io/centos    latest              9f38484d220f        4 months ago        202 MB
[root@web1 overlay2]# docker run centos echo "hello world"
hello world
[root@web1 overlay2]#
10汰瘫、運行一個容器-run
[root@web1 overlay2]# docker run -it alpine sh   #運行并進入alpine
/ #
/ #
/ #
/ #
/ #
/ # ls
bin    etc    lib    mnt    proc   run    srv    tmp    var
dev    home   media  opt    root   sbin   sys    usr
/ # cd tmp
/tmp # exit

后臺運行(-d后臺運行)(--name添加一個名字)

[root@web1 overlay2]# docker run -it -d --name test1 alpine
ac46c019b800d34c37d4f9dcd56c974cb82eca3acf185e5f8f80c8a60075e343
[root@web1 overlay2]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
ac46c019b800        alpine              "/bin/sh"           5 seconds ago       Up 3 seconds                            test1
[root@web1 overlay2]#

還有一種-rm參數(shù)家卖,ctrl+c后就刪除,可以測試環(huán)境用剃盾,生成環(huán)境用的少

[root@web1 overlay2]# docker run -it  --rm --name centos nginx
^C[root@web1 overlay2]#
##另開一個窗口
[root@web1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
3397b96ea7bd        nginx               "nginx -g 'daemon ..."   27 seconds ago      Up 25 seconds       80/tcp              centos
ac46c019b800        alpine              "/bin/sh"                4 minutes ago       Up 4 minutes                            test1
[root@web1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
ac46c019b800        alpine              "/bin/sh"           4 minutes ago       Up 4 minutes                            test1
[root@web1 ~]#
11逆屡、如何進入容器

三種方法前鹅,上面已經(jīng)演示了一種
第一種高诺,需要容器本身的pid及util-linux碌识,不推薦,暫時不演示了
第二種虱而,不分配bash終端的一種實施操作筏餐,不推薦,這種操作如果在開一個窗口也能看到操作的指令牡拇,所有人都能看到魁瞪。

[root@web1 overlay2]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
9fc796e928d7        nginx               "sh"                2 minutes ago       Up 8 seconds        80/tcp              mynginx
ac46c019b800        alpine              "/bin/sh"           12 minutes ago      Up 12 minutes                           test1
[root@web1 overlay2]# docker attach mynginx

#
#
#
#
# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
# exit  
[root@web1 overlay2]# docker attach mynginx
You cannot attach to a stopped container, start it first
[root@web1 overlay2]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
ac46c019b800        alpine              "/bin/sh"           13 minutes ago      Up 13 minutes                           test1
[root@web1 overlay2]#

第三種:exec方式穆律,終端時分開的,推薦

[root@web1 overlay2]# docker exec -it mynginx sh
#
#
#
# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
# exit
[root@web1 overlay2]#
[root@web1 overlay2]#
[root@web1 overlay2]#
[root@web1 overlay2]# docker pa
docker: 'pa' is not a docker command.
See 'docker --help'
[root@web1 overlay2]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
6fc2d091cfe9        nginx               "nginx -g 'daemon ..."   45 seconds ago      Up 43 seconds       80/tcp              mynginx
ac46c019b800        alpine              "/bin/sh"                16 minutes ago      Up 16 minutes                           test1
12佩番、查看docker進程及刪除容器

上面已經(jīng)演示:

[root@web1 overlay2]# docker ps -a       #-a :顯示所有的容器众旗,包括未運行的
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                          PORTS               NAMES
9fc796e928d7        nginx               "sh"                     4 minutes ago       Exited (0) About a minute ago                       mynginx
ac46c019b800        alpine              "/bin/sh"                15 minutes ago      Up 15 minutes                                       test1
3bf234febeaa        alpine              "sh"                     17 minutes ago      Exited (0) 16 minutes ago                           youthful_lumiere
ab113c63f0b4        centos              "echo 'hello world'"     31 minutes ago      Exited (0) 31 minutes ago                           infallible_torvalds
b326027dcf42        zxg/my_nginx        "nginx"                  8 days ago          Exited (0) 8 days ago                               my_nginx
4f1f1ca319f2        centos              "bash"                   8 days ago          Exited (137) 8 days ago                             musing_lichterman
64b4e32991c7        nginx               "nginx -g 'daemon ..."   12 days ago         Exited (0) 12 days ago                              mynginx1
aee506fe7b5a        alpine              "sh"                     12 days ago         Created                                             infallible_haibt
70620c73b9a0        alpine              "sh"                     12 days ago         Created                                             gallant_volhard
7655cbf87bb0        alpine              "sh"                     12 days ago         Created                                             agitated_brahmagupta
33fb949372e8        fce289e99eb9        "/hello"                 12 days ago         Created                                             elastic_dijkstra
9de47616aea4        fce289e99eb9        "/hello"                 13 days ago         Created                                             confident_fermi
[root@web1 overlay2]# docker rm 9fc796e928d7 #rm時刪除一個或多個容器
9fc796e928d7
13、查看容器詳細信息

并不需要進入到容器里面趟畏,通過查看詳細信息看到了剛才運行的nginx,宿主機curl ip地址訪問一下運行情況滩租。

[root@web1 overlay2]#  docker inspect mynginx[    {
    "Id": "6fc2d091cfe9b0484da3e70db842446bbdfeb7f5e5409c2e40ae21b99498d010",        "Created": "2019-08-07T08:57:48.864538933Z",        "Path": "nginx",        "Args": [            "-g",            "daemon off;"],        "State": {
        "Status": "running",            "Running": true,            "Paused": false,            "Restarting": false,            "OOMKilled": false,            "Dead": false,            "Pid": 119948,            "ExitCode": 0,            "Error": "",            "StartedAt": "2019-08-07T08:57:49.417992182Z",            "FinishedAt": "0001-01-01T00:00:00Z"
    }
    ,        "Image": "sha256:e445ab08b2be8b178655b714f89e5db9504f67defd5c7408a00bade679a50d44",        "ResolvConfPath": "/var/lib/docker/containers/6fc2d091cfe9b0484da3e70db842446bbdfeb7f5e5409c2e40ae21b99498d010/resolv.conf",        "HostnamePath": "/var/lib/docker/containers/6fc2d091cfe9b0484da3e70db842446bbdfeb7f5e5409c2e40ae21b99498d010/hostname",        "HostsPath": "/var/lib/docker/containers/6fc2d091cfe9b0484da3e70db842446bbdfeb7f5e5409c2e40ae21b99498d010/hosts",        "LogPath": "",        "Name": "/mynginx",        "RestartCount": 0,        "Driver": "overlay2",        "MountLabel": "",        "ProcessLabel": "",        "AppArmorProfile": "",        "ExecIDs": null,        "HostConfig": {
        "Binds": null,            "ContainerIDFile": "",            "LogConfig": {
            "Type": "journald",                "Config": {
            }
        }
        ,            "NetworkMode": "default",            "PortBindings": {
        }
        ,            "RestartPolicy": {
            "Name": "no",                "MaximumRetryCount": 0
        }
        ,            "AutoRemove": false,            "VolumeDriver": "",            "VolumesFrom": null,            "CapAdd": null,            "CapDrop": null,            "Dns": [],            "DnsOptions": [],            "DnsSearch": [],            "ExtraHosts": null,            "GroupAdd": null,            "IpcMode": "",            "Cgroup": "",            "Links": null,            "OomScoreAdj": 0,            "PidMode": "",            "Privileged": false,            "PublishAllPorts": false,            "ReadonlyRootfs": false,            "SecurityOpt": null,            "UTSMode": "",            "UsernsMode": "",            "ShmSize": 67108864,            "Runtime": "docker-runc",            "ConsoleSize": [                0,                0            ],            "Isolation": "",            "CpuShares": 0,            "Memory": 0,            "NanoCpus": 0,            "CgroupParent": "",            "BlkioWeight": 0,            "BlkioWeightDevice": null,            "BlkioDeviceReadBps": null,            "BlkioDeviceWriteBps": null,            "BlkioDeviceReadIOps": null,            "BlkioDeviceWriteIOps": null,            "CpuPeriod": 0,            "CpuQuota": 0,            "CpuRealtimePeriod": 0,            "CpuRealtimeRuntime": 0,            "CpusetCpus": "",            "CpusetMems": "",            "Devices": [],            "DiskQuota": 0,            "KernelMemory": 0,            "MemoryReservation": 0,            "MemorySwap": 0,            "MemorySwappiness": -1,            "OomKillDisable": false,            "PidsLimit": 0,            "Ulimits": null,            "CpuCount": 0,            "CpuPercent": 0,            "IOMaximumIOps": 0,            "IOMaximumBandwidth": 0
    }
    ,        "GraphDriver": {
        "Name": "overlay2",            "Data": {
            "LowerDir": "/var/lib/docker/overlay2/937140af0aee6c43f04c2d7b72e6b5451a44fef921417e8236d9fe01e9286c7a-init/diff:/var/lib/docker/overlay2/d8e95505fc3894eb30b48e4b0f48ab5e89d99c09a07c79c0b057c611621e31eb/diff:/var/lib/docker/overlay2/b2a6a25974bf17398b698a27208711574be3c69a2cd06658bbe838359f373a27/diff:/var/lib/docker/overlay2/d4610bc89b3ba8ad6ab30ea895fc3a06efff15db493d86ac9bc100e04abbab67/diff",                "MergedDir": "/var/lib/docker/overlay2/937140af0aee6c43f04c2d7b72e6b5451a44fef921417e8236d9fe01e9286c7a/merged",                "UpperDir": "/var/lib/docker/overlay2/937140af0aee6c43f04c2d7b72e6b5451a44fef921417e8236d9fe01e9286c7a/diff",                "WorkDir": "/var/lib/docker/overlay2/937140af0aee6c43f04c2d7b72e6b5451a44fef921417e8236d9fe01e9286c7a/work"
        }
    }
    ,        "Mounts": [],        "Config": {
        "Hostname": "6fc2d091cfe9",            "Domainname": "",            "User": "",            "AttachStdin": false,            "AttachStdout": false,            "AttachStderr": false,            "ExposedPorts": {
            "80/tcp": {
            }
        }
        ,            "Tty": true,            "OpenStdin": true,            "StdinOnce": false,            "Env": [                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",                "NGINX_VERSION=1.17.2",                "NJS_VERSION=0.3.3",                "PKG_RELEASE=1~buster"            ],            "Cmd": [                "nginx",                "-g",                "daemon off;"            ],            "ArgsEscaped": true,            "Image": "nginx",            "Volumes": null,            "WorkingDir": "",            "Entrypoint": null,            "OnBuild": null,            "Labels": {
            "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
        }
        ,            "StopSignal": "SIGTERM"
    }
    ,        "NetworkSettings": {
        "Bridge": "",            "SandboxID": "3ece36008fbc5f3f46d3d251cf803c1478cc14032d74a36747e4ed8a115b81df",            "HairpinMode": false,            "LinkLocalIPv6Address": "",            "LinkLocalIPv6PrefixLen": 0,            "Ports": {
            "80/tcp": null
        }
        ,            "SandboxKey": "/var/run/docker/netns/3ece36008fbc",            "SecondaryIPAddresses": null,            "SecondaryIPv6Addresses": null,            "EndpointID": "898de81d97d54d2b60aeb6cc77ef1b4f9b481d1b72f542faa496494594024eac",            "Gateway": "172.17.0.1",            "GlobalIPv6Address": "",            "GlobalIPv6PrefixLen": 0,            "IPAddress": "172.17.0.3",        #看到ip地址            "IPPrefixLen": 16,            "IPv6Gateway": "",            "MacAddress": "02:42:ac:11:00:03",            "Networks": {
            "bridge": {
                "IPAMConfig": null,                    "Links": null,                    "Aliases": null,                    "NetworkID": "2edae9131e77500a56d251b94ab2cdf0bc86f8df9f2453fa46bf4bab2f7be99f",                    "EndpointID": "898de81d97d54d2b60aeb6cc77ef1b4f9b481d1b72f542faa496494594024eac",                    "Gateway": "172.17.0.1",                    "IPAddress": "172.17.0.3",                    "IPPrefixLen": 16,                    "IPv6Gateway": "",                    "GlobalIPv6Address": "",                    "GlobalIPv6PrefixLen": 0,                    "MacAddress": "02:42:ac:11:00:03"
            }
        }
    }
}
][root@web1 overlay2]# curl 172.17.0.1      #訪問一下<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">    <head>        <title>Test Page for the Nginx HTTP Server on Fedora</title>        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />        <style type="text/css">            
/*<![CDATA[*/
body {                background-color: #fff;
color: #000;
font-size: 0.9em;
font-family: sans-serif,helvetica;
margin: 0;
padding: 0;
}
:link {
color: #c00;
}
:visited {
color: #c00;
}
a:hover {
color: #f50;
}
h1 {
text-align: center;
margin: 0;
padding: 0.6em 2em 0.4em;
background-color: #294172;
color: #fff;
font-weight: normal;
font-size: 1.75em;
border-bottom: 2px solid #000;
}
h1 strong {
font-weight: bold;
font-size: 1.5em;
}
h2 {
text-align: center;
background-color: #3C6EB4;
font-size: 1.1em;
font-weight: bold;
color: #fff;
margin: 0;
padding: 0.5em;
border-bottom: 2px solid #294172;
}
hr {
display: none;
}
.content {
padding: 1em 5em;
}
.alert {
border: 2px solid #000;
}
img {
border: 2px solid #fff;
padding: 2px;
margin: 2px;
}
a:hover img {
border: 2px solid #294172;
}
.logos {
margin: 1em;
text-align: center;
}
/*]]>*/
</style>    </head>    <body>        <h1>Welcome to <strong>nginx</strong> on Fedora!</h1>        <div class="content">            <p>This page is used to test the proper operation of the            <strong>nginx</strong> HTTP server after it has been            installed. If you can read this page, it means that the            web server installed at this site is working            properly.</p>            <div class="alert">                <h2>Website Administrator</h2>                <div class="content">                    <p>This is the default <tt>index.html</tt> page that                    is distributed with <strong>nginx</strong> on                    Fedora.  It is located in                    <tt>/usr/share/nginx/html</tt>.</p>                    <p>You should now put your content in a location of                    your choice and edit the <tt>root</tt> configuration                    directive in the <strong>nginx</strong>                    configuration file                    <tt>/etc/nginx/nginx.conf</tt>.</p>                </div>            </div>            <div class="logos">                <a ><img                    src="nginx-logo.png"                    alt="[ Powered by nginx ]"                    width="121" height="32" /></a>                <a ><img                    src="poweredby.png"                    alt="[ Powered by Fedora ]"                    width="88" height="31" /></a>            </div>        </div>    </body></html>[root@web1 overlay2]#
14赋秀、查看日志

-f 掛起這個終端,動態(tài)查看日志

[root@web1 ~]# docker logs  -f mynginx

最后也分享一下我自己的一套Java學習資料庫律想,大伙看看有沒有需要的:

  • Java核心知識點:
  • Java千道面試寶典:

內(nèi)容涵蓋:Java猎莲、MyBatis、ZooKeeper技即、Dubbo著洼、Elasticsearch、Memcached而叼、Redis身笤、MySQL、Spring葵陵、Spring Boot液荸、Spring Cloud、RabbitMQ脱篙、Kafka娇钱、Linux 等技術(shù)棧

  • 架構(gòu)學習資料:
  • 學習視頻:

以上這些學習資料都能夠免費分享給小伙伴們,希望能一起努力绊困,共同進步文搂!有需要的,直接戳 免費領取秤朗!

以上這些學習資料都能夠免費分享給小伙伴們煤蹭,希望能一起努力,共同進步川梅!有需要的疯兼,直接戳 免費領取!贫途!

以上這些學習資料都能夠免費分享給小伙伴們吧彪,希望能一起努力,共同進步丢早!有需要的姨裸,直接戳 免費領取Q砬恪!傀缩!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末那先,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子赡艰,更是在濱河造成了極大的恐慌售淡,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件慷垮,死亡現(xiàn)場離奇詭異揖闸,居然都是意外死亡,警方通過查閱死者的電腦和手機料身,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門汤纸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人芹血,你說我怎么就攤上這事贮泞。” “怎么了幔烛?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵啃擦,是天一觀的道長。 經(jīng)常有香客問我说贝,道長议惰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任乡恕,我火速辦了婚禮言询,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘傲宜。我一直安慰自己运杭,他們只是感情好,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布函卒。 她就那樣靜靜地躺著辆憔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪报嵌。 梳的紋絲不亂的頭發(fā)上虱咧,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機與錄音锚国,去河邊找鬼腕巡。 笑死,一個胖子當著我的面吹牛血筑,可吹牛的內(nèi)容都是我干的绘沉。 我是一名探鬼主播煎楣,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼车伞!你這毒婦竟也來了择懂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤另玖,失蹤者是張志新(化名)和其女友劉穎困曙,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體日矫,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡赂弓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了哪轿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡翔怎,死狀恐怖窃诉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赤套,我是刑警寧澤飘痛,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站容握,受9級特大地震影響宣脉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜剔氏,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一塑猖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谈跛,春花似錦羊苟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至阻桅,卻和暖如春凉倚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嫂沉。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工稽寒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人输瓜。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓瓦胎,卻偏偏與公主長得像芬萍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子搔啊,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348