一、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:/#
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu latest 99ec81b80c55 4 weeks ago 266 MB
在列出信息中,可以看到幾個字段信息
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
$ 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
命令。
$ 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
這將導入鏡像以及其相關的元數據信息(包括標簽等)。
$ sudo docker rmi ouruser/sinatra:v2
Untagged: ouruser/sinatra:v2
Deleted: 5bc342fa0b91cabf65246837015197eecfa24b2213ed6a51a8974ae250fedd8d
Deleted: ed0fffdcdae5eb2c3a55549857a8be7fc8bc4241fb19ad714364cbfd7a56b22f
Deleted: 5c58979d73ae448df5af1d8142436d81116187a7633082650549c52c3a2418f0
*注意:在刪除鏡像之前要先用 docker rm
刪掉依賴於這個鏡像的所有容器。
啟動容器有兩種方式,一種是基於鏡像新建一個容器並啟動,另外一個是將在終止狀態(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 在後台運行的標准操作包括:
可以利用 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
信號給容器。
更多命令可在終端輸入docker --help 查看。