Docker 容器詳解
容器是 Docker 又一核心概念,簡單的說,容器是獨立運行的一個或一組應用,以及它們的運行態環境。對應的,虛擬機可以理解為模擬運行的一整套操作系統(提供了運行態環境和其他系統環境)和跑在上面的應用。
本章將具體介紹如何來管理一個容器,包括創建、啟動和停止等。
啟動容器有兩種方式,一種是基於鏡像新建一個容器並啟動,另外一個是將在終止狀態(stopped)的容器重新啟動。
新建並啟動
所需要的命令主要為docker run
下面的命令則啟動一個 bash 終端,允許用戶進行交互。
-t 選項讓 Docker 分配一個偽終端(pseudo-tty)並綁定到容器的標準輸入上, -i則讓容器的標準輸入保持打開(即交互式),可以使用—name給容器起個形象的名稱。
在交互模式下,用戶可以通過所創建的終端來輸入命令,例如
容器的核心為所執行的應用程序,所需要的資源都是應用程序運行所必需的。除此之外,並沒有其它的資源。可以在偽終端中利用
可見,容器中僅運行了指定的 bash 應用。這種特點使得 Docker 對資源的利用率極高,是貨真價實的輕量級虛擬化。
如果這個時候我們正常退出,logout 或者 exit 或者Ctrl+d或者Ctrl+c,dockerps–a
下面的命令輸出一個“Hello World”,之後終止容器。
這跟在本地直接執行 /bin/echo ‘hello world‘ 幾乎感覺不出任何區別。
當利用docker run 來創建容器時,Docker 在後臺運行的標準操作包括:
1.檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
2.利用鏡像創建並啟動一個容器
3.分配一個文件系統,並在只讀的鏡像層外面掛載一層可讀寫層
4.從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中去
5.從地址池配置一個ip地址給容器
6.執行用戶指定的應用程序
7.執行完畢後容器被終止
查看容器dockerps
查看幫助
可以利用docker start 命令,直接將一個已經終止的容器啟動運行。
# docker start [contraiID]
容器處於 Exited 狀態,可以直接啟動
終止容器
# docker stop [容器 ID] # docker kill [容器 ID]
可以使用docker stop 來終止一個運行中的容器。此外,當Docker容器中指定的應用終結時,容器也自動終止。例如對於前面所講中啟動了一個終端的容器,用戶通過 exit 命令或Ctrl+d來退出終端時,所創建的容器立刻終止
終止狀態的容器可以用dockerps -a 命令看到。例如
狀態由 Up -> Exit
處於終止狀態的容器,可以通過docker start 命令來重新啟動。
重啟容器
docker restart 命令會將一個運行態的容器終止,然後再重新啟動它。
# docker restart [容器 ID]
守護態運行
更多的時候,需要讓 Docker 容器在後臺以守護態(Daemonized)形式運行。此時,可以通過添加 -d 參數來實現。例如下面的命令會在後臺運行容器。
或
容器啟動後會返回一個唯一的 id,也可以通過dockerps命令來查看容器信息。
1.docker run -d 運行提個新的容器,我們通過-d 命令讓他作為一個後臺運行
2.centos:centos6 是一個我們想要在內部運行命令的鏡像
3./bin/sh -c 是我們想要在容器內部運行的命令
4.while true; do echo hello weibo; sleep 1; done 這是一個簡單的腳本,我們僅僅只是每秒打印一次 hello word 一直到我們結束它
用docker inspect查看容器的信息
命令格式:docker inspect 容器ID或容器名
用docker inspect查看容器的ip地址
用docker inspect查看容器執行的程序
進入容器
在使用 -d 參數時,容器啟動後會進入後臺。某些時候需要進入容器進行操作,有很多種方法,包括使用docker attach 命令或nsenter命令。
使用docker attach進入容器
docker attach 是Docker自帶的命令。下面示例如何使用該命令。
1.docker attach 允許我們進入後臺進程.
2.--sig-proxy=false 不使用容器轉發信號,允許我們使用 ctrl -c 來退出,執行dockerps查看在後臺運行
但是使用 attach 命令有時候並不方便。當多個窗口同時 attach 到同一個容器的時候,所有窗口都會同步顯示。當某個窗口因命令阻塞時,其他窗口也無法執行操作了。
也可以執行docker exec進入運行的容器
docker exec -it 容器ID/名稱 /bin/bash
以上命令返回一個命令界面,exec代表直接在容器中運行命令
使用nsenter進入容器
安裝
nsenter工具在util-linux包2.23版本後包含。如果系統中util-linux包沒有該命令,可以按照下面的方法從源碼安裝
#wgethttps://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz #tar util-linux-2.24.tar.gz #cd util-linux-2.24 # ./configure --without-ncurses&& make nsenter #cpnsenter /usr/local/bin
nsenter可以訪問另一個進程的名字空間。nsenter要正常工作需要有 root 權限
慶幸的是centos7使用的是util-linux-2.23,所以就直接使用系統提供的util-linux包了。
為了連接到容器,你還需要找到容器的第一個進程的PID,可以通過下面的命令獲取。
PID=$(docker inspect --format "{{ .State.Pid }}" <container>)
通過這個PID,就可以連接到這個容器:
nsenter --target $PID --mount --uts --ipc --net --pid
下面給出一個完整的例子。
附:更簡單的,建議大家下載 .bashrc_docker,並將內容放到 .bashrc中。
#wget ~ 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 [容器 id] > [導出文件]
如果要導出本地某個容器,可以使用docker export 命令。
這樣將導出容器快照到本地文件
導入容器
可以使用docker import 從容器快照文件中再導入為鏡像
#cat centos6.tar | docker import – centos6:test #docker images
此外,也可以通過指定 URL 或者某個目錄來導入,例如
#docker import http://example.com/exampleimage.tgzexample/imagerepo
*註:用戶既可以使用docker load 來導入鏡像存儲文件到本地鏡像庫,也可以使用docker import 來導入一個容器快照到本地鏡像庫。這兩者的區別在於容器快照文件將丟棄所有的歷史記錄和元數據信息(即僅保存容器當時的快照狀態),而鏡像存儲文件將保存完整記錄,體積也要大。此外,從容器快照文件導入時可以重新指定標簽等元數據信息。
刪除容器
可以使用dockerrm來刪除一個處於終止狀態的容器。
如果要刪除一個運行中的容器,可以添加 -f 參數。Docker 會發送SIGKILL信號給容器。
# dockerrm [容器 id/容器 name]
批量刪除多個容器
#dockerrm $(dockerps–a –q)
本文出自 “duyuheng” 博客,謝絕轉載!
Docker 容器詳解