Docker 容器管理

啓動容器有兩種方式,一種是基於鏡像新建一個容器並啓動,另外一個是將在終止狀態(stopped)的容器重新啓動。

新建並啓動 docker run

啓動過程理解

當利用 docker run 來創建容器時,Docker 在後臺運行的標準操作包括:
1. 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
2. 利用鏡像創建並啓動一個容器
3. 分配一個文件系統,並在只讀的鏡像層外面掛載一層可讀寫層
4. 從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中去
5. 從地址池配置一個 ip 地址給容器
6. 執行用戶指定的應用程序
7. 執行完畢後容器被終止

docker run 命令使用說明

Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]    

  -d, --detach=false         指定容器運行於前臺還是後臺,默認爲false     
  -i, --interactive=false   打開STDIN,用於控制檯交互    
  -t, --tty=false            分配tty設備,該可以支持終端登錄,默認爲false    
  -u, --user=""              指定容器的用戶    
  -a, --attach=[]            登錄容器(必須是以docker run -d啓動的容器)  
  -w, --workdir=""           指定容器的工作目錄   
  -c, --cpu-shares=0        設置容器CPU權重,在CPU共享場景使用    
  -e, --env=[]               指定環境變量,容器中可以使用該環境變量    
  -m, --memory=""            指定容器的內存上限    
  -P, --publish-all=false    指定容器暴露的端口    
  -p, --publish=[]           指定容器暴露的端口   
  -h, --hostname=""          指定容器的主機名    
  -v, --volume=[]            給容器掛載存儲卷,掛載到容器的某個目錄    
  --volumes-from=[]          給容器掛載其他容器上的卷,掛載到容器的某個目錄  
  --cap-add=[]               添加權限,權限清單詳見:http://linux.die.net/man/7/capabilities
  --cap-drop=[]              刪除權限,權限清單詳見:http://linux.die.net/man/7/capabilities
  --cidfile=""               運行容器後,在指定文件中寫入容器PID值,一種典型的監控系統用法    
  --cpuset=""                設置容器可以使用哪些CPU,此參數可以用來容器獨佔CPU    
  --device=[]                添加主機設備給容器,相當於設備直通    
  --dns=[]                   指定容器的dns服務器    
  --dns-search=[]            指定容器的dns搜索域名,寫入到容器的/etc/resolv.conf文件    
  --entrypoint=""            覆蓋image的入口點    
  --env-file=[]              指定環境變量文件,文件格式爲每行一個環境變量    
  --expose=[]                指定容器暴露的端口,即修改鏡像的暴露端口    
  --link=[]                  指定容器間的關聯,使用其他容器的IP、env等信息    
  --lxc-conf=[]              指定容器的配置文件,只有在指定--exec-driver=lxc時使用    
  --name=""                  指定容器名字,後續可以通過名字進行容器管理,links特性需要使用名字    
  --net="bridge"             容器網絡設置:  
                                bridge 使用docker daemon指定的網橋       
                                host    //容器使用主機的網絡    
                                container:NAME_or_ID  >//使用其他容器的網路,共享IP和PORT等網絡資源    
                                none 容器使用自己的網絡(類似--net=bridge),但是不進行配置   
  --privileged=false         指定容器是否爲特權容器,特權容器擁有所有的capabilities    
  --restart="no"             指定容器停止後的重啓策略:  
                                no:容器退出時不重啓    
                                on-failure:容器故障退出(返回值非零)時重啓   
                                always:容器退出時總是重啓    
  --rm=false                 指定容器停止後自動刪除容器(不支持以docker run -d啓動的容器)    
  --sig-proxy=true           設置由代理接受並處理信號,但是SIGCHLDSIGSTOPSIGKILL不能被代理

例子

啓動一個 bash 終端,允許用戶進行交互

$ sudo docker run -t -i ubuntu:14.04 /bin/bash
root@af8bae53bdd3:/#

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

在後臺運行一個容器

$ sudo docker run -d ubuntu:14.04
root@af8bae53bdd4:/#

更多的時候,需要讓 Docker 容器在後臺以守護態(Daemonized)形式運行。此時,可以通過添加 -d 參數來實現。

啓動已終止容器 docker start

docker start 命令使用說明

Usage:  docker start [OPTIONS] CONTAINER [CONTAINER...]
Start one or more stopped containers
Options:
  -a, --attach               Attach STDOUT/STDERR and forward signals
      --detach-keys string   Override the key sequence for detaching a container
      --help                 Print usage
  -i, --interactive          Attach container's STDIN

終止容器 docker stop

docker stop 命令使用說明:

Usage:  docker stop [OPTIONS] CONTAINER [CONTAINER...]

Stop one or more running containers

Options:
      --help       Print usage
  -t, --time int   Seconds to wait for stop before killing it (default 10)

進入容器

在使用 -d 參數時,容器啓動後會進入後臺。 某些時候需要進入容器進行操作,有很多種方法,包括使用docker attach 命令或 nsenter 工具等

方法一 : attach 命令

$ 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:/#

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

方法二:nsenter 命令

$ 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:/#

方法三:docker exec 命令

$ 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 exec -it nostalgic_hypatia /bin/bash
root@243c32535da7:/#

導出和導入容器 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 信號給容器

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