首頁 > 軟體

Ubuntu 16.04上Docker使用手記

2020-06-16 17:25:36

一、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.0412.0412.1013.0414.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 來匯入一個容器快照到本地映象庫。這兩者的區別在於容器快照檔案將丟棄所有的歷史記錄和後設資料資訊(即僅儲存容器當時的快照狀態),而映象儲存檔案將儲存完整記錄,體積也要大。此外,從容器快照檔案匯入時可以重新指定標籤等後設資料資訊。

刪除容器

docker rm 來刪除一個處於終止狀態的容器。 例如
$sudo docker rm  trusting_newton
trusting_newton

如果要刪除一個執行中的容器,可以新增 -f 引數。Docker 會傳送 SIGKILL 信號給容器。


IT145.com E-mail:sddin#qq.com