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一書导而,感謝其作者忱叭,鏈接僅供學習交流使用。