一篇文章學會Docker命令


簡介

本文對Docker的使用命令和管理命令進行了匯總,初學者可以先看簡介了解命令,熟練工可直接根據目錄查看。

注:本文存在大量的官網鏈接跳轉,想學習的可自行跳轉學習。

管理命令:
  container                     管理容器
  image                         管理鏡像
  network                       管理網絡
  node                          管理Swarm節點
  plugin                        管理插件
  secret                        管理Docker secrets
  service                       管理服務
  stack                         管理Docker stacks
  swarm                         管理Swarm集群
  system                        查看系統信息
  volume                        管理卷
  
  如:docker container ls       顯示所有容器
  
普通命令:
    
  // 開發應該熟練掌握的:
  images                        查看鏡像列表
  rmi                           刪除鏡像
  save                          將指定鏡像保存成 tar 歸檔文件
  load                          從存檔或者STDIN加載鏡像
  build                         從一個DockerFile構建鏡像
  commit                        從容器創建一個鏡像
  
  create                        創建一個容器
  run                           創建一個新的容器並運行一個命令
  rename                        重命名容器
  start                         啟動容器
  stop                          停止容器
  restart                       重啟容器
  rm                            刪除容器
  logs                          獲取一個容器的日志
  exec                          在正在運行的容器中運行命令
  cp                            從容器和主機文件系統之間拷貝文件 
  ps                            查看容器列表
  
  
  // 運維應該熟練掌握的: 
  login                         登陸docker鏡像倉庫
  logout                        退出docker鏡像倉庫
  search                        從Docker Hub搜索鏡像
  pull                          從鏡像倉庫拉取鏡像
  push                          將本地的鏡像上傳到鏡像倉庫,要先登陸到鏡像倉庫
  tag                           標記本地鏡像,將其歸入某一倉庫
  export                        將容器的文件系統導出為tar存檔
  import                        從歸檔文件中創建鏡像
  
  info                          顯示系統范圍的信息
  version                       顯示Docker的版本信息
  stats                         顯示(實時)容器資源使用情況的統計信息
  inspect                       顯示Docker對象的低級信息(查看對象詳情)
  diff                          顯示容器文件系統上的更改(查看容器變化)
  events                        顯示從服務器獲取實時事件(可查看docker的改動)
  port                          顯示端口映射或容器的特定映射列表(端口查看)
  top                           顯示一個容器中運行的進程(查看進程)
  history                       顯示鏡像的歷史記錄
  
  attach                        進入一個運行的容器
  pause                         暫停一個或多個容器中的所有進程
  unpause                       恢復容器中所有的進程
  kill                          kill運行中的容器
  wait                          阻塞直到容器停止,然后打印退出代碼
  
  update                        更新容器配置
 

Docker不僅提供了在各個環節下使用的命令,還提供了DockerAPI供我們使用Http來和Docker進行交互,從而開發我們自己的Docker。

鏡像倉庫

login

docker login : 登陸到一個Docker鏡像倉庫,如果未指定鏡像倉庫地址,默認為官方倉庫 Docker Hub

docker logout : 登出一個Docker鏡像倉庫,如果未指定鏡像倉庫地址,默認為官方倉庫 Docker Hub

語法

docker login/logout (-$) [SERVER]

選項:

    -u                          登陸的用戶名

    -p                          登陸的密碼

實例

docker login -u 用戶名 -p 密碼      #登陸到Docker Hub
docker logout                       #登出Docker Hub

pull

docker pull : 從鏡像倉庫中拉取或者更新指定鏡像

語法

docker pull (-$) NAME[:TAG|@DIGEST]

選項:

    -a,all                      拉取所有 tagged 鏡像

    --disable-content-trust     忽略鏡像的校驗,默認開啟

實例

docker pull java            # 從Docker Hub下載java最新版鏡像
docker pull -a java         # 從Docker Hub下載REPOSITORY為java的所有鏡像

push

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

語法

docker push (-$) NAME[:TAG]

選項:

    --disable-content-trust     忽略鏡像的校驗,默認開啟

實例

docker push myapache:v1                     # 上傳本地鏡像myapache:v1到鏡像倉庫中
docker push 192.168.0.100:5000/ubuntu       # 推送鏡像庫到私有源

docker search : 從Docker Hub查找鏡像

語法

docker search (-$) TERM

選項:

    -automated                  只列出 automated build類型的鏡像;

    --no-trunc                  顯示完整的鏡像描述;

    -s                          列出收藏數不小於指定值的鏡像。

實例

docker search -s 10 java        # 從Docker Hub查找所有鏡像名包含java,並且收藏數大於10的鏡像   

本地鏡像管理

images

docker images : 列出本地鏡像。

語法

docker images (-$) [REPOSITORY[:TAG]]

選項:

    -a                          列出本地所有的鏡像(含中間映像層,默認情況下,過濾掉中間映像層)

    --digests                   顯示鏡像的摘要信息

    -f                          顯示滿足條件的鏡像

    --format                    指定返回值的模板文件

    --no-trunc                  顯示完整的鏡像信息

    -q                          只顯示鏡像ID。

實例

docker images -f dangling=true          # 查詢出無用的鏡象
docker images alpine                    # 列出本地鏡像中REPOSITORY為alpine的鏡像列表

rmi

docker rmi : 刪除本地一個或多少鏡像。

語法

docker rmi (-$)

選項:

    -f,--force              強制刪除鏡像
       --no-prune           不移除該鏡像的過程鏡像,默認移除

實例

刪除所有鏡像

docker rmi $(docker images -q)          

強制刪除鏡像名稱中包含"doss-api"的鏡像

docker rmi --force $(docker images | grep doss-api | awk '{print $3}') 

批量刪除無用鏡象(三種方式都可以,想強制刪除可在rmi后加-f)

docker rmi -f $(docker images | grep "<none>" | awk "{print $3}")
docker images | grep none | awk '{print $3}' | xargs docker rmi
docker rmi $( docker images -f dangling=true)

tag

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

語法

docker tag (-$) IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]

實例:

docker tag ubuntu:15.10 runoob/ubuntu:v3    # 將鏡像ubuntu:15.10標記為 runoob/ubuntu:v3 鏡像

build

docker build 命令用於使用 Dockerfile 創建鏡像。

語法

docker build (-$) PATH | URL | -

選項:

    --build-arg=[]              設置鏡像創建時的變量

    --cpu-shares                設置 cpu 使用權重

    --cpu-period                限制 CPU CFS周期

    --cpu-quota                 限制 CPU CFS配額

    --cpuset-cpus               指定使用的CPU id

    --cpuset-mems               指定使用的內存 id

    --disable-content-trust     忽略校驗,默認開啟

    -f                          指定要使用的Dockerfile路徑

    --force-rm                  設置鏡像過程中刪除中間容器

    --isolation                 使用容器隔離技術

    --label=[]                  設置鏡像使用的元數據

    -m                          設置內存最大值

    --memory-swap               設置Swap的最大值為內存+swap,"-1"表示不限swap

    --no-cache                  創建鏡像的過程不使用緩存

    --pull                      嘗試去更新鏡像的新版本

    --quiet, -q                 安靜模式,成功后只輸出鏡像 ID

    --rm                        設置鏡像成功后刪除中間容器

    --shm-size                  設置/dev/shm的大小,默認值是64M

    --ulimit                    Ulimit配置。

    --tag, -t                   鏡像的名字及標簽,通常 name:tag 或者 name 格式;可以在一次構建中為一個鏡像設置多個標簽。

    --network                   默認 default。在構建期間設置RUN指令的網絡模式

實例

使用當前目錄的 Dockerfile 創建鏡像,標簽為 runoob/ubuntu:v1

docker build -t runoob/ubuntu:v1 .

使用URL github.com/creack/docker-firefox 的 Dockerfile 創建鏡像

docker build github.com/creack/docker-firefox

也可以通過 -f Dockerfile 文件的位置:

docker build -f /path/to/a/Dockerfile .

注:在 Docker 守護進程執行 Dockerfile 中的指令前,首先會對Dockerfile 進行語法檢查,語法錯誤時會返回:
docker build -t test/myapp .
Sending build context to Docker daemon 2.048 kB
Error response from daemon: Unknown instruction: RUNCMD

history

docker history : 查看指定鏡像的創建歷史。

語法

docker history (-$) IMAGE

選項:

    -H              以可讀的格式打印鏡像大小和日期,默認為true;

    --no-trunc      顯示完整的提交記錄;

    -q              僅列出提交記錄ID。

save

docker save : 將指定鏡像保存成 tar 歸檔文件。

語法

docker save (-$) IMAGE [IMAGE...]

    -o              輸出到的文件。

實例

導出鏡像

docker save -o /root/mytomcat7.tar.gz docker.io/tomcat:7.0.77-jre7

docker save docker.io/tomcat:7.0.77-jre7 >/root/mytomcat7.tar.gz

load

docker load : 導入使用 docker save 命令導出的鏡像。

語法

docker load (-$)

    -i              指定導出的文件。

    -q              精簡輸出信息。

實例

導入鏡像

docker load -i ubuntu.tar
docker load < ubuntu.tar
docker load < /root/mytomcat7.tar.gz

import

docker import : 從歸檔文件中創建鏡像。

語法

docker import (-$) file|URL|- [REPOSITORY[:TAG]]

選項:

    -c,--change     將Dockerfile指令應用於創建的映像

    -m,--message    為導入的鏡像設置說明信息
    
    --platform      如果服務器具有多平台功能,則設置平台

實例

從鏡像歸檔文件my_ubuntu_v3.tar創建新的鏡像,並命名為runoob/ubuntu:v4

docker import  my_ubuntu_v3.tar runoob/ubuntu:v4  

容器操作

ps

docker ps : 列出容器

語法

docker ps (-$)

選項:

    -a, --all       顯示所有容器(默認顯示正在運行)
    
    -n              顯示最后創建的n個容器(包括所有狀態)(默認值-1)
                    示例:docker ps -n2
            
    -l,--latest     顯示最新創建的容器(包括所有狀態)
    
    -q, --quiet     只顯示數字id    
    
    -s, --size      顯示總文件大小
    
    --no-trunc      不截斷輸出
    
    -f, --filter    根據提供的條件過濾輸出
                    過濾條件如下:
                    Filter | Description
                    ---|---
                    id      | 容器的ID
                    name    | 容器的Name
                    label   | 表示鍵或鍵值對的任意字符串。表示為<key>或<key>=<value>
                    exited  | 表示容器退出代碼的整數。只有對所有人有用。
                    status  | created,restarting,running,removing,paused,exited,dead之一
                    ancestor| 篩選指定鏡像的容器,例如<image-name>[:<tag>],<image id>, or <image@digest>
                    before or since | 篩選在給定容器ID或名稱之前或之后創建的容器
                    volume  | 運行已掛載給定卷或綁定掛載的容器的篩選器。
                    network | 過濾器運行連接到給定網絡的容器。
                    publish or expose | 篩選發布或公開給定端口的容器,例如<port>[/<proto>] or <startport-endport>/[<proto>]
                    health  | 根據容器的健康檢查狀態過濾容器,例如starting, healthy, unhealthy or none.
                    isolation | 僅Windows守護進程,例如default, process, or hyperv.
                    is-task | 篩選服務的“任務”容器。布爾選項(true or false)
                    
                    示例:
                    docker ps -f name=^'modality'
                    docker ps --filter name=nginx
                    docker ps -a --filter exited=0
                    docker ps --filter status=running
                    docker ps --filter expose=3306
        --format    使用Go模板漂亮地打印容器
                    過濾條件如下:
                    Placeholder | Description
                    ---|---
                    .ID         | 容器的ID
                    .Image      | 鏡像的ID
                    .Command    | 引用命令
                    .CreatedAt  | 創建容器的時間
                    .RunningFor | 自容器啟動以來的運行時長
                    .Ports      | 暴露的端口
                    .Status     | 容器狀態
                    .Size       | 容器的磁盤大小
                    .Names      | 容器的名稱
                    .Labels     | 分配給容器的所有標簽
                    .Label      | 此容器的特定標簽的值,例如`{{.Label "com.docker.swarm.cpu"}}`
                    .Mounts     | 容器掛載的卷
                    .Networks   | 容器所用的網絡名稱
                    
                    示例:
                    docker ps --format "{{.ID}}: {{.Names}}: {{.Command}}"

常用監控命令:

docker ps -a -n=5                   # 查詢最近5個容器
docker ps -a -q | wc -l             # 監控容器數量 
docker ps -q | wc -l                # 正在運行的容器的數量
docker ps -a | grep -v 'Up' | grep -v 'CONTAINER' | wc -l   # 非運行狀態的容器的數量 

inspect

docker inspect : 獲取容器/鏡像的元數據。

語法

docker inspect (-$) NAME|ID [NAME|ID...]

選項:

    -f                      使用給定的Go模板格式化輸出

    -s                      如果類型是容器,則顯示總文件大小

    --type                  為指定類型返回JSON。

實例

查看容器mysql的重啟次數

docker inspect -f "{{ .RestartCount }}" mysql

查看容器mysql的最后一次啟動時間

docker inspect -f "{{ .State.StartedAt }}" mysql

列出所有端口綁定

docker inspect --format='{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' $INSTANCE_ID

獲取正在運行的容器mysql的 IP

docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql

注:更多示例可點擊上方官網鏈接查看

top

docker top :查看容器中運行的進程信息,支持 ps 命令參數。

語法

docker top CONTAINER [ps OPTIONS]

容器運行時不一定有/bin/bash終端來交互執行top命令,而且容器還不一定有top命令,可以使用docker top來實現查看container中正在運行的進程。

實例

查看容器mysql的進程信息

docker top mysql

查看所有運行容器的進程信息

for i in  `docker ps |grep Up|awk '{print $1}'`;do echo \ &&docker top $i; done

attach

docker attach :連接到正在運行中的容器,並將本地標准輸入、輸出和錯誤流附加到正在運行的容器中(個人理解,既實現鏈接后使用命令控制容器)

語法

docker attach (-$) CONTAINER

    --detach-keys                   覆蓋用於分離容器的鍵序列
    --no-stdin                      不附加STDIN
    --sig-proxy                     代理所有接收到的進程信號(默認為true)

要attach上去的容器必須正在運行,可以同時連接上同一個container來共享屏幕(與screen命令的attach類似)。

官方文檔中說attach后可以通過CTRL-C來detach,但實際上經過我的測試,如果container當前在運行bash,CTRL-C自然是當前行的輸入,沒有退出;如果container當前正在前台運行進程,如輸出nginx的access.log日志,CTRL-C不僅會導致退出容器,而且還stop了。這不是我們想要的,detach的意思按理應該是脫離容器終端,但容器依然運行。好在attach是可以帶上--sig-proxy=false來確保CTRL-D或CTRL-C不會關閉容器。

實例

容器mynginx將訪問日志指到標准輸出,連接到容器查看訪問信息。

runoob@runoob:~$ docker attach --sig-proxy=false mynginx
192.168.239.1 - - [10/Jul/2016:16:54:26 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36" "-"

注:(使用exit退出后容器也跟着停止運行), 更多示例和詳細講解可點擊上方官網鏈接或是用--help命令查看

events

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

語法

docker events (-$)

選項:

    -f,--filter                 根據條件過濾事件

    --format		            使用給定的Go模板格式化輸出

    --since                     從指定的時間戳后顯示所有事件

    --until                     流水時間顯示到指定的時間為止

實例

docker events  --since="1467302400"         # 顯示docker 2016年7月1日后的所有事件
docker events -f "image"="mysql:5.6" --since="1467302400"   # 顯示docker 鏡像為mysql:5.6 2016年7月1日后的相關事件

注:更多示例和詳細講解可點擊上方官網鏈接或是用--help命令查看

logs

docker logs : 獲取容器的日志

docker logs (-$) name  

選項

    --details		        顯示提供給日志的額外細節
    
    -f,--follow             跟蹤日志輸出
    
    --since		            顯示從時間戳(例如2013-01-02T13:23:37)或相對(例如42分鍾42秒)之后的日志

    -t,--timestamps        顯示時間戳 類似 tail -f

    --tail                  在日志的末尾輸出指定行數日志(默認所有日志)
    
    --until                 顯示在時間戳(例如2013-01-02T13:23:37)或相對(例如42分鍾42秒)之前的日志

實例

docker logs --since="2016-07-01" --tail=10 mynginx      # 查看容器mynginx從2016年7月1日后的最新10條日志
docker logs -f -t --tail 行數 容器名                     # 實時查看docker容器日志
docker logs -f -t --tail 10 s12                         # 實時查看docker容器名為s12的最后10行日志

注:更多示例和詳細講解可點擊上方官網鏈接或是用--help命令查看

wait

docker wait : 阻塞運行直到容器停止,然后打印出它的退出代碼。

語法

docker wait CONTAINER [CONTAINER...]

實例

docker wait CONTAINER

export

docker export :將文件系統作為一個tar歸檔文件導出到STDOUT

語法

docker export [OPTIONS] CONTAINER

選項:

    -o,--output                 將輸入內容寫到文件。

實例

將容器名為red_panda的容器保存為tar文件

docker export red_panda > latest.tar

或者

docker export --output="latest.tar" red_panda

將id為a404c6c174a2的容器按日期保存為tar文件。

runoob@runoob:~$ docker export -o mysql-`date +%Y%m%d`.tar a404c6c174a2
runoob@runoob:~$ ls mysql-`date +%Y%m%d`.tar
mysql-20160711.tar

port

docker port :列出指定的容器的端口映射,或者查找將PRIVATE_PORT NAT到面向公眾的端口。

語法

docker port CONTAINER [PRIVATE_PORT[/PROTO]]

實例

docker port cbe08f2a4406            # 查看容器ID為cbe08f2a4406的端口映射情況

stats

docker stats : 顯示容器資源使用情況統計信息的實時流

語法

docker stats (-$) [CONTAINER...]

選項:

    -a,--all  		        顯示所有容器(默認顯示剛剛運行)
    
    --format		        使用Go模板的漂亮打印圖像
    
    --no-stream		        禁用流式統計信息並僅提取第一個結果
    
    --no-trunc		        不要截斷輸出

實例

docker stats                # 運行docker stats查看Linux后台程序運行的所有容器

如果未使用指定格式字符串--format,則會顯示以下列。

列名 描述
CONTAINER IDName 容器的ID和名稱
CPU %MEM % 容器正在使用的主機CPU和內存的百分比
MEM USAGE / LIMIT 容器正在使用的總內存,以及允許使用的內存總量
NET I/O 容器通過其網絡接口發送和接收的數據量
BLOCK I/O 容器從主機上的塊設備讀取和寫入的數據量
PIDs 容器創建的進程或線程數

注:更多示例可點擊上方官網鏈接查看

容器生命周期管理

run

docker run :創建一個新的容器並運行一個命令

注:由於該命令的選項高達99項,所以本節只選用了常用的一些選項,詳情可參見官網

語法

docker run (-$) IMAGE [COMMAND] [ARG...]   

選項:


    -a, --attach=[]         指定標准輸入輸出內容類型,可選 STDIN/STDOUT/STDERR 三項,用於登錄容器(必須是以docker run -d啟動的容器)
    
    -d                      后台運行容器,並返回容器ID,默認為false     

    -i                      打開STDIN,以交互模式運行容器,通常與 -t 同時使用,默認為false  

    -P, --publish-all=false 隨機端口映射,容器內部端口隨機映射到主機的各端口 

    -p, --publish=[]        指定容器暴露的端口,格式為:主機(宿主)端口:容器端口
    
    -t,--tty                為容器重新分配一個偽輸入終端TTY,從而可以支持終端登錄,通常與 -i 同時使用默認為false   
    
    --name=""               指定容器名字,links特性需要使用名字   
    
    -u, --user=""           指定容器的用戶   

    -w                      指定容器的工作目錄  

    -c                      設置容器CPU權重,在CPU共享場景使用    

    -e, --env=[]            指定環境變量,容器中可以使用該環境變量   

    -m                      指定容器的內存上限    

    -h                      指定容器的主機名    

    -v, --volume=[]         給容器掛載存儲卷,掛載到容器的某個目錄  
    
    --volumes-from=[]       給容器掛載其他容器上的卷,掛載到容器的某個目錄 

    --cap-add=[]            添加權限

    --cap-drop=[]           刪除權限

    --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時使用 

    --net="bridge"          指定容器的網絡連接類型:
    
                            bridge 使用docker daemon指定的網橋
                       
                            host    //容器使用主機的網絡
                       
                            container:NAME_or_ID >//使用其他容器的網路共享IP和PORT等網絡資源
                           
                            none 容器使用自己的網絡(類似--net=bridge)
        
    --privileged=false      指定容器是否為特權容器,特權容器擁有所有的權限
        
    --restart="no"          指定容器停止后的重啟策略:
        
                            no:            容器退出時不重啟(默認策略)
                            
                            on-failure:    容器故障退出(返回值非零)時重啟
                                                        
                                on-failure:3,在容器非正常退出時重啟容器,最多重啟3次
                                
                            always:        容器退出時總是重啟
                            
                            unless-stopped: 在容器退出時總是重啟容器,但是不考慮在Docker守護進程啟動時就已經停止了的容器
                            
    --rm=false              指定容器停止后自動刪除容器(不支持以docker run -d啟動的容器) 
        
    --sig-proxy=true        設置由代理接受並處理信號,SIGCHLD,SIGSTOP和SIGKILL不代

擴展說明: 容器的退出狀態碼
docker run的退出狀態碼如下:

  • 0,表示正常退出
  • 非0,表示異常退出(退出狀態碼采用chroot標准)
    • 125,Docker守護進程本身的錯誤
    • 126,容器啟動后,要執行的默認命令無法調用
    • 127,容器啟動后,要執行的默認命令不存在
    • 其他命令狀態碼,容器啟動后正常執行命令,退出命令時該命令的返回狀態碼作為容器的退出狀態碼

實例

使用docker鏡像nginx:latest以后台模式啟動一個容器,並將容器命名為mynginx。

docker run --name mynginx -d nginx:latest

使用鏡像nginx:latest以后台模式啟動一個容器,並將容器的80端口映射到主機隨機端口。

docker run -P -d nginx:latest

使用鏡像 nginx:latest,以后台模式啟動一個容器,將容器的 80 端口映射到主機的 80 端口,主機的目錄 /data 映射到容器的 /data。

docker run -p 80:80 -v /data:/data -d nginx:latest

綁定容器的 8080 端口,並將其映射到本地主機 127.0.0.1 的 80 端口上。

docker run -p 127.0.0.1:80:8080/tcp ubuntu bash

使用鏡像nginx:latest以交互模式啟動一個容器,在容器內執行/bin/bash命令。

docker run -it nginx:latest /bin/bash

擴展知識點容器卷共享
Data Volumes:volume是在一個或多個容器里指定的特殊目錄

  • 數據卷可以在容器間共享和重復使用
  • 可以直接修改容器卷的數據
  • 容器卷里的數據不會被包含到鏡像中
  • 容器卷保持到沒有容器再使用它

可以將容器卷掛載到宿主機目錄或宿主機的文件上,<容器目錄或文件>的內容會被替換為<宿主機目錄或文件>的內容,默認容器對這個目錄有可讀寫權限

docker run -d -P --name web -v <宿主機目錄>:<容器目錄> training/webapp python app.py

可以通過指定ro,將權限改為只讀:

docker run -d -P --name web -v <宿主機目錄>:<容器目錄>:ro training/webapp python app.py

在一個容器創建容器卷后,其他容器便可以通過--volumes-from共享這個容器卷數據,如下:

docker run -d -v /dbdata --name db1 training/postgres echo Data-only container for postgres

首先啟動了一個容器,並為這個容器增加一個數據卷/dbdata,然后啟動另一個容器,共享這個數據卷

docker run -d --volumes-from db1 --name db2 training/postgres

此時db2使用了db1的容器卷,當容器db1被刪除時,容器卷也不會被刪除,只有所有容器不再使用此容器卷時,才會被刪除

docker rm -v:刪除容器卷

除了共享數據外,容器卷另一個作用是用來備份、恢復和遷移數據

docker run --volumes-from db1 -v /home/backup:/backup ubuntu tar cvf /backup/backup.tar /dbdata

啟動一個容器數據卷使用db1容器的數據卷,同時新建立一個數據卷指向宿主機目錄/home/backup,將/dbdata目錄的數據壓縮為/backup/backup.tar

docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
docker run --volumes-from dbdata2 -v /home/backup:/backup busybox tar xvf /backup/backup.tar            # 啟動一個容器,同時把backup.tar的內容解壓到容器的backup

start/stop/restart

docker start :啟動一個或多個已經被停止的容器

docker stop :停止一個運行中的容器

docker restart :重啟容器

語法

docker start (-$) CONTAINER [CONTAINER...]

選項:

    --attach , -a                   連接STDOUT / STDERR並轉發信號
    
    --checkpoint                    從此檢查點恢復

    --checkpoint-dir                使用自定義檢查點存儲目錄

    --detach-keys                   覆蓋用於分離容器的鍵序列
    
    --interactive , -i              附上容器的STDIN

docker stop (-$) CONTAINER [CONTAINER...]

選項:

    --time , -t                     在殺死之前等待停止的秒數,默認10秒

docker restart (-$) CONTAINER [CONTAINER...]

選項:

    --time , -t                     在殺死之前等待停止的秒數,默認10秒

kill

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

語法

docker kill (-$) CONTAINER [CONTAINER...]

選項:

    -s,--signal                     向容器發送一個信號, 強制中斷 -s代表指定SIGINT信號類型,默認“kill”

實例

docker kill -s KILL mynginx         # 殺掉運行中的容器mynginx 
docker kill $(docker ps -p -a)      # 殺死所有正在運行的容器

注:此小節的-s牽扯到Linux的信號,如需了解詳情,可點擊此處查看

rm

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

語法

docker rm (-$) CONTAINER [CONTAINER...]

選項:

    -f  --force=false             通過SIGKILL信號強制刪除一個運行中的容器   


    -l  --link=false              移除容器間的網絡連接,而非容器本身,保留底層容器  


    -v   --volumes=false           刪除與容器關聯的卷

實例

docker rm -l db                     # 移除容器nginx01對容器db01的連接,連接名db
docker rm -v nginx01                # 刪除容器nginx01,並刪除容器掛載的數據卷
docker rm -f `'docker ps -a -q'`    # 強制刪除所有容器
docker rm $(docker ps -aq -n=5)     # 批量刪除最近5個容器
docker rm `docker ps -a -f status=exited`       # 刪除非運行的容器
docker rm `docker ps -a | grep Exited | awk'{print $1}'`    # 刪除異常退出的容器
docker stop $(docker ps -q) & docker rm $( docker ps -aq )      # 停用並刪除容器

移除指定鏡像創建的容器:

docker rm $(docker ps -a | grep "watch-the-fun/jdk:8" | awk '{print $1}')
命令拆分解釋:
|                           為管道符,主要作用為將前一命令的執行結果做為參數傳入后一個命令

docker ps -a                查詢所有創建的容器(包含未啟動)

grep "watch-the-fun/jdk:8"  過濾鏡像名為watch-the-fun/jdk:8的記錄

awk '{print $1}'            按行查找記錄中的第1列,該列為容器的id

$()                         用作命令替換

注:更多示例和詳細講解可點擊上方官網鏈接或是用--help命令查看

pause/unpause

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

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

語法

docker pause CONTAINER [CONTAINER...]

docker unpause CONTAINER [CONTAINER...]

實例:

docker pause db01 # 暫停數據庫容器db01提供服務

docker unpause db01 # 恢復數據庫容器db01提供服務

create

docker create :創建一個新的容器但不啟動它 (用法同 docker run)

語法 (語法同 docker run)

docker create (-$) IMAGE [COMMAND] [ARG...]

實例

docker create  --name myrunoob  nginx:latest    # 使用docker鏡像nginx:latest創建一個容器,並將容器命名為myrunoob 

exec

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

語法

docker exec (-$) CONTAINER COMMAND [ARG...]

選項:

    -d,--detach                 分離模式: 在后台運行命令

    -i,--interactive            即使沒有連接,也要保持STDIN打開

    -t,--tty                    分配一個偽終端(TTY)
    
    --detach-keys               覆蓋用於分離容器的鍵序列
    
    -e,--env                    設置環境變量
    
    --privileged                為命令提供擴展權限
    
    --user , -u                 用戶名或UID(格式:<name | uid> [:<group | gid>])
    
    -w,--workdir                容器內的工作目錄

實例

docker exec -it mynginx /bin/sh /root/runoob.sh     # 在容器mynginx中以交互模式執行容器內/root/runoob.sh腳本
docker exec -it  mynginx /bin/bash                  # 在容器 mynginx 中開啟一個交互模式的終端
docker exec -it 9df70f9a0714 /bin/bash              # 通過 exec 命令對ID為9df70f9a0714的容器執行 bash

注:該命令是以交互式的方式進入某個容器(使用exit退出后容器不停止運行),更多詳解參見官網

update

docker update : 更新一個或多個容器的配置

語法

docker update (-$) CONTAINER [CONTAINER...]

選項:

    --blkio-weight          阻止IO(相對權重),介於10和1000之間,或0阻止(默認為0)
    
    --cpu-period            限制CPU CFS(完全公平計划程序)期間
    
    --cpu-quota             限制CPU CFS(完全公平調度程序)配額
    
    --cpu-rt-period         限制CPU實時周期(以微秒為單位)

    --cpu-rt-runtime		以微秒為單位限制CPU實時運行時間

    --cpu-shares , -c		CPU份額(相對權重)
    
    --cpus		            CPU數量

    --cpuset-cpus		    允許執行的CPU(0-3,0,1)
    
    --cpuset-mems		    允許執行的MEM(0-3,0,1)
    
    --kernel-memory		    內核內存限制
    
    --memory , -m		    內存限制
    
    --memory-reservation	內存軟限制
    
    --memory-swap		    交換限制等於內存加交換:' - 1以啟用無限制交換
    
    --restart		        重新啟動容器退出時應用的策略

實例

更新容器的cpu-shares

要將容器的cpu-shares限制為512,請首先標識容器名稱或ID。您可以使用它docker ps來查找這些值。您還可以使用從docker run命令返回的ID 。然后,執行以下操作:

docker update --cpu-shares 512 abebf7571666

使用cpu-shares和內存更新容器

要為多個容器更新多個資源配置:

docker update --cpu-shares 512 -m 300M abebf7571666 hopeful_morse

注:更多示例可點擊上方官網鏈接查看

容器rootfs命令

commit

docker commit :從容器創建一個新的鏡像。

語法

docker commit (-$) CONTAINER [REPOSITORY[:TAG]]

選項:

    -a,--author=""          作者

    -c,--change             使用Dockerfile指令來創建鏡像
    
    -m,--message=""         簡要說明

    -p,--pause=true         在提交期間暫停容器

實例

將容器a404c6c174a2 保存為新的鏡像,並添加提交人信息和說明信息。

runoob@runoob:~$ docker commit -a "runoob.com" -m "my apache" a404c6c174a2  mymysql:v1 
sha256:37af1236adef1544e8886be23010b66577647a40bc02c0885a6600b33ee28057
runoob@runoob:~$ docker images mymysql:v1
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mymysql             v1                  37af1236adef        15 seconds ago      329 MB

cp

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

語法

docker cp (-$) CONTAINER:SRC_PATH DEST_PATH|-

docker cp (-$) SRC_PATH|- CONTAINER:DEST_PATH

選項:

    -a,--archive 		    存檔模式(復制所有uid / gid信息)
    
    -L,--follow-link        保持源目標中的鏈接

實例

docker cp /data/runoob 96f7f14e99ab:/data/    # 將主機/data/runoob目錄拷貝到容器96f7f14e99ab的/data目錄下
docker cp /data/runoob 96f7f14e99ab:/data     # 將主機/data/runoob目錄拷貝到容器96f7f14e99ab中,目錄重命名為data
docker cp  96f7f14e99ab:/data /tmp/          # 將容器96f7f14e99ab的/data目錄拷貝到主機的/tmp目錄中

diff

docker diff : 檢查容器文件系統上文件或目錄的更改

語法

docker diff CONTAINER

擴展說明
自容器創建以來,列出容器文件系統中已更改的文件和目錄。跟蹤三種不同類型的變化:

符號 描述
A 添加了文件或目錄
D 文件或目錄已刪除
C 文件或目錄已更改

實例

docker diff mymysql                 # 查看容器mymysql的文件結構更改

rename

docker rename : 重命名一個容器

語法

docker rename CONTAINER NEW_NAME

docker管理命令

Docker除了提供上面的使用命令外,還提供了一系列的管理命令,分別如下

    builder         管理構建
    config          管理Docker配置
    container       管理容器
    engine          管理docker引擎
    image           管理鏡像
    network         管理網絡
    node            管理Swarm節點
    plugin          管理插件
    secret          管理Docker secrets
    service         管理服務
    stack           管理Docker堆棧
    swarm           管理Swarm集群
    system          查看系統信息
    trust           管理對Docker鏡像的信任
    volume          管理卷

我們不必對上述的這些所有命令都了如指掌,因為那太浪費時間了,但我們可以知道他們都有什么作用,在需要時去官網查看就可以了

常用的管理命令

docker network ls           # 查看網絡列表
docker service ls           # 查看swarm service列表
docker image prune          # 刪除所有未被 tag 標記和未被容器使用的鏡像
docker image prune -a       # 刪除所有未被容器使用的鏡像
docker container prune      # 刪除所有停止運行的容器
docker volume prune         # 刪除所有未被掛載的卷
docker network prune        # 刪除所有網絡
docker system prune         # 刪除 docker 所有資源

修剪鏡像:

docker system prune -a

Docker選項

docker (-$)

選項:

    --api-enable-cors=false                 在遠程API中啟用CORS 頭
    
    -b, --bridge=""                         橋接網絡 使用“none” 禁用容器網絡
    
    --bip=""                                網橋模式        
    
    -d, --daemon=false                      守護者模式
    
    -D, --debug=false                       debug 模式
    
    --dns=[]                                強制 docker 使用指定 dns 服務器
    
    --dns-search=[]                         強制 docker 使用指定 dns 搜索域
    
    -e, --exec-driver="native"              強制 docker 運行時使用指定執行驅動器
    
    --fixed-cidr=""                         固定IP的IPv4子網(例:10.20.0.0/16)必須鑲套在橋子網中(由-b or --bip定義)                                         
    
    -G, --group="docker"                    當在守護模式中運行時,組指向-H指定的unix套接字。使用""禁用組設置。
        
    -g, --graph="/var/lib/docker"           容器運行的根目錄路徑
    
    -H, --host=[]                           套接字綁定到守護模式。使用一個或多個tcp://主機:端口,unix:///路徑/到/套,fd://*或fd://socketfd.
        
    --icc=true                              inter-container跨容器通信
    
    --insecure-registry=[]                  使用指定的注冊表啟用不安全通信(沒有HTTPS的證書驗證和啟用HTTP回退)(例如,localhost:5000或10.20.0 /16)
    
    --ip="0.0.0.0"                          綁定容器端口時使用的IP地址

    --ip-forward=true                       使用net.ipv4.ip_forward轉發
    
    --ip-masq=true                          使IP偽裝成橋的IP范圍
    
    --iptables=true                         啟用Docker添加iptables規則
    
    --mtu=0                                 設置容器網絡mtu
    
    -p, --pidfile="/var/run/docker.pid"     指定守護進程pid文件位置
    
    --registry-mirror=[]                    指定一個首選的鏡像倉庫(加速地址)                 
    -s, --storage-driver=""                 強制 docker 運行時使用指定存儲驅動
    
    --selinux-enabled=false                 開啟 selinux 支持
    
    --storage-opt=[]                        設置存儲驅動選項
    
    --tls=false                             開啟 tls
    
    --tlscacert="/root/.docker/ca.pem"      只信任提供CA簽名的證書
    
    --tlscert="/root/.docker/cert.pem"      tls 證書文件位置
    
    --tlskey="/root/.docker/key.pem"        tls key 文件位置
    
    --tlsverify=false                       使用 tls 並確認遠程控制主機
    
    -v, --version=false                     輸出 docker 版本信息

更改端口號映射

運行中的容器無法映射新的端口號,也無法更改端口號映射,但可以通過兩種方法解決

  1. iptable轉發端口

查看容器ip

docker inspect 36afde543eb5 | grep IPAddress

查詢結果:

"IPAddress": "172.17.0.2"

將主機的8081端口映射到宿主機的8080端口

iptables -t nat -A  DOCKER -p tcp --dport 8081 -j DNAT --to-destination 172.17.0.2:8080
  1. 先提交容器為鏡像,再運行這個容器,同時指定新的端口映射

提交容器為鏡像

docker commit 9995ffa15f46  mycentos:0.1

停止舊的容器

docker stop 9995ffa15f46

重新從舊的鏡像啟動容器

docker run -i -t  -p 8081:8080  mycentos:0.1

推薦

推薦一個對Docker原理講解的比較透徹的一篇文章:
https://blog.csdn.net/omnispace/article/details/79778544


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM