歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Ubuntu 16.04上Docker使用手記

Ubuntu 16.04上Docker使用手記

日期:2017/2/28 13:45:52   编辑:Linux教程

一、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.04ubuntu: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 命令,直接將一個已經終止的容器啟動運行。

容器的核心為所執行的應用程序,所需要的資源都是應用程序運行所必需的。除此之外,並沒有其它的資源。可以在偽終端中利用 pstop 來查看進程信息。

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 信號給容器。

更多命令可在終端輸入docker --help 查看。

Copyright © Linux教程網 All Rights Reserved