學習Docker(2017-10-5)
本節目錄:
- 映象的實現原理
1. 操作 Docker 容器
- 啟動容器
- 後臺(background)執行
- 終止容器
- 進入容器
- 匯出和匯入容器
- 刪除容器
- 清理所有處於終止狀態的容器
映象的實現原理
Docker 映象是怎麼實現增量的修改和維護的?每個映象都由很多層次構成,
Docker 使用 Union FS 將這些不同的層結合到一個映象中去。
通常 Union FS 有兩個用途:
1. 一方面可以實現不借助 LVM、RAID 將多個 disk 掛到同一個目錄下
- 另一個更常用的就是將一個只讀的分支和一個可寫的分支聯合在一起,Live CD 正是基於此方法可以允許在映象不變的基礎上允許使用者在其上進行一些寫操作。Docker 在 AUFS 上構建的容器也是利用了類似的原理。
操作 Docker 容器
容器是 Docker 又一核心概念
容器對應虛擬機器可以理解為模擬執行的一整套作業系統(提供了執行態環境和其他作業系統)和跑在上面的應用。下面學習容器的建立、啟動和停止等
啟動容器
- 基於映象建立一個容器並啟動
- 將在終止狀態(stopped)的容器重新啟動
例項1:
docker run ubuntu:14.04 /bin/echo 'Hello world' Hello world
docker run -t -i ubuntu:14.04 /bin/bash
-t 選項讓 Docker 分配一個偽終端,並繫結到容器的標準輸入上,-i 則讓容器的標準輸入保持開啟,進入互動終端,使用者可以通過所建立的終端來輸入命令,
當利用 docker run 來建立容器時, Docker 在後臺執行的標準操作包括:
1. 檢查本地是否存在指定映象,不存在就從公有倉庫下載 利用映象建立並啟動一個容器
2. 分配一個檔案系統,並在只讀的映象層外面掛載一層 可讀寫層
3. 從宿主主機配置的網橋介面中橋接一個虛擬介面到容器中去,從地址池配置一個 ip 地址給容器
4. 執行使用者指定的應用程式
5. 執行完畢後容器被終止
例項2:
利用 docker start
命令,直接將一個已經終止的容器啟動執行。
容器的核心是為所執行的應用程式,所需要的資源都是應用程式執行所必須的。在終端中利用
ps
和top
來檢視程序資訊。
可見,容器中僅運行了指定的 bash 應用。這種特點使得 Docker 對資源利用率極高,體現了 Docker 輕量級虛擬化
top:
後臺(background)執行
通常的時候需要讓 Docker 在後臺執行,而不是直接將執行結果輸出在當前宿主機下。此時,可以通過新增 -d 引數來實現
例項:
docker run ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
容器會把輸出的結果列印到宿主機上面
使用 -d
引數執行容器
docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
使用 -d
引數啟動後會返回一個唯一的 id ,也可以通過 docker ps
命令來檢視容器資訊
要獲取容器的輸出資訊,可以通過 docker logs [container ID or Names]
終止容器
使用 docker stop
命令來終止一個執行中的容器
終止狀態的容器可以用 docker ps -a
命令看到。
現在我們可以用我們剛才講的docker start
重啟結束的容器
docker restart
可以結束正在執行的容器,然後重新啟動
進入容器
在使用 -d 引數時,容器啟動後進入後臺。某些時候需要進入容器進行操作:
1. attach 命令
2. nsenter 命令
例項1:
attach 命令
當多個視窗同時 attach 到同一個容器的時候,所以視窗都會同步顯示。當某個視窗因命令阻塞時,其他視窗也無法執行操作。
例項2:
nsenter 命令
書上介紹的都是 Linux 系統下進行的,因為自己電腦上 windows 這一部分,先暫停
匯出和匯入容器
匯出容器
匯出本地容器
docker ps -a
查詢已經停止的容器 ID
docker export commitID > xxx.tar
匯入容器快照
例項:
docker import - test/ubuntu:v1.0
刪除容器
docker rm
命令刪除處於終止狀態的容器。 -f 強制刪除容器,用在執行的容器中。
清理所有處於終止狀態的容器
docker rm &(docker ps -a -q)
注意;這個命令其實會嘗試刪除所有的包括還執行中的容器,不過就像上面提過的 docker rm 預設不會刪除執行中的容器