1. 程式人生 > >Docker應用之容器

Docker應用之容器

容器是獨立執行的一個或一組應用,以及他們的執行態環境

1、啟動容器(基於映象新建一個容器並啟動或將終止狀態的容器重新啟動)

run後面新增--name引數可以指定容器的名稱,否則系統預設會給名稱;使用docker rename 原容器名稱 新名稱   來修改容器名稱

1)、新建一個容器並啟動

下面命令執行完命令後,容器立即終止

 docker run ubuntu:14.04 /bin/echo 'Hello World'

下面命令進入一個互動型容器

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

其中,-t 選項讓Docker分配一個偽終端(pseudo-tty)並繫結到容器的標準輸入上,-i 則讓容器的標準輸入保持開啟

在互動模式下,使用者可以通過所建立的終端來輸入命令,如

當利用docker run 來建立容器時,Docker在後臺執行的標準操作包括

  檢查本地是否存在指定映象,不存在就從公有倉庫下載

  利用映象建立並啟動一個容器

  分配一個檔案系統,並在只讀的映象層外面掛載一層可讀寫層

  從宿主主機配置的網橋介面中橋接一個虛擬介面到容器中去

  從地址池配置一個IP地址給容器

  執行使用者指定的應用程式

  執行完畢後容器被終止

2)、使用docker start [容器或ID]命令啟動一個終止的容器,這個還沒有研究

容器的核心是執行的應用程式,所需要的資源都是應用程式所必需的,沒有其他無用的資源;在偽終端中可以使用ps或top命令檢視程序資訊(程序、程序)

可見容器中只運行了指定的應用,這就是貨真價實的輕量級虛擬化

2、守護態執行,注意如果啟動後的命令執行完,程序便關閉,-d只是後臺執行,執行完就關閉

如果不想讓容器程序關閉,需要一直使用該程序,

如下面例子,啟動容器命令是docker run -d ubuntu:14.04,執行的命令是/bin/sh -c "while true;do echo hello world;sleep 1;done"

命令中有while true語句,所以容器程序不會關閉,也就是下面檢視logs就一直有hello world

通過新增-d 引數來實現Docker容器在後臺以守護態(Daemonized)形式執行

docker run -d ubuntu:14.04 /bin/sh -c "while true;do echo hello world;sleep 1;done"

後面的-c 是shell命令,執行後面的shell語句

docker ps命令檢視執行的容器

使用docker logs 加上執行容器的名稱,檢視輸出資訊

3、終止執行的容器,應用終結時,容器會終止,使用exit或Ctrl+d退出終端時,容器也會終止,使用docker stop命令也可以終止執行的容器

docker ps -a 命令檢視所有容器

docker stop [容器名稱或容器ID] 命令來終止執行的容器

docker start [容器名稱或容器ID] 命令可以啟動已終止的容器(啟動方式依據該容器建立時候方式)

docker restart [容器名稱或容器ID] 命令先終止後啟動容器

4、進入容器(docker attach命令或nsenter工具等)

1)、docker attach命令,在多視窗同時attach到同一個容器的時候,所有視窗都會同步顯示,當某個視窗因命令阻塞時,其他視窗也無法執行操作了

2)、nsenter命令

安裝

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 && cp nsenter /usr/local/bin

其中有可能在configure時候會出現如下錯誤,那就需要安裝所需外掛

使用

nsenter可以訪問另一個程序的名字空間,nsenter要正常工作需要root許可權

 下面只舉一個完整例子(獲取PID方式還可以通過docker top [容器名或ID])

複製程式碼

$ 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
[email protected]:/#

複製程式碼

還可以使用docker-enter [容器名稱或ID] shell命令 ,在容器內執行命令

5、匯入匯出容器(區別於映象的儲存與載入,匯入匯出容器是操作容器快照;容器快照檔案將丟棄所有歷史記錄和元資料資訊,而映象儲存檔案將儲存完整記錄,體積也大)

1)、匯出容器快照到本地,命令如下,docker export [容器名稱或ID]

docker export 5839832 >ubuntu.tar

2)使用docker import 從容器快照匯入為映象,命令如下

cat ubuntu.tar | docker import - test/ubuntu:v1.0

docker import ubuntu.tar  test/ubuntu:v1.1

也可以通過指定URL或某個目錄來匯入,如

docker import http://example.com/exampleimage.tgz example/imagerepo

注意:docker load 通過匯入映象儲存檔案到本地映象庫,也可以通過docker import 匯入一個容器快照到本地映象庫;區別在於映象儲存檔案包含完整記錄,容器快照丟棄了所有歷史記錄和元資料

6、刪除容器

刪除一個終止的容器,命令如下,docker rm [容器名稱或ID]

docker rm 3ba302

如果強制刪除一個正在執行的容器,要加引數 -f

docker rm -f 3ba302

 7、退出容器並關閉容器程序

使用ctrl+d或exit命令

8、退出容器但不關閉程序

1)、使用ctrl+p,q或ctrl+p,ctrl+q

2)、再開啟一個當前執行容器的偽終端,那個容器一定是在執行中,然後執行退出後使用ctrl+d或exit,就會退出當前這個容器的使用exec啟動的終端

如果再次attach容器後使用ctrl+d或exit就會退出容器,關閉程序了,這種方法只能說是變相的實現

docker exec是在系統中對正在執行的容器進行命令操作,可參考菜鳥教程

docker exec -it [CONTAINER_NAME or CONTAINER_ID] /bin/bash