2杠袱、docker的基本使用

docker命令簡單使用

1.1 鏡像

Docker 運行容器前需要本地存在對應的鏡像昵济,如果本地不存在該鏡像智绸,Docker會從鏡像倉庫下載該鏡像。如github一般访忿,docker有一個公用鏡像倉庫docker hub瞧栗。

1.1.1 鏡像的拉取

從 Docker 鏡像倉庫獲取鏡像的命令是 docker pull 。其命令格式為:

docker pull [選項] [Docker Registry 地址[:端口號]/]倉庫名[:標簽]

具體的選項可以通過 docker pull --help 命令看到海铆,這里我們說一下鏡像名稱的格式迹恐。

  • Docker鏡像倉庫地址:地址的格式一般是 <域名/IP>[:端口號] 。默認地址是 Docker Hub卧斟。
  • 倉庫名:如之前所說殴边,這里的倉庫名是兩段式名稱,即 <用戶名>/<軟件名> 珍语。對于 Docker Hub锤岸,如果不給出用戶名,則默認為 library 板乙,也就是官方鏡像是偷。

從下載過程中可以看到我們之前提及的分層存儲的概念,鏡像是由多層存儲所構成募逞。下載也是一層層的去下載蛋铆,并非單一文件。下載過程中給出了每一層的 ID 的前 12 位放接。并且下載結束后刺啦,給出該鏡像完整的 sha256 的摘要,以確保下載一致性透乾。

1.1.2 鏡像的查看

要想列出已經下載下來的鏡像洪燥,可以使用 docker image ls 命令磕秤。列表包含了倉庫名、標簽捧韵、鏡像 ID 市咆、創(chuàng)建時間以及所占用的空間 。

[root@localhost conf]# docker image ls -a
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               1.13                e548f1a579cf        3 days ago          109MB
mysql               5.7                 f0f3956a9dd8        6 days ago          409MB
memcached           1.5                 9a7e8440a999        6 days ago          58.6MB
php                 7.1-fpm             5f2501864f65        7 days ago          382MB
redis               3.2                 3859b0a6622a        8 days ago          99.7MB

1.1.3 利用commit理解鏡像構成

鏡像是容器的基礎再来,每次執(zhí)行 docker run 的時候都會指定哪個鏡像作為容器運行的基礎蒙兰。在之前的例子中,我們所使用的都是來自于 Docker Hub 的鏡像芒篷。直接使用這些鏡像是可以滿足一定的需求搜变,而當這些鏡像無法直接滿足需求時,我們就需要定制這些鏡像针炉。

鏡像是多層存儲挠他,每一層是在前一層的基礎上進行的修改;而容器同樣也是多層存儲篡帕,是在以鏡像為基礎層殖侵,在其基礎上加一層作為容器運行時的存儲
層。

假如我們定制好了變化镰烧,我們希望能將其保存下來形成鏡像拢军。要知道,當我們運行一個容器的時候( 如果不使用卷的話) 怔鳖,我們做的任何文件修改都會被記錄于容器存儲層里茉唉。而 Docker 提供了一個 docker commit 命令,可以將容器的存儲層保存下來成為鏡像结执。換句話說度陆,就是在原有鏡像的基礎上,再疊加上容器的存儲層昌犹,并構成新的鏡像坚芜。以后我們運行這個新鏡像的時候,就會擁有原有容器最后的文件變化斜姥。

docker commit 的語法格式為:

docker commit [選項] <容器ID或容器名> [<倉庫名>[:<標簽>]]

我們還可以用 docker history 具體查看鏡像內的歷史記錄。

慎用docker commit

首先沧竟,由于修改命令的執(zhí)行铸敏,還有很多文件被改動或添加了。這還僅僅是最簡單的操作悟泵,如果是安裝軟件包杈笔、編譯構建,那會有大量的無關內容被添
加進來糕非,如果不小心清理蒙具,將會導致鏡像極為臃腫球榆。

此外,使用 docker commit 意味著所有對鏡像的操作都是黑箱操作禁筏,生成的鏡像也被稱為黑箱鏡像持钉,換句話說,就是除了制作鏡像的人知道執(zhí)行過什么命令篱昔、怎么生成的鏡像每强,別人根本無從得知。而且州刽,即使是這個制作鏡像的人空执,過一段時間后也無法記清具體在操作的。雖然 docker diff 或許可以告訴得到一些線索穗椅,但是遠遠不到可以確保生成一致鏡像的地步辨绊。這種黑箱鏡像的維護工作是非常痛苦的。

而且匹表,回顧之前提及的鏡像所使用的分層存儲的概念邢羔,除當前層外,之前的每一層都是不會發(fā)生改變的桑孩,換句話說拜鹤,任何修改的結果僅僅是在當前層進行標記、添加流椒、修改敏簿,而不會改動上一層。如果使用 docker commit 制作鏡像宣虾,以及后期修改的話惯裕,每一次修改都會讓鏡像更加臃腫一次,所刪除的上一層的東西并不會丟失绣硝,會一直如影隨形的跟著這個鏡像蜻势,即使根本無法訪問到。這會讓鏡像更加臃腫鹉胖。

1.1.4 使用 Dockerfile 定制鏡像

我們可以了解到握玛,鏡像的定制實際上就是定制每一層所添加的配置、文件甫菠。如果我們可以把每一層修改挠铲、安裝、構建寂诱、操作的命令都寫入一個腳本拂苹,用這個腳本來構建、定制鏡像痰洒,那么之前提及的無法重復的問題瓢棒、鏡像構建透明性的問題浴韭、體積的問題就都會解決。這個腳本就是 Dockerfile脯宿。

Dockerfile 是一個文本文件念颈,其內包含了一條條的指令(Instruction),每一條指令構建一層嗅绰,因此每一條指令的內容舍肠,就是描述該層應當如何構建。

Dockerfile文件的命令及使用這里不做介紹窘面,下面會給出鏈接地址翠语,以上及此部分的相關內容都是從中獲取,可自行參閱财边。

1.1.5 刪除本地鏡像

如果要刪除本地的鏡像肌括,可以使用 docker image rm 命令,其格式為:

docker image rm [選項] <鏡像1> [<鏡像2> ...]

2.1 容器

2.1.1 啟動容器

Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

啟動容器有兩種方式酣难,一種是基于鏡像新建一個容器并啟動谍夭,另外一個是將在終止狀(stopped )的容器重新啟動。因為docker的容器實在太輕量級了憨募,很多時候用戶都是隨時刪除和新創(chuàng)建容器紧索。

1、新建容器并啟動

$ docker run [container ID or NAMES]

下面的命令則啟動一個 bash 終端菜谣,允許用戶進行交互珠漂。

$ docker run -t -i ubuntu:14.04 /bin/bash
root@af8bae53bdd3:/#

-t 選項讓docker分配一個偽終端( pseudo-tty) 并綁定到容器的標準輸入上,-i 則讓容器的標準輸入保持打開尾膊。

當利用 docker run 來創(chuàng)建容器時媳危,Docker 在后臺運行的標準操作包括:

  • 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
  • 利用鏡像創(chuàng)建并啟動一個容器
  • 分配一個文件系統冈敛,并在只讀的鏡像層外面掛載一層可讀寫層
  • 從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中去
  • 從地址池配置一個 ip 地址給容器
  • 執(zhí)行用戶指定的應用程序
  • 執(zhí)行完畢后容器被終止

2待笑、終止已啟動的容器

將一個終止的容器啟動。

$ docker container start [container ID or NAMES]

2.1.2 容器后臺運行

更多的時候抓谴,需要讓docker在后臺運行而不是直接把執(zhí)行命令的結果輸出到當前宿主主機下暮蹂。可通過-d參數來實現齐邦。

此時容器會在后臺運行并不會把輸出的結果(STDOUT)打印到宿主主機上面(結果可用docker logs查看)椎侠。

$ docker container logs [container ID or NAMES]

2.1.3 終止容器

可以使用 docker container stop 來終止一個運行中的容器。此外措拇,當 Docker 容器中指定的應用終結時,容器也自動終止慎宾。

$ docker container stop [container ID or NAMES]

容器列表可以用 docker container ls -a 命令看到丐吓。

$ docker container ls -a 

docker container restart 命令會將一個運行態(tài)的容器終止浅悉,然后再重新啟動它。

$ docker container restart

2.1.4 進入容器

在使用-d參數時券犁,容器啟動后會進入后臺术健。

某些時候需要進入容器進行操作,包括使用docker attach命令或docker exec命令粘衬,推薦使用docker exec命令荞估。

1、attach命令:docker attach 是 docker 自帶的命令稚新。

$ docker attach [container ID or NAMES]

如果從這個 stdin 中 exit勘伺,會導致容器的停止。

2褂删、exec命令

docker exec 后邊可以跟多個參數飞醉,這里主要說明 -i -t 參數。只用 -i 參數時屯阀,由于沒有分配偽終端缅帘,界面沒有我們熟悉的 Linux 命令提示符,但命令執(zhí)行結果仍然可以返回难衰。當 -i -t 參數一起使用時钦无,則可以看到我們熟悉的 Linux 命令提示符。

$ docker exec -it [container ID or NAMES] bash

如果從這個 stdin 中 exit盖袭,不會導致容器的停止失暂。這就是推薦使用 docker exec 的原因。

2.1.5 導入/出容器

1苍凛、導出容器

如果要導出本地某個容器趣席,可以使用 docker export 命令。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
045f12b97d48        nginx:latest        "nginx -g 'daemon ..."   3 days ago          Up 3 days           0.0.0.0:80->80/tcp   nginx

$ docker export 045f12b97d48 > nginx.tar

2醇蝴、導入容器快照

可以使用 docker import 從容器快照文件中再導入為鏡像宣肚。

$ cat nginx.tar | docker import - test/nginx:latest

此外,也可以通過指定 URL 或者某個目錄來導入悠栓。

$ docker import http://example.com/exampleimage.tgz example/imagerepo

用戶既可以使用 docker load 來導入鏡像存儲文件到本地鏡像庫霉涨,也可以使用 docker import 來導入一個容器快照到本地鏡像庫。這兩者的區(qū)別在于容器快照文件將丟棄所有的歷史記錄和元數據信息( 即僅保存容器當時的快照狀態(tài))惭适,而鏡像存儲文件將保存完整記錄笙瑟,體積也要大。此外癞志,從容器快照文件導入時可以重新指定標簽等元數據信息往枷。

2.1.6 刪除容器

1、單個刪除

docker container rm [container ID or NAMES]

如果要刪除一個運行中的容器,可以添加 -f 參數错洁。Docker 會發(fā)送 SIGKILL 信號給容器秉宿。

2、刪除全部終止容器

用 docker container ls -a 命令可以查看所有已經創(chuàng)建的包括終止狀態(tài)的容器屯碴,如果數量太
多要一個個刪除可能會很麻煩描睦,用下面的命令可以清理掉所有處于終止狀態(tài)的容器。

docker container prune

以上全部參閱docker入門到實踐.pdf一書导而,感謝其作者忱叭,鏈接僅供學習交流使用。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末今艺,一起剝皮案震驚了整個濱河市韵丑,隨后出現的幾起案子,更是在濱河造成了極大的恐慌洼滚,老刑警劉巖埂息,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異遥巴,居然都是意外死亡千康,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門铲掐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拾弃,“玉大人,你說我怎么就攤上這事摆霉『来唬” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵携栋,是天一觀的道長搭盾。 經常有香客問我,道長婉支,這世上最難降的妖魔是什么鸯隅? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮向挖,結果婚禮上蝌以,老公的妹妹穿的比我還像新娘。我一直安慰自己何之,他們只是感情好跟畅,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著溶推,像睡著了一般徊件。 火紅的嫁衣襯著肌膚如雪奸攻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天庇忌,我揣著相機與錄音舞箍,去河邊找鬼舰褪。 笑死皆疹,一個胖子當著我的面吹牛,可吹牛的內容都是我干的占拍。 我是一名探鬼主播略就,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼晃酒!你這毒婦竟也來了表牢?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤贝次,失蹤者是張志新(化名)和其女友劉穎崔兴,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體蛔翅,經...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡敲茄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了山析。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片堰燎。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖笋轨,靈堂內的尸體忽然破棺而出秆剪,到底是詐尸還是另有隱情,我是刑警寧澤爵政,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布仅讽,位于F島的核電站,受9級特大地震影響钾挟,放射性物質發(fā)生泄漏洁灵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一等龙、第九天 我趴在偏房一處隱蔽的房頂上張望处渣。 院中可真熱鬧,春花似錦蛛砰、人聲如沸罐栈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽荠诬。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間柑贞,已是汗流浹背方椎。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留钧嘶,地道東北人棠众。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像有决,于是被迫代替她去往敵國和親闸拿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內容