1. 程式人生 > >深入淺出Docker(二):Docker命令列探祕

深入淺出Docker(二):Docker命令列探祕

1. Docker命令列

Docker官方為了讓使用者快速瞭解Docker,提供了一個互動式教程,旨在幫助使用者掌握Docker命令列的使用方法。但是由於Docker技術的快速發展,此互動式教程已經無法滿足Docker使用者的實際使用需求,所以讓我們一起開始一次真正的命令列學習之旅。首先,Docker的命令清單可以通過執行docker ,或者 docker help 命令得到:

$ sudo docker

在Docker容器技術不斷演化的過程中,Docker的子命令已經達到34個之多,其中核心子命令(例如:run)還會有複雜的引數配置。筆者通過結合功能和應用場景方面的考慮,把命令列劃分為4個部分,方便我們快速概覽Docker命令列的組成結構:

功能劃分

命令

環境資訊相關

  1. info
  2. version

系統運維相關

  1. attach
  2. build
  3. commit
  4. cp
  5. diff
  6. export
  7. images
  8. import / save / load
  9. inspect
  10. kill
  11. port
  12. pause / unpause
  13. ps
  14. rm
  15. rmi
  16. run
  17. start / stop / restart
  18. tag
  19. top
  20. wait

日誌資訊相關

  1. events
  2. history
  3. logs

Docker Hub服務相關

  1. login
  2. pull / push
  3. search

1.1 引數約定

單個字元的引數可以放在一起組合配置,例如

docker run -t -i --name test busybox sh 

可以用這樣的方式等同:

docker run -ti --name test busybox sh

1.2 Boolean

Boolean引數形式如: -d=false。注意,當你宣告這個Boolean引數時,比如 docker run -d=true,它將直接把啟動的Container掛起放在後臺執行。

1.3 字串和數字

引數如 --name=“” 定義一個字串,它僅能被定義一次。同類型的如-c=0 定義一個數字,它也只能被定義一次。

1.4 後臺程序

Docker後臺程序是一個常駐後臺的系統程序,值得注意的是Docker使用同一個檔案來支援客戶端和後臺程序,其中角色切換通過-d來實現。這個後臺程序是用來管理容器的,使用Docker --help可以得到更詳細的功能引數配置, 如下圖:

Docker後臺程序引數清單如下表:

引數

解釋

--api-enable-cors=false

開放遠端API呼叫的 CORS 頭資訊。這個介面開關對想進行二次開發的上層應用提供了支援。

-b, --bridge=""

掛載已經存在的網橋裝置到 Docker 容器裡。注意,使用 none 可以停用容器裡的網路。

--bip=""

使用 CIDR 地址來設定網路橋的 IP。注意,此引數和 -b 不能一起使用。

-D, --debug=false

開啟Debug模式。例如:docker -d -D

-d, --daemon=false

開啟Daemon模式。

--dns=[]

強制容器使用DNS伺服器。例如: docker -d --dns 8.8.8.8

--dns-search=[]

強制容器使用指定的DNS搜尋域名。例如: docker -d --dns-search example.com

-e, --exec-driver="native"

強制容器使用指定的執行時驅動。例如:docker -d -e lxc

-G, --group="docker"

在後臺執行模式下,賦予指定的Group到相應的unix socket上。注意,當此引數 --group 賦予空字串時,將去除組資訊。

-g, --graph="/var/lib/docker"

配置Docker執行時根目錄

-H, --host=[]

在後臺模式下指定socket繫結,可以繫結一個或多個 tcp://host:port, unix:///path/to/socket, fd://* 或 fd://socketfd。例如:

$ docker -H tcp://0.0.0.0:2375 ps 或者

$ export DOCKER_HOST="tcp://0.0.0.0:2375"
$ docker ps

--icc=true

啟用內聯容器的通訊。

--ip="0.0.0.0"

容器繫結IP時使用的預設IP地址

--ip-forward=true

啟動容器的 net.ipv4.ip_forward

--iptables=true

啟動Docker容器自定義的iptable規則

--mtu=0

設定容器網路的MTU值,如果沒有這個引數,選用預設 route MTU,如果沒有預設route,就設定成常量值 1500。

-p, --pidfile="/var/run/docker.pid"

後臺程序PID檔案路徑。

-r, --restart=true

重啟之前執行中的容器

-s, --storage-driver=""

強制容器執行時使用指定的儲存驅動,例如,指定使用devicemapper, 可以這樣:

docker -d -s devicemapper

--selinux-enabled=false

啟用selinux支援

--storage-opt=[]

配置儲存驅動的引數

--tls=false

啟動TLS認證開關

--tlscacert="/Users/dxiao/.docker/ca.pem"

通過CA認證過的的certificate檔案路徑

--tlscert="/Users/dxiao/.docker/cert.pem"

TLS的certificate檔案路徑

--tlskey="/Users/dxiao/.docker/key.pem"

TLS的key檔案路徑

--tlsverify=false

使用TLS並做後臺程序與客戶端通訊的驗證

-v, --version=false

顯示版本資訊

注意,其中帶有[] 的啟動引數可以指定多次,例如

$ docker run -a stdin -a stdout -a stderr -i -t ubuntu /bin/bash

2. Docker命令列探祕

2.1 環境資訊相關

info

使用方法: docker info

例子:

[[email protected] docker]$ sudo docker -D info
Containers: 0
Images: 32
Storage Driver: devicemapper
 Pool Name: docker-252:1-130159-pool
 Data file: /var/lib/docker/devicemapper/devicemapper/data
 Metadata file: /var/lib/docker/devicemapper/devicemapper/metadata
 Data Space Used: 1616.9 Mb
 Data Space Total: 102400.0 Mb
 Metadata Space Used: 2.4 Mb
 Metadata Space Total: 2048.0 Mb
Execution Driver: native-0.2
Kernel Version: 3.11.10-301.fc20.x86_64
Debug mode (server): false
Debug mode (client): true
Fds: 11
Goroutines: 14
EventsListeners: 0
Init SHA1: 2c5adb59737b8a01fa3fb968519a43fe140bc9c9
Init Path: /usr/libexec/docker/dockerinit
Sockets: [fd://]

使用說明:

這個命令在開發者報告Bug時會非常有用,結合docker vesion一起,可以隨時使用這個命令把本地的配置資訊提供出來,方便Docker的開發者快速定位問題。

version

使用方法: docker version

使用說明:

顯示Docker的版本號,API版本號,Git commit, Docker客戶端和後臺程序的Go版本號。

2.2 系統運維相關

attach

使用方法: docker attach [OPTIONS] CONTAINER

例子:

$ ID=$(sudo docker run -d ubuntu /usr/bin/top -b)
$ sudo docker attach $ID
top - 17:21:49 up  5:53,  0 users,  load average: 0.63, 1.15, 0.78
Tasks:   1 total,   1 running,   0 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.0 us,  0.7 sy,  0.0 ni, 97.7 id,  0.7 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:   2051644 total,   723700 used,  1327944 free,    33032 buffers
KiB Swap:   0 total,   0 used,  0 free.   565836 cached Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
    1 root      20   0   19748   1280   1008 R  0.0  0.1   0:00.04 top
$ sudo docker stop $ID

使用說明:

使用這個命令可以掛載正在後臺執行的容器,在開發應用的過程中運用這個命令可以隨時觀察容器內程序的執行狀況。開發者在開發應用的場景中,這個命令是一個非常有用的命令。

build

使用方法:docker build [OPTIONS] PATH | URL | -

例子:

$ docker build .
Uploading context 18.829 MB
Uploading context
Step 0 : FROM busybox
 ---> 769b9341d937
Step 1 : CMD echo Hello world
 ---> Using cache
 ---> 99cc1ad10469
Successfully built 99cc1ad10469

使用說明:

這個命令是從原始碼構建新Image的命令。因為Image是分層的,最關鍵的Base Image是如何構建的是使用者比較關心的,Docker官方文件給出了構建方法,請參考這裡

commit

使用方法:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

例子:

$ sudo docker ps
ID                  IMAGE               COMMAND             CREATED             STATUS              PORTS
c3f279d17e0a        ubuntu:12.04        /bin/bash           7 days ago          Up 25 hours
197387f1b436        ubuntu:12.04        /bin/bash           7 days ago          Up 25 hours
$ docker commit c3f279d17e0a  SvenDowideit/testimage:version3
f5283438590d
$ docker images | head
REPOSITORY                        TAG                 ID                  CREATED             VIRTUAL SIZE
SvenDowideit/testimage            version3            f5283438590d        16 seconds ago      335.7 MB

使用說明:

這個命令的用處在於把有修改的container提交成新的Image,然後匯出此Imange分發給其他場景中除錯使用。Docker官方的建議是,當你在除錯完Image的問題後,應該寫一個新的Dockerfile檔案來維護此Image。commit命令僅是一個臨時建立Imange的輔助命令。

cp

使用方法: cp CONTAINER:PATH HOSTPATH

使用說明:

使用cp可以把容器內的檔案複製到Host主機上。這個命令在開發者開發應用的場景下,會需要把執行程式產生的結果複製出來的需求,在這個情況下就可以使用這個cp命令。

diff

使用方法:docker diff CONTAINER

例子:

$ sudo docker diff 7bb0e258aefe

C /dev
A /dev/kmsg
C /etc
A /etc/mtab
A /go
A /go/src
A /go/src/github.com
A /go/src/github.com/dotcloud
....

使用說明:

diff會列出3種容器內檔案狀態變化(A - Add, D - Delete, C - Change )的列表清單。構建Image的過程中需要的除錯指令。

export

使用方法:docker export CONTAINER

例子:

$ sudo docker export red_panda > latest.tar

使用說明:

把容器系統檔案打包並匯出來,方便分發給其他場景使用。

images

使用方法:docker images [OPTIONS] [NAME]

例子:

$ sudo docker images | head
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
<none> <none> 77af4d6b9913 19 hours ago 1.089 GB
committest latest b6fa739cedf5 19 hours ago 1.089 GB
<none> <none> 78a85c484f71 19 hours ago 1.089 GB
$ docker latest 30557a29d5ab 20 hours ago 1.089 GB
<none> <none> 0124422dd9f9 20 hours ago 1.089 GB
<none> <none> 18ad6fad3402 22 hours ago 1.082 GB
<none> <none> f9f1e26352f0 23 hours ago 1.089 GB
tryout latest 2629d1fa0b81 23 hours ago 131.5 MB
<none> <none> 5ed6274db6ce 24 hours ago 1.089 GB

使用說明:

Docker Image是多層結構的,預設只顯示最頂層的Image。不顯示的中間層預設是為了增加可複用性、減少磁碟使用空間,加快build構建的速度的功能,一般使用者不需要關心這個細節。

import / save / load

使用方法:

docker import URL|- [REPOSITORY[:TAG]]
docker save IMAGE
docker load

使用說明:

這一組命令是系統運維裡非常關鍵的命令。載入(兩種方法: import, load),匯出(一種方法: save)容器系統檔案。

inspect

使用方法:

docker inspect CONTAINER|IMAGE [CONTAINER|IMAGE...]

例子:

$ sudo docker inspect --format='{{.NetworkSettings.IPAddress}}' $INSTANCE_ID

使用說明:

檢視容器執行時詳細資訊的命令。瞭解一個Image或者Container的完整構建資訊就可以通過這個命令實現。

kill

使用方法:

docker kill [OPTIONS] CONTAINER [CONTAINER...]

使用說明:

殺掉容器的程序。

port

使用方法:

docker port CONTAINER PRIVATE_PORT

使用說明:

打印出Host主機埠與容器暴露出的埠的NAT對映關係

pause / unpause

使用方法:

docker pause CONTAINER

使用說明:

使用cgroup的freezer順序暫停、恢復容器裡的所有程序。詳細freezer的特性,請參考官方文件

ps

使用方法:

docker ps [OPTIONS]

例子:

$ docker ps
CONTAINER ID        IMAGE                        COMMAND                CREATED              STATUS              PORTS               NAMES
4c01db0b339c        ubuntu:12.04                 bash                   17 seconds ago       Up 16 seconds                           webapp
d7886598dbe2        crosbymichael/redis:latest   /redis-server --dir    33 minutes ago       Up 33 minutes       6379/tcp            redis,webapp/db

使用說明:

docker ps打印出正在執行的容器,docker ps -a打印出所有執行過的容器。

rm

使用方法:

docker rm [OPTIONS] CONTAINER [CONTAINER...]

例子:

$ sudo docker rm /redis
/redis

使用說明:

刪除指定的容器。

rmi

使用方法:

docker rmi IMAGE [IMAGE...]

例子:

$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test1 latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB)
test latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB)
test2 latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB)

$ sudo docker rmi fd484f19954f
Error: Conflict, cannot delete image fd484f19954f because it is tagged in multiple repositories
2013/12/11 05:47:16 Error: failed to remove one or more images

$ sudo docker rmi test1
Untagged: fd484f19954f4920da7ff372b5067f5b7ddb2fd3830cecd17b96ea9e286ba5b8

$ sudo docker rmi test2
Untagged: fd484f19954f4920da7ff372b5067f5b7ddb2fd3830cecd17b96ea9e286ba5b8

$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB)

$ sudo docker rmi test
Untagged: fd484f19954f4920da7ff372b5067f5b7ddb2fd3830cecd17b96ea9e286ba5b8
Deleted: fd484f19954f4920da7ff372b5067f5b7ddb2fd3830cecd17b96ea9e286ba5b8

使用說明:

指定刪除Image檔案。

run

使用方法:

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

例子:

$ sudo docker run --cidfile /tmp/docker_test.cid ubuntu echo "test"

使用說明:

這個命令是核心命令,可以配置的引數多達28個引數。詳細的解釋可以通過docker run --help列出。官方文件中提到的 Issue 2702:"lxc-start: Permission denied - failed to mount" could indicate a permissions problem with AppArmor. 在最新版本的Dcoker中已經解決。

start / stop / restart

使用方法:

docker start CONTAINER [CONTAINER...]

使用說明:

這組命令可以開啟(兩個:start, restart),停止(一個:stop)一個容器。

tag

使用方法:

docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]

使用說明:

組合使用使用者名稱,Image名字,標籤名來組織管理Image。

top

使用方法:

            
           

相關推薦

深入淺出DockerDocker命令探祕

1. Docker命令列 Docker官方為了讓使用者快速瞭解Docker,提供了一個互動式教程,旨在幫助使用者掌握Docker命令列的使用方法。但是由於Docker技術的快速發展,此互動式教程已經無法滿足Docker使用者的實際使用需求,所以讓我們一起開始一次真正的命

DockerDocker常用命令之映象的建立Dockerfile 與 commit

        從鏡像倉庫下載的映象,都是別人事先做好的。如果需要一個定製的映象,就必須得自己動手了。自己建立一個映象有2種方式:a、使用commit命令基於一個現有的映象來修改。本質上並不是新建一個映象,而是基於一個已有的基礎映象進行修改。b、基於Dockerfile來建立

Asp.Net Core 程式部署到Linuxcentos生產環境docker部署

執行環境 照例,先亮環境;軟體的話我這裡假設你已經批准好了.net core 執行環境,未配置可以看我的這篇[linux(centos)搭建.net core 執行環境] 騰訊雲 centos:7.2 cpu:1核 2G記憶體 1M頻寬 docker:18.06.1-ce 安裝dock

Asp.Net Core 程序部署到Linuxcentos生產環境docker部署

大神 生產環境 blog for 服務器 路徑 結構 dot images 運行環境 照例,先亮環境;軟件的話我這裏假設你已經批準好了.net core 運行環境,未配置可以看我的這篇[linux(centos)搭建.net core 運行環境] 騰訊雲 centos

【鏈塊技術53期】超級賬本Fabric教程 Docker的部署和安裝

原文連結:超級賬本Fabric教程 Docker的部署和安裝(下) 本節分享超級賬本執行環境docker容器的搭建。   四、Docker compose 4.1 能夠在主機上創建出相互隔離的網路,通過命令列管理多個容器。 在mac和windows中都集成了compos

【鏈塊技術52期】超級賬本Fabric教程Docker的部署和安裝

原文連結:超級賬本Fabric教程(二):Docker的部署和安裝(上) 本節分享超級賬本執行環境docker容器的搭建。   一、目錄 HyperLedger超級賬本執行環境-Docker容器介紹   二、推薦linux系統  

docker3docker常用命令

幫助命令 版本驗證 docker version docker容器描述 docker info 映象命令 列出本地主機上的映象 docker images [optopns] -a 列出本地所有映象,包含中間對映層 -q

Docker的使用初探Docker與.NET Core的結合

目錄 Docker的使用初探(二):Docker與.NET Core的結合 新增Dockefile 1. 在建立專案時新增 2. 手動新增 3. 容器業務流程協調控制程式支援 Dockefile語法 Docker專

docker registry2 搭建

1.環境描述 [root@localhost docker.registry:5000]# cat /etc/redhat-release Red Hat Enterprise Linux Server release 7.3 (Maipo) [r

Docker筆記Docker管理的物件

原文地址:http://blog.jboost.cn/2019/07/14/docker-2.html   在Docker筆記(一):什麼是Docker中,我們提到了Docker管理的物件包含映象、容器、網路、資料卷等,本文就來介紹下這些物件及用途。 1. 映象 所謂映象,是一個靜態的概念。

Docker理解容器編排工具Kubernetes內部工作原理

一、Kubernetes是什麼   要說到Docker就不得不說說Kubernetes。當Docker容器在微服務的環境下數量一多,那麼統一的,自動化的管理自然少不了。而Kubernetes就是一個這樣的工具,它不僅僅提供了健康檢查和自修復,還有自動擴容縮容,以及服務發現和負載均衡等等功能。總的來說它使我們對

DockerDocker核心技術預覽

docker開始學習docker了,想寫一篇docker技術介紹的純理論文章,發現以下網站的文檔寫的特別好,就直接引用了,文章轉載自:http://www.infoq.com/cn/DockerDeep http://www.infoq.com/cn/articles/docker-core-technolo

DockerDocker端口映射

oot gre 指定 con 指定端口 docker ner 查看 names 1、隨機映射   docker run -P -d --name mynginx1 nginx   [[email protected] ~]# docker ps -l     CO

linux系列cd命令

1、命令格式:   cd [目錄名] 2、命令功能:   切換當前目錄至目錄名目錄 3、常用例項 (1)、進入系統根目錄 命令:   cd / 輸出: [email protected]:~/軟體$ cd / [email protected]-computer:/

理解Docker4Docker 容器使用 cgroups 限制資源使用

來源:http://www.cnblogs.com/sammyliu/p/5886833.html 上一篇文章將到 Docker 容器使用 linux namespace 來隔離其執行環境,使得容器中的程序看起來就像愛一個獨立環境中執行一樣。但是,光有執行環境隔離還不夠,因為這些程序還是可以不受

理解Docker3Docker 使用 Linux namespace 隔離容器的執行環境

來源:http://www.cnblogs.com/sammyliu/p/5878973.html 1. 基礎知識:Linux namespace 的概念     Linux 核心從版本 2.4.19 開始陸續引入了 namespace 的概念。其目的是將某個特定的全域性

理解Docker2Docker 映象

來源:http://www.cnblogs.com/sammyliu/p/5877964.html 對於每個軟體,除了它自身的程式碼以外,它的執行還需要有一個執行環境和依賴。不管這個軟體是象往常一樣執行在物理機或者虛機之中,還是執行在現在的容器之中,這些都是不變的。在傳統環境中,軟體在執行之前也

理解Docker1Docker 安裝和基礎用法

來源:https://www.cnblogs.com/sammyliu/p/5875470.html 1. 安裝 1.1 在 Ubuntu 14.04 上安裝 Docker 前提要求: 核心版本必須是3.10或者以上 依次執行下面的步驟: sudo apt-g

理解Docker8Docker 儲存之卷Volume

1. Docker volume 的幾種形態     有狀態容器都有資料持久化需求。前一篇文章中提到過,Docker 採用 AFUS 分層檔案系統時,檔案系統的改動都是發生在最上面的容器層。在容器的生命週期內,它是持續的,包括容器在被

學習nginx基本命令

僅輸入 nginx 就是啟動程式 引數列表: -? | -h — 顯示幫助(引數列表): nginx version: nginx/1.15.7 Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix]