【Docker】容器基本操作

docker的容器是基於lxc,關於lxc介紹:
https://www.ibm.com/developerworks/cn/linux/l-lxc-containers/

啓動容器

  1. 基於鏡像新建並啓動一個容器
    啓動一個bash 終端與用戶交互

sudo docker run -t -i ubuntu:14.04 /bin/bash

其中-t 選項讓Docker分配一個僞終端(pseudo-tty)並綁定到容器的標準輸入上, -i 則讓容器的標準輸入保持打開。

當利用 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 對資源的利用率極高,是貨真價實的輕量級虛擬化。

後臺運行

想讓容器不在當前宿主機上,而在後臺執行。可以使用 -d 參數 ,使用-d參數後打印出的內容可以去log中查看 (docker logs) 。容器是否停止運行與-d無關,與你執行的命令有關。
使用 -d 參數啓動後會返回一個唯一的 id,也可以通過 docker ps 命令來查看容器信息。

終止容器

docker stop

另外:
用ctrl+d 或者 exit命令來退出終端的時候,所建的容器也會終止。
終止狀態的容器可以用 docker ps -a 命令看到。
處於終止狀態的容器,可以通過 docker start 命令來重新啓動。
此外,docker restart 命令會將一個運行態的容器終止,然後再重新啓動它。

進入容器

當容器進入後臺執行的時候,我們想再次進入容器的時候可以用docker attach 命令或 nsenter 工具來再次進入。

$sudo docker attach [names]

但是使用 attach 命令有時候並不方便。當多個窗口同時 attach 到同一個容器的時候,所有窗口都會同步顯示。當某個窗口因命令阻塞時,其他窗口也無法執行操作了。

nsenter 命令

下載
nsenter 工具在 util-linux 包2.23版本後包含。 如果系統中 util-linux 包沒有該命令,可以按照下面的方法從源碼安裝。

$ cd /tmp; curl https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz | tar -zxf-; cd util-linux-2.24;
$ ./configure –without-ncurses
$ make nsenter && sudo cp nsenter /usr/local/bin

使用
首先要找到容器第一個進程的pid,然後通過這個pid連接到容器。
下面是一個完整的示例:

$ 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
$ PID=$(docker-pid 243c32535da7)
10981
$ sudo nsenter –target 10981 –mount –uts –ipc –net –pid
root@243c32535da7:/#

更簡單的,建議下載 .bashrc_docker,並將內容放到 .bashrc 中。

$ wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker;
$ echo “[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker” >> ~/.bashrc; source ~/.bashrc

這個文件中定義了很多方便使用 Docker 的命令,例如 docker-pid 可以獲取某個容器的 PID;而 docker-enter 可以進入容器或直接在容器內執行命令。

$ echo $(docker-pid < container>)
$ docker-enter < container> ls

導出容器

docker export

$ 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 來刪除一個已經終止的容器。注意是要終止的。如果是運行中的 可以加 -f 。Docker 會發送 SIGKILL 信號給容器。

清除所有已經終止的容器

用 docker ps -a 命令可以查看所有已經創建的包括終止狀態的容器,如果數量太多要一個個刪除可能會很麻煩,用 docker rm $(docker ps -a -q) 可以全部清理掉。
*注意:這個命令其實會試圖刪除所有的包括還在運行中的容器,不過 docker rm 默認並不會刪除運行中的容器。

容器的基本操作就是這些。
參考資料:
https://yeasy.gitbooks.io/docker_practice/content/container/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章