【Docker】第三篇 Docker容器管理

旅行者-Travel發表於2018-09-21

一、Docker容器概述:

  • 簡單理解容器是映象的一個例項。
  • 映象是靜態的只讀檔案,而容器的執行需要可寫檔案層。

二、建立容器

[root@web130 ~]# docker create -it ubuntu:latest    #-i開啟標準輸入,-t是開啟一個偽終端
17c54a92a4e83503e329c3c80e4d10bf298516edffa56b2cea8fa2aa73d4c00c

#我們要了解一下容器識別符號:如上顯示的CONTAINER ID作為容器的唯一標識。
#CONTAINER ID 預設是128位,但是一般16位就足以保證其在本機的唯一性。所以預設我們使用簡約形式即可(id的前16位)。
#當然我們也可以根據自己情況選擇適當的位數,來代表容器啟停

[root@web130 ~]# docker ps -a  #顯示所有容器,#docker ps 顯示正在執行的容器。#docker ps --no-trunc輸出資訊不截斷顯示,可以看到完整id

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 17c54a92a4e8 ubuntu:latest
"/bin/bash" 8 seconds ago Created quizzical_bhabha

1、檢視docker執行的程式:

[root@web130 ~]# docker container ls  #新命令等價與下邊ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@web130 ~]# docker ps #可以看到已經啟動的容器、每個容器的ID、所使用的映象、建立時間、當前狀態、監聽的埠和容器的名字
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@web130 ~]# 

2、啟動容器:

#我們可以通過容器ID不同的前幾位id號來代表指定在容器,也可以用全部ID號

[root@web130 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS               NAMES
17c54a92a4e8        ubuntu:latest       "/bin/bash"         6 minutes ago       Created                                       quizzical_bhabha
[root@web130 ~]# docker start 17
17
[root@web130 ~]# docker ps    #可以看到已經啟動的容器、每個容器的ID、所使用的映象、建立時間、當前狀態、監聽的埠和容器的名字
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
17c54a92a4e8        ubuntu:latest       "/bin/bash"         8 minutes ago       Up About a minute                       quizzical_bhabha
[root@web130 ~]# 

3、新建並啟動一個容器

**docker run在建立容器的時候,在後臺執行的標準操作如下:

  1. 檢查本地是否有指定映象,如果沒有直接從公有倉庫下載;
  2. 利用映象建立一個容器,並啟動該容器;
  3. 分配一個檔案系統,並在只讀的映象層外邊掛載一層可讀寫層;
  4. 從宿主主機配置的網橋介面中橋接一個虛擬介面到容器中;
  5. 執行使用者指定的應用程式;
  6. 執行完畢後容器制動終止。
[root@web130 ~]# docker run ubuntu /bin/echo `hello world`
hello world
[root@web130 ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
17c54a92a4e8        ubuntu:latest       "/bin/bash"         13 minutes ago      Up 6 minutes                            quizzical_bhabha
[root@web130 ~]#
#**啟動一個bash終端,允許使用者互動
[root@web130 ~]# docker run -it ubuntu:14.04 /bin/bash
root@041941f24d3d:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@041941f24d3d:/# pwd
/
root@041941f24d3d:/# ps     #可以看到容器只執行了一個bash應用,並沒有執行其他無關程式
   PID TTY          TIME CMD
     1 pts/0    00:00:00 bash
    15 pts/0    00:00:00 ps
root@041941f24d3d:/# exit   #退出容器,或者Ctrl+d
exit
[root@web130 ~]# 
#我們可以加上--rm選項,--name選項,容器退出時,自動刪除容器
[root@web130 ~]# docker run -it --rm ubuntu:14.04 /bin/bash
[root@web130 ~]# docker run --name t1 -it --rm ubuntu:14.04 /bin/bash  #指定容器名

某些情況下,docker run 容器執行錯誤,預設情況下常見錯誤碼:
#125:Docker daemon執行錯誤,例如指定不支援的Docker命令引數;
#126:所指定命令無法執行,例如許可權出錯;
#127:容器內命令無法找到。
命令執行錯誤會返回錯誤碼

4、容器守護態(Daemonized)執行

#一些時候讓容器在後臺執行,用引數-d 來實現
[root@web130 ~]# docker run -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done"
da81dbb0e2dadde799ca4d40189c3d14911ea269f76ce7843f9d585d7efbcd6a
[root@web130 ~]# 

[root@web130 ~]# docker ps     #可以看到執行的容器,當然我們也可以上條命令中--name 指定容器名字,便於識別
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
da81dbb0e2da        ubuntu              "/bin/sh -c `while t…"   14 seconds ago      Up 12 seconds                           festive_mirzakhani
17c54a92a4e8        ubuntu:latest       "/bin/bash"              42 minutes ago      Up 34 minutes                           quizzical_bhabha
[root@web130 ~]# docker logs da8
hello world
hello world
hello world
....省略....

三、終止容器

stop和kill命令的區別:
*stop是首先傳送SIGTERM訊號,等一段時間(預設10秒),在傳送SIGKILL訊號終止容器
*kill直接傳送SIGKILL終止容器,強制終止容器
[root@web130 ~]# docker stop da8  #可以-t 指定等待時間,
da8
[root@web130 ~]# docker ps      #檢視啟動的容器
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
17c54a92a4e8        ubuntu:latest       "/bin/bash"         45 minutes ago      Up 38 minutes                           quizzical_bhabha
[root@web130 ~]# docker ps -a   #檢視所有容器
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
da81dbb0e2da        ubuntu              "/bin/sh -c `while t…"   4 minutes ago       Exited (137) 13 seconds ago                       festive_mirzakhani
041941f24d3d        ubuntu:14.04        "/bin/bash"              19 minutes ago      Exited (0) 19 minutes ago                         nervous_jepsen
439157f8ea55        ubuntu              "/bin/echo `hello wo…"   33 minutes ago      Exited (0) 33 minutes ago                         vigorous_boyd
[root@web130 ~]# docker ps -qa  #檢視所有容器ID
da81dbb0e2da
041941f24d3d
439157f8ea55
[root@web130 ~]# docker start da8   #啟動指定容器
[root@web130 ~]# docker restart da8 #將一個執行的容器先終止,然後在重啟啟動它

四、進入容器

#前文-d我們將容器放在後臺執行,無法操作也無法看到容器中的資訊,如何進入一個後臺執行的容器,方法如下:

1、attach命令
[root@web130 ~]# docker run --name ylt -itd ubuntu   #建立一個名字為ylt的容器
7058cf192514f4a6de3340d86d61d6f2dbea0503f85ae35634fb2511cc026f6d  
[root@web130 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NMES
7058cf192514        ubuntu              "/bin/bash"         6 seconds ago       Up 6 seconds                            ylt
[root@web130 ~]# docker attach ylt   #進入後臺執行的容器
root@7058cf192514:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@7058cf192514:/# 

注:當多窗同時通過attach命令連到容器的時候,所有視窗會同步顯示。當某個視窗阻塞的時候,其他視窗無法執行命令
當一個視窗exit容器的時候另個也會退出。
2、exec命令,最推薦的一種方式
#docker從1.3.0版本起提供了更加方便的exec命令,可以在容器內直接執行任意命令,同時如果多視窗執行,不會出現attach的問題:
[root@web130 ~]# docker start ylt      #啟動容器
ylt
[root@web130 ~]# docker exec -it 7058cf192514  /bin/bash   #進入容器,可以多視窗執行
root@7058cf192514:/# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
root@7058cf192514:/# exit
[root@web130 ~]# 
3、nsenter工具需要安裝,此處不詳細介紹

五、刪除容器

#docker rm 刪除一個終止的容器
#docker rm -f 可以強制刪除一個正在執行容器

[root@web130 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                           PORTS               NAMES
7058cf192514        ubuntu              "/bin/bash"              19 minutes ago      Up 7 minutes                                         ylt
da81dbb0e2da        ubuntu              "/bin/sh -c `while t…"   41 minutes ago      Exited (137) 37 minutes ago                          festive_mirzakhani
041941f24d3d        ubuntu:14.04        "/bin/bash"              About an hour ago   Exited (0) About an hour ago                         nervous_jepsen
[root@web130 ~]# docker rm 041941f24d3d 
[root@web130 ~]# docker ps     #我們可以看到剛才啟動的容器
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
7058cf192514        ubuntu              "/bin/bash"         22 minutes ago      Up 10 minutes                           ylt
17c54a92a4e8        ubuntu:latest       "/bin/bash"         About an hour ago   Up About an hour                        quizzical_bhabha
[root@web130 ~]# docker rm ylt #執行中的容器無法刪除
Error response from daemon: You cannot remove a running container 7058cf192514f4a6de3340d86d61d6f2dbea0503f85ae35634fb2511cc026f6d. Stop the container before attempting removal or force remove
[root@web130 ~]# docker rm -f ylt   #可以強制刪除執行中的容器,直接傳送的是SIGKILL訊號
ylt
[root@web130 ~]# 
[root@web130 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
17c54a92a4e8        ubuntu:latest       "/bin/bash"         About an hour ago   Up About an hour                        quizzical_bhabha
[root@web130 ~]# 

六、匯入和匯出容器

#其實就是一個容器遷移的過程,不用考慮容器是否為執行狀態

1、匯出容器可以使用-o,或者輸出重定向“>”
[root@web130 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                           PORTS               NAMES
da81dbb0e2da        ubuntu              "/bin/sh -c `while t…"   About an hour ago   Exited (137) 44 minutes ago                          festive_mirzakhani
041941f24d3d        ubuntu:14.04        "/bin/bash"              About an hour ago   Exited (0) About an hour ago                         nervous_jepsen
[root@web130 ~]# docker export -o test_docker_run.tar da8 #-o
[root@web130 ~]# ls |grep test_docker*
test_docker_run.tar
[root@web130 ~]# docker export 041 >test_docker_stop.tar  #輸出重定向
[root@web130 ~]# ls |grep test_docker
test_docker_run.tar
test_docker_stop.tar
[root@web130 ~]# 
2、匯入容器
#匯出的檔案可以使用docker import 命令匯入變成映象,該命令格式為:
[root@web130 ~]# cat test_docker_run.tar |docker import - test/ubuntu:v1.0
sha256:7528eea6db23ec008244e9f65205421fcaa164748054b25dbae1a00f84582b66
[root@web130 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test/ubuntu         v1.0                7528eea6db23        13 seconds ago      69.8MB
#通過指定 URL 或者某個目錄來匯入
[root@web130 ~]#docker import http://example.com/exampleimage.tgz test/ubuntu:v1.0

 

相關文章