2021-05-12 14:32:11
Ubuntu 16.04上Docker使用手記
一、Docker Hub的使用
Docker Hub是Docker官方維護的倉庫,裡面已經包含了很多的映象,一般我們的需求直接在官方倉庫搜尋就可以得到解決。在官方的公共倉庫中我們無需登入就可以進行映象的搜尋和下載。
docker search命令進行搜尋
docker pull命令進行下載
搜尋映象命令詳細用法: docker search [OPTIONS] TERM
root@peter-ThinkPad-Edge:~# sudo docker pull Ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
af49a5ceb2a5: Pull complete
8f9757b472e7: Pull complete
e931b117db38: Pull complete
47b5e16c0811: Pull complete
9332eaf1a55b: Pull complete
Digest: sha256:3b64c309deae7ab0f7dbdd42b6b326261ccd6261da5d88396439353162703fb5
Status: Downloaded newer image for ubuntu:latest
完成後,即可隨時使用該映象了,例如建立一個容器,讓其中執行 bash 應用。
$ sudo docker run -t -i ubuntu /bin/bash
root@fe7fc4bd8fc9:/#
docker images 列出映象
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu latest 99ec81b80c55 4 weeks ago 266 MB
在列出資訊中,可以看到幾個欄位資訊
- 來自於哪個倉庫,比如 ubuntu
- 映象的標記,比如 14.04
- 它的
ID
號(唯一) - 建立時間
- 映象大小
其中映象的 ID
唯一標識了映象,注意到 ubuntu:14.04
和 ubuntu:trusty
具有相同的映象 ID
,說明它們實際上是同一映象。
TAG
資訊用來標記來自同一個倉庫的不同映象。例如 ubuntu
倉庫中有多個映象,通過 TAG
資訊來區分發行版本,例如 10.04
、12.04
、12.10
、13.04
、14.04
等。例如下面的命令指定使用映象 ubuntu:14.04
來啟動一個容器。
$ sudo docker run -t -i ubuntu /bin/bash
如果不指定具體的標記,則預設使用 latest
標記資訊。
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 4ca3a192ff2a 2 weeks ago 128.2 MB
docker commit 命令來提交更新後的副本。
$ sudo docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2
4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c
其中,-m
來指定提交的說明資訊,跟我們使用的版本控制工具一樣;-a
可以指定更新的使用者資訊;之後是用來建立映象的容器的 ID;最後指定目標映象的倉庫名和 tag 資訊。建立成功後會返回這個映象的 ID 資訊。
使用 docker images
來檢視新建立的映象。
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu latest 99ec81b80c55 4 weeks ago 266 MB
ouruser/sinatra v2 3c59e02ddd1a 10 hours ago 446.7 MB
之後,可以使用新的映象來啟動容器
$ sudo docker run -t -i ouruser/sinatra:v2 /bin/bash
root@78e82f680994:/#
docker save 和docker load 匯入匯出映象
如果要匯出映象到本地檔案,可以使用 docker save
命令。
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu latest c4ff7513909d 5 weeks ago 225.4 MB
...
$sudo docker save -o ubuntu.tar ubuntu
可以使用 docker load
從匯出的本地檔案中再匯入到本地映象庫,例如
$ sudo docker load --input ubuntu.tar
或
$ sudo docker load < ubuntu.tar
這將匯入映象以及其相關的後設資料資訊(包括標籤等)。
docker rmi 移除映象
$ sudo docker rmi ouruser/sinatra:v2
Untagged: ouruser/sinatra:v2
Deleted: 5bc342fa0b91cabf65246837015197eecfa24b2213ed6a51a8974ae250fedd8d
Deleted: ed0fffdcdae5eb2c3a55549857a8be7fc8bc4241fb19ad714364cbfd7a56b22f
Deleted: 5c58979d73ae448df5af1d8142436d81116187a7633082650549c52c3a2418f0
*注意:在刪除映象之前要先用 docker rm
刪掉依賴於這個映象的所有容器。
5.Docker命令之容器(container)篇
docker run 啟動容器
啟動容器有兩種方式,一種是基於映象新建一個容器並啟動,另外一個是將在終止狀態(stopped)的容器重新啟動。
因為 Docker 的容器實在太輕量級了,很多時候使用者都是隨時刪除和新建立容器。
新建並啟動
所需要的命令主要為 docker run
。
例如,下面的命令輸出一個 “Hello World”,之後終止容器。
$ sudo docker run ubuntu /bin/echo 'Hello world'
Hello world
這跟在本地直接執行 /bin/echo 'hello world'
幾乎感覺不出任何區別。
下面的命令則啟動一個 bash 終端,允許使用者進行互動。
$ sudo docker run -t -i ubuntu /bin/bash
root@af8bae53bdd3:/#
其中,-t
選項讓Docker分配一個偽終端(pseudo-tty)並繫結到容器的標準輸入上, -i
則讓容器的標準輸入保持開啟。
在互動模式下,使用者可以通過所建立的終端來輸入命令,例如
root@af8bae53bdd3:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
更多的時候,需要讓 Docker 容器在後台以守護態(Daemonized)形式執行。此時,可以通過新增 -d
引數來實現。
例如下面的命令會在後台執行容器。
$ sudo docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147
容器啟動後會返回一個唯一的 id,也可以通過 docker ps
命令來檢視容器資訊。
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1e5535038e28 ubuntu /bin/sh -c 'while tr 2 minutes ago Up 1 minute insane_babbage
要獲取容器的輸出資訊,可以通過 docker logs
命令。
$ sudo docker logs insane_babbage
hello world
hello world
hello world
. . .
當利用 docker run
來建立容器時,Docker 在後台執行的標準操作包括:
- 檢查本地是否存在指定的映象,不存在就從公有倉庫下載
- 利用映象建立並啟動一個容器
- 分配一個檔案系統,並在唯讀的映象層外面掛載一層可讀寫層
- 從宿主主機設定的網橋介面中橋接一個虛擬介面到容器中去
- 從地址池設定一個 ip 地址給容器
- 執行使用者指定的應用程式
- 執行完畢後容器被終止
啟動已終止容器
可以利用 docker start
命令,直接將一個已經終止的容器啟動執行。
容器的核心為所執行的應用程式,所需要的資源都是應用程式執行所必需的。除此之外,並沒有其它的資源。可以在偽終端中利用 ps
或 top
來檢視進程資訊。
root@ba267838cc1b:/# ps
PID TTY TIME CMD
1 ? 00:00:00 bash
11 ? 00:00:00 ps
可見,容器中僅執行了指定的 bash 應用。這種特點使得 Docker 對資源的利用率極高,是貨真價實的輕量級虛擬化。
可以使用 docker stop
來終止一個執行中的容器。
此外,當Docker容器中指定的應用終結時,容器也自動終止。 例如對於上一章節中只啟動了一個終端的容器,使用者通過 exit
命令或 Ctrl+d
來退出終端時,所建立的容器立刻終止。
終止狀態的容器可以用 docker ps -a
命令看到。例如
sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTSNAMES
ba267838cc1b ubuntu "/bin/bash" 30 minutes ago Exited (0) About a minute ago trusting_newton
1e5535038e28 ubuntu /bin/sh -c 'while tr 2 minutes ago Up 1 minute insane_babbage
處於終止狀態的容器,可以通過 docker start
命令來重新啟動。
此外,docker restart
命令會將一個執行態的容器終止,然後再重新啟動它。
在使用 -d
引數時,容器啟動後會進入後台。 某些時候需要進入容器進行操作,有很多種方法,包括使用docker attach
命令或 nsenter
工具等。
docker attach
是Docker自帶的命令。下面範例如何使用該命令。
$ sudo docker run -idt ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds nostalgic_hypatia
$sudo docker attach nostalgic_hypatia
root@243c32535da7:/#
上文已給出範例。
docker import 和docker export 匯入、匯出容器
如果要匯出本地某個容器,可以使用 docker export
命令。
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7691a814370e ubuntu:14.04 "/bin/bash" 36 hours ago Exited (0) 21 hours ago test
$ sudo docker export 7691a814370e > ubuntu.tar
這樣將匯出容器快照到本地檔案。
可以使用 docker import
從容器快照檔案中再匯入為映象,例如
$ cat ubuntu.tar | sudo docker import - test/ubuntu:v1.0
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
test/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3 MB
此外,也可以通過指定 URL 或者某個目錄來匯入,例如
$sudo docker import http://example.com/exampleimage.tgz example/imagerepo
*註:使用者既可以使用 docker load
來匯入映象儲存檔案到本地映象庫,也可以使用 docker import
來匯入一個容器快照到本地映象庫。這兩者的區別在於容器快照檔案將丟棄所有的歷史記錄和後設資料資訊(即僅儲存容器當時的快照狀態),而映象儲存檔案將儲存完整記錄,體積也要大。此外,從容器快照檔案匯入時可以重新指定標籤等後設資料資訊。
刪除容器
$sudo docker rm trusting_newton
trusting_newton
如果要刪除一個執行中的容器,可以新增 -f
引數。Docker 會傳送 SIGKILL
信號給容器。
相關文章