1. 程式人生 > >docker學習(三)docker命令大全,歸納總結

docker學習(三)docker命令大全,歸納總結

容器生命週期管理

run 
 docker run :建立一個新的容器並執行一個命令
start/stop/restart
docker start :啟動一個或多少已經被停止的容器
docker stop :停止一個執行中的容器
docker restart :重啟容器
kill

docker kill :殺掉一個執行中的容器。
rm

docker rm :刪除一個或多少容器
pause/unpause

docker pause :暫停容器中所有的程序。

docker unpause :恢復容器中所有的程序。


create

docker create :建立一個新的容器但不啟動它

exec 

docker exec :在執行的容器中執行命令

容器操作

ps

docker ps : 列出容器

inspect

docker inspect : 獲取容器/映象的元資料。

top

docker top :檢視容器中執行的程序資訊,支援 ps 命令引數。

attach

docker attach :連線到正在執行中的容器。

events

docker events : 從伺服器獲取實時事件

logs 

docker logs : 獲取容器的日誌

wait

docker wait : 阻塞執行直到容器停止,然後打印出它的退出程式碼。

export

docker export :

將檔案系統作為一個tar歸檔檔案匯出到STDOUT。

port

docker port :列出指定的容器的埠對映,或者查詢將PRIVATE_PORT NAT到面向公眾的埠。

容器rootfs命令

commit

docker commit :從容器建立一個新的映象。

cp

docker cp :用於容器與主機之間的資料拷貝。

diff

docker diff : 檢查容器裡檔案結構的更改。

映象倉庫

login

docker login : 登陸到一個Docker映象倉庫,如果未指定映象倉庫地址,預設為官方倉庫 Docker Hub

docker logout : 登出一個Docker映象倉庫,如果未指定映象倉庫地址,預設為官方倉庫 Docker Hub

pull

docker pull : 從映象倉庫中拉取或者更新指定映象

push

docker push : 將本地的映象上傳到映象倉庫,要先登陸到映象倉庫

search

docker search : 從Docker Hub查詢映象

本地映象管理

images

docker images : 列出本地映象。

rmi

docker rmi : 刪除本地一個或多少映象。

tag

docker tag : 標記本地映象,將其歸入某一倉庫。

build

docker build : 使用Dockerfile建立映象。

history

 docker history : 檢視指定映象的建立歷史。

save

 docker save : 將指定映象儲存成 tar 歸檔檔案。

import

 docker import : 從歸檔檔案中建立映象。

info|version

info

 docker info : 顯示 Docker 系統資訊,包括映象和容器數。。

version

docker version :顯示 Docker 版本資訊。

基本概念

Docker 包括三個基本概念

  • 映象(Image)
  • 容器(Container)
  • 倉庫(Repository)

先理解了這三個概念,就理解了 Docker 的整個生命週期。

1、docker安裝與啟動

yum install -y epel-release
yum install docker-io # 安裝docker
# 配置檔案 /etc/sysconfig/docker

chkconfig docker on  # 加入開機啟動
service docker start # 啟動docker服務

# 基本資訊檢視
docker version # 檢視docker的版本號,包括客戶端、服務端、依賴的Go等
docker info # 檢視系統(docker)層面資訊,包括管理的images, containers數等
docker pull centos 下載
docker images [ centos ] 檢視
docker run -i -t centos /bin/bash
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

2、映象的獲取與容器的使用

# 搜尋映象
docker search <image> # 在docker index中搜索image
# 下載映象
docker pull <image>  # 從docker registry server 中下拉image
# 檢視映象 
    docker images: # 列出images
    docker images -a # 列出所有的images(包含歷史)
    docker rmi  <image ID>: # 刪除一個或多個image
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
# 使用映象建立容器
docker run -i -t sauloal/ubuntu14.04
docker run -i -t sauloal/ubuntu14.04 /bin/bash # 建立一個容器,讓其中執行 bash 應用,退出後容器關閉
docker run -itd --name centos_aways --restart=always centos #建立一個名稱centos_aways的容器,自動重啟
# --restart引數:always始終重啟;on-failure退出狀態非0時重啟;預設為,no不重啟

# 檢視容器
    docker ps :列出當前所有正在執行的container
    docker ps -l :列出最近一次啟動的container
    docker ps -a :列出所有的container(包含歷史,即執行過的container)
    docker ps -q :列出最近一次執行的container ID
# 再次啟動容器
    docker start/stop/restart <container> #:開啟/停止/重啟container
    docker start [container_id] #:再次執行某個container (包括歷史container)
#進入正在執行的docker容器
    docker exec -it [container_id] /bin/bash
    docker run -i -t -p <host_port:contain_port> #:對映 HOST 埠到容器,方便外部訪問容器內服務,host_port 可以省略,省略表示把 container_port 對映到一個動態埠。

# 刪除容器
    docker rm <container...> #:刪除一個或多個container
    docker rm `docker ps -a -q` #:刪除所有的container
    docker ps -a -q | xargs docker rm #:同上, 刪除所有的container
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

docker run 和 docker create 引數基本一樣,run是建立容器並後臺啟動,create是隻建立容器。 
docker run 相當於docker create 和 docker start

run建立容器:docker run -itd
create建立: docker create -it
    -t, --tty                       Allocate a pseudo-TTY
    -i, --interactive               Keep STDIN open even if not attached
    -d, --detach                    Run container in background and print container ID #run的引數
  • 1
  • 2
  • 3
  • 4
  • 5

容器資源限制引數

-m 1024m --memory-swap=1024m  # 限制記憶體最大使用(bug:超過後程序被殺死)
--cpuset-cpus="0,1"           # 限制容器使用CPU
  • 1
  • 2

docker容器隨系統自啟引數

docker run --restart=always redis
  • 1
  • no – 預設值,如果容器掛掉不自動重啟
  • on-failure – 當容器以非 0 碼退出時重啟容器 
    • 同時可接受一個可選的最大重啟次數引數 (e.g. on-failure:5).
  • always – 不管退出碼是多少都要重啟
docker run -itd --name test01 -p IP:sport:dport  -m 1024m --memory-swap=1024m --cpuset-cpus="0,1" --restart=always <image ID> 
docker exec -it test01 bash  # 進入容器也可以用exec命令
  • 1
  • 2

檢視容器狀態資訊

[root@localhost ~]# docker stats 
[root@localhost ~]# docker stats --no-stream
  • 1
  • 2

進入容器 - nsenter 命令

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

cd /usr/src ; wget https://www.kernel.org/pub/linux/utils/util-linux/v2.28/util-linux-2.28.tar.gz
./configure --without-ncurses
make nsenter && sudo cp nsenter /usr/local/bin
  • 1
  • 2
  • 3

nsenter使用 
nsenter 可以訪問另一個程序的名字空間。nsenter 要正常工作需要有 root 許可權。 
為了連線到容器,你還需要找到容器的第一個程序的 PID,可以通過下面的命令獲取。

PID=$(docker inspect --format "{{ .State.Pid }}" <container>)
  • 1

通過這個 PID,就可以連線到這個容器:

nsenter --target $PID --mount --uts --ipc --net --pid
  • 1

更簡單的,建議下載 .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
  • 1
  • 2

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

echo $(docker-pid <container>)
docker-enter <container> ls
docker-enter <container> bash
  • 1
  • 2
  • 3

3、持久化容器與映象

3.1 通過容器生成新的映象

執行中的映象稱為容器。你可以修改容器(比如刪除一個檔案),但這些修改不會影響到映象。不過,你使用docker commit 命令可以把一個正在執行的容器變成一個新的映象。

docker commit <container> [repo:tag] # 將一個container固化為一個新的image,後面的repo:tag可選。
  • 1

3.2 持久化容器

export命令用於持久化容器

docker export <CONTAINER ID> > /tmp/export.tar
  • 1

3.3 持久化映象

Save命令用於持久化映象

docker save 映象ID > /tmp/save.tar
  • 1

3.4 匯入持久化container

刪除container 2161509ff65e

docker rm 2161509ff65e
  • 1

匯入export.tar檔案

cat /tmp/export.tar | docker import - export:latest
  • 1

3.5 匯入持久化image

刪除image daa11948e23d

docker rmi daa11948e23d
  • 1

匯入save.tar檔案

docker load < /tmp/save.tar
  • 1

對image打tag

docker tag daa11948e23d load:tag
  • 1

3.6 export-import與save-load的區別

匯出後再匯入(export-import)的映象會丟失所有的歷史,而儲存後再載入(save-load)的映象沒有丟失歷史和層(layer)。這意味著使用匯出後再匯入的方式,你將無法回滾到之前的層(layer),同時,使用儲存後再載入的方式持久化整個映象,就可以做到層回滾。(可以執行docker tag 來回滾之前的層)。

3.7 一些其它命令

 docker logs $CONTAINER_ID #檢視docker例項執行日誌,確保正常執行
    docker inspect $CONTAINER_ID #docker inspect <image|container> 檢視imagecontainer的底層資訊
    docker build <path> 尋找path路徑下名為的Dockerfile的配置檔案,使用此配置生成新的image
    docker build -t repo[:tag] 同上,可以指定repo和可選的tag
    docker build - < <dockerfile> 使用指定的dockerfile配置檔案,docker以stdin方式獲取內容,使用此配置生成新的image
    docker port <container> <container port> 檢視本地哪個埠對映到container的指定埠,其實用docker ps 也可以看到
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

一些使用技巧

docker檔案存放目錄

Docker實際上把所有東西都放到/var/lib/docker路徑下了。

[root@localhost docker]# ls -F
containers/  devicemapper/  execdriver/  graph/  init/  linkgraph.db  repositories-devicemapper  volumes/
  • 1
  • 2

containers目錄當然就是存放容器(container)了,graph目錄存放映象,檔案層(file system layer)存放在graph/imageid/layer路徑下,這樣我們就可以看看檔案層裡到底有哪些東西,利用這種層級結構可以清楚的看到檔案層是如何一層一層疊加起來的。