《Docker---從小白到深度理解(一)初始Docker》

docker_1.png

Docker--簡介

關于Docker我們來看一下百度百科給出的介紹:

Docker 是一個開源的應用容器引擎饵蒂,讓開發(fā)者可以打包他們的應用以及依賴包到一個可移植的容器中,然后發(fā)布到任何流行的 Linux 機器上祠乃,也可以實現虛擬化磅轻。容器是完全使用沙箱機制寂祥,相互之間不會有任何接口。

上面提到Dockers是個容器能實現虛擬化藕夫,那么我們看一下Docker與虛擬機的區(qū)別

[圖片上傳失敗...(image-e9d569-1543800377211)]

我們能看出docker容器要比傳統的虛擬機要輕,傳統的虛擬機需要創(chuàng)建一個guest系統環(huán)境枯冈,docker不需要他可以依賴本地的系統環(huán)境毅贮,很輕。Docker的容器本身不需要額外創(chuàng)建虛擬機管理系統霜幼,因此你可以啟動多套Docker容器嫩码,這樣就可以充分發(fā)揮主機服務器的物理資源,也可以降低因為采購服務器licenses而帶來的額外成本罪既。

Docker核心--鏡像和容器

首先我們來看一下官方給出的解釋:

A container is launched by running an image. An image is an executable package that includes everything needed to run an application--the code, a runtime, libraries, environment variables, and configuration files.

A container is a runtime instance of an image--what the image becomes in memory when executed (that is, an image with state, or a user process). You can see a list of your running containers with the command, docker ps, just as you would in Linux.

鏡像包含了一系列可運行的代碼铸题、架包、環(huán)境變量琢感、配置文件等等的可執(zhí)行的包丢间,而容器的創(chuàng)建需要一個可運行的鏡像,容器就是一個運行時鏡像的實例驹针。

我們再來看下這張圖:

[圖片上傳失敗...(image-777eb2-1543800081343)]

一般認為烘挫,沒有繼承自其他鏡像的鏡像為Base Image,也就是rootfs,圖片中的bootfs和rootfs兩個概念,來源于Linux柬甥,鑒于筆者對Linux只停留在應用的情況下饮六,對于bootfs與rootfs就不做更深入的解釋,下面我們來講一下docker運行的基本原理苛蒲。

  1. Docker鏡像是由文件系統疊加而成献酗。最低端是一個引導文件系統蚕脏,即bootfs。當一個容器啟動后,它將會被移到內存中讯蒲,而引導文件系統則會被卸載侈玄,以留出更多的內存供initrd磁盤鏡像使用非凌。
  1. Docker鏡像的第二層是root文件系統rootfs秸应,它位于引導文件系統之上。rootfs可以是一種或多種操作系統蔫浆。
  1. 在Docker里殖属,root文件系統永遠只能是只讀狀態(tài),并且Docker利用聯合加載技術又會在root文件系統層上加載更多的只讀文件系統克懊。聯合加載指的是一次同時加載多個文件系統忱辅,但是在外面看起來只能看到一個文件系統七蜘。聯合加載會將各層文件系統疊加到一起,這樣最終的文件系統會包含所有底層的文件和目錄墙懂。
  1. 當從一個鏡像啟動容器時橡卤,Docker會在該鏡像的最頂層加載一個讀寫文件系統。 當Docker第一次啟動一個容器時损搬,初始的讀寫層是空的碧库。當文件系統發(fā)生變化時,這些變化都會應用到這一層上巧勤。如果修改一個文件嵌灰,這個文件首先會從該讀寫層下面的只讀層復制到該讀寫層。該文件的只讀版本依然存在颅悉,但是已經被讀寫層中的該文件副本所隱藏沽瞭。
  1. 如此強大的技術之一。每個只讀鏡像層都是只讀的剩瓶,并且以后永遠不會變化驹溃。當創(chuàng)建一個新容器時,Docker會構建出一個鏡像棧延曙,并在棧的最頂端添加一個讀寫層豌鹤。這個讀寫層再加上其下面的鏡像層以及一些配置數據,就構成了一個容器

也就是說鏡像制作好了之后枝缔,是只讀的不可以更改布疙,當進行運行啟動容器是,會在最頂層加載一個讀寫文件系統愿卸,所有的數據都會保存到這個文件系統上面灵临,對底層的鏡像是零浸入的,這也就是說我們能夠將一個application制作成一個鏡像趴荸,這個鏡像是可復用的俱诸,這大大節(jié)省了運維成本,針對一些鏡像赊舶,例如mysql,centos我們直接可以下載鏡像赶诊,直接運行A健!

Docker 基本語法

查看docker 鏡像

NAME                                         DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
node                                         Node.js is a JavaScript-based platform for s…   6670                [OK]                
tomcat                                       Apache Tomcat is an open source implementati…   2191                [OK]                
java                                         Java is a concurrent, class-based, and objec…   1905                [OK]                
openjdk                                      OpenJDK is an open-source implementation of …   1395                [OK]                
ghost                                        Ghost is a free and open source blogging pla…   879                 [OK]                
anapsix/alpine-java                          Oracle Java 8 (and 7) with GLIBC 2.28 over A…   373                                     [OK]
jetty                                        Jetty provides a Web server and javax.servle…   281                 [OK]                
couchdb                                      CouchDB is a database that uses JSON for doc…   246                 [OK] ```

**拉取鏡像**

```root@tuxiaolei:/home/nvshenluoxiaobai# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
a5a6f2f73cd8: Pull complete 
1ba02017c4b2: Pull complete 
33b176c904de: Pull complete 
Digest: sha256:5d32f60db294b5deb55d078cd4feb410ad88e6fe77500c87d3970eca97f54dba
Status: Downloaded newer image for nginx:latest

查看本地鏡像列表

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
redis               latest              5958914cc558        3 days ago          94.9MB
nginx               latest              568c4670fa80        4 days ago          109MB

查看某個鏡像的詳細信息

[
 {
 "Id": "sha256:5958914cc55880091b005658a79645a90fd44ac6a33abef25d6be87658eb9599",
 "RepoTags": [
 "redis:latest"
 ],
 "RepoDigests": [
 "redis@sha256:f57d1597d038a742dfba6acfaf48b10e6383466eea2aef95d1ee76f32633f959"
 ],
 "Parent": "",
 "Comment": "",
 "Created": "2018-11-28T23:30:01.179460123Z",
 "Container": "dfc3616dd94b0f16f74ad3c738baa37168d6f782685c763391dc1fe5e4fa1569",
 "ContainerConfig": {
 "Hostname": "dfc3616dd94b",
 "Domainname": "",
 "User": "",
 "AttachStdin": false,
 "AttachStdout": false,
 "AttachStderr": false,
 "ExposedPorts": {
 "6379/tcp": {}
 },
 "Tty": false,
 "OpenStdin": false,
 "StdinOnce": false,
 "Env": [
 "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
 "GOSU_VERSION=1.10",
 "REDIS_VERSION=5.0.2",
 "REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-5.0.2.tar.gz",
 "REDIS_DOWNLOAD_SHA=937dde6164001c083e87316aa20dad2f8542af089dfcb1cbb64f9c8300cd00ed"
 ],
 "Cmd": [
 "/bin/sh",
 "-c",
 "#(nop) ",
 "CMD [\"redis-server\"]"
 ],
 "ArgsEscaped": true,
 "Image": "sha256:0d301a3ab4ce5b07faab5375b0a2d09247e337c75a39a0edb6cae3034641ef47",
 "Volumes": {
 "/data": {}
 },
 "WorkingDir": "/data",
 "Entrypoint": [
 "docker-entrypoint.sh"
 ],
 "OnBuild": [],
 "Labels": {}
 },
 "DockerVersion": "17.06.2-ce",
 "Author": "",
 "Config": {
 "Hostname": "",
 "Domainname": "",
 "User": "",
 "AttachStdin": false,
 "AttachStdout": false,
 "AttachStderr": false,
 "ExposedPorts": {
 "6379/tcp": {}
 },
 "Tty": false,
 "OpenStdin": false,
 "StdinOnce": false,
 "Env": [
 "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
 "GOSU_VERSION=1.10",
 "REDIS_VERSION=5.0.2",
 "REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-5.0.2.tar.gz",
 "REDIS_DOWNLOAD_SHA=937dde6164001c083e87316aa20dad2f8542af089dfcb1cbb64f9c8300cd00ed"
 ],
 "Cmd": [
 "redis-server"
 ],
 "ArgsEscaped": true,
 "Image": "sha256:0d301a3ab4ce5b07faab5375b0a2d09247e337c75a39a0edb6cae3034641ef47",
 "Volumes": {
 "/data": {}
 },
 "WorkingDir": "/data",
 "Entrypoint": [
 "docker-entrypoint.sh"
 ],
 "OnBuild": [],
 "Labels": null
 },
 "Architecture": "amd64",
 "Os": "linux",
 "Size": 94925974,
 "VirtualSize": 94925974,
 "GraphDriver": {
 "Data": {
 "LowerDir": "/var/lib/docker/overlay2/32d07536d351114ebefc53daff1094e9ca6c37d282b04136eb6e1b9a6affdaab/diff:/var/lib/docker/overlay2/d338e933b9e1877932f2ce4e7ff25bbaf8c30a6fb7ab8ade9497f3bd633daafc/diff:/var/lib/docker/overlay2/bf74e4d9e35815d13204572b9592890ad4b86c853d814dff97930253d6695706/diff:/var/lib/docker/overlay2/c32e23b8e5b5d222f9467a10f41fd33ac41916b1c042304012f85b50f9eef9a7/diff:/var/lib/docker/overlay2/54c65094137a50d0c34363abbb4c29a2dd771f12e70761fae95da3fb5f7daef6/diff",
 "MergedDir": "/var/lib/docker/overlay2/9a0ab9655a90ac0b9bb09bae4e2ff1f725e1d30fccfc9bb0dc2ad66d5c4164f1/merged",
 "UpperDir": "/var/lib/docker/overlay2/9a0ab9655a90ac0b9bb09bae4e2ff1f725e1d30fccfc9bb0dc2ad66d5c4164f1/diff",
 "WorkDir": "/var/lib/docker/overlay2/9a0ab9655a90ac0b9bb09bae4e2ff1f725e1d30fccfc9bb0dc2ad66d5c4164f1/work"
 },
 "Name": "overlay2"
 },
 "RootFS": {
 "Type": "layers",
 "Layers": [
 "sha256:ef68f6734aa485edf13a8509fe60e4272428deaf63f446a441b79d47fc5d17d3",
 "sha256:2c1e04fae1f2111671c8ab19fee9d5d69ee29709487cac889385ff4bdb5f081f",
 "sha256:94bdf74df564a4f3c84f5854c4496f80915a375662f220c74b649878e781a13e",
 "sha256:90d2c5d0209d338573643ca0517731154dcc9c49e50ec9d0857eaddee2d871da",
 "sha256:dc682cc939702aa54f3aa457b12f9c572dbc0271f3f6e9023a45657cb075cd8e",
 "sha256:bb84a87b243fddbd353bedec71dc3fcb4d0b61ff2f8cc8d64730ede22dad09c9"
 ]
 },
 "Metadata": {
 "LastTagTime": "0001-01-01T00:00:00Z"
 }
 }
]

啟動鏡像

基本命令 docker run + 名字(或者imageID或者containerID)

root@tuxiaolei:~$ ps -ef | grep nginx
root     26523 24712  0 17:03 pts/0    00:00:00 docker run nginx
root     26583 26561  0 17:03 ?        00:00:00 nginx: master process nginx -g daemon off;
systemd+ 26650 26583  0 17:03 ?        00:00:00 nginx: worker process
nvshenl+ 26889 26872  0 17:04 pts/1    00:00:00 grep --color=auto nginx

基本命令就講到這里舔痪,其余常用命令在后面的實戰(zhàn)中給出寓调,這里附上docker官方文檔地址

Dockerfile

Dockerfile定義容器內環(huán)境中發(fā)生的事情。對網絡接口和磁盤驅動器等資源的訪問在此環(huán)境中進行虛擬化锄码,該環(huán)境與系統的其他部分隔離夺英,因此您需要將端口映射到外部世界晌涕,并具體說明要“復制”到哪些文件那個環(huán)境.

?
MAINTAINER love@gmail.com
?
RUN mkdir -p /smart/bin/com.xx.more/smart-gateway
?
WORKDIR /smart/bin/com.xx.more/smart-gateway
?
EXPOSE 9999
?
ADD ./smart-gateway/target/smart-gateway.jar ./
?
CMD java -Djava.security.egd=file:/dev/./urandom -jar smart-gateway.

我們來解讀一下

From---> 表明當前鏡像所基于的鏡像,我們是個javaweb 項目痛悯,項目依賴于java鏡像

MAINTAINER---->維護者信息

RUN---> 運行是命令

WORKDIR--->工作目錄

EXPOSE---> 暴露端口余黎,方便鏡像 運行時做映射

ADD---> 將本地目錄文件加入鏡像

CMD--->指定啟動容器時執(zhí)行的命令,每個 Dockerfile 只能有一條 CMD 命令载萌。如果指定了多條命令惧财,只有最后一條會被執(zhí)行。如果用戶啟動容器時候指定了運行的命令扭仁,則會覆蓋掉 CMD 指定的命令垮衷。

VOLUME---> 創(chuàng)建一個可以從本地主機或其他容器掛載的掛載點,一般用來存放數據庫和需要保持的數據等

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末乖坠,一起剝皮案震驚了整個濱河市搀突,隨后出現的幾起案子,更是在濱河造成了極大的恐慌熊泵,老刑警劉巖仰迁,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異戈次,居然都是意外死亡轩勘,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門怯邪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绊寻,“玉大人,你說我怎么就攤上這事悬秉〕尾剑” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵和泌,是天一觀的道長村缸。 經常有香客問我,道長武氓,這世上最難降的妖魔是什么梯皿? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮县恕,結果婚禮上东羹,老公的妹妹穿的比我還像新娘。我一直安慰自己忠烛,他們只是感情好属提,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般冤议。 火紅的嫁衣襯著肌膚如雪斟薇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天恕酸,我揣著相機與錄音堪滨,去河邊找鬼。 笑死尸疆,一個胖子當著我的面吹牛椿猎,可吹牛的內容都是我干的。 我是一名探鬼主播寿弱,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼犯眠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了症革?” 一聲冷哼從身側響起筐咧,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎噪矛,沒想到半個月后量蕊,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡艇挨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年残炮,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缩滨。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡势就,死狀恐怖,靈堂內的尸體忽然破棺而出脉漏,到底是詐尸還是另有隱情苞冯,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布侧巨,位于F島的核電站舅锄,受9級特大地震影響,放射性物質發(fā)生泄漏司忱。R本人自食惡果不足惜皇忿,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坦仍。 院中可真熱鬧禁添,春花似錦、人聲如沸桨踪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锻离。三九已至铺峭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間汽纠,已是汗流浹背卫键。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留虱朵,地道東北人莉炉。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像碴犬,于是被迫代替她去往敵國和親絮宁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內容

  • docker常用命令原理圖概覽: 按照docker官網上的說法服协,docker的文件系統分為兩層:bootfs和ro...
    燕京博士閱讀 2,953評論 2 32
  • 《Docker從入門到實踐》閱讀筆記 原書地址: https://yeasy.gitbooks.io/docker...
    GuoYuebo閱讀 11,359評論 1 39
  • docker基本概念 1. Image Definition 鏡像 Image 就是一堆只讀層 read-only...
    慢清塵閱讀 8,728評論 1 21
  • 才第一次去健身房绍昂,享受那種揮汗如雨的過程,便已經愛上了它偿荷。雖然很累窘游,但是,一次又一次突破自己的感覺很爽跳纳。而且忍饰,有人...
    一抹清澄的憂傷閱讀 154評論 0 0
  • 所謂的我的大學之初的異性交往(上篇) 記得剛玩簡書的時候是高二。因為復讀過一年寺庄,到現在加起來也有三年了艾蓝。謹把此文送...
    君子02閱讀 1,378評論 2 1