1. 程式人生 > 其它 >docker container/容器相關命令

docker container/容器相關命令

容器相關命令

建立容器

使用 docker create [option] 命令建立一個容器,例如

$ docker create -it ubuntu:18.04

d25d8252253ad10f5c26dbc0b0bdf74b5135eb2eea539d196656d81a9061c0d2

# docker ps -a 檢視容器
$ docker ps -a 
CONTAINER ID   IMAGE                         COMMAND                  CREATED          STATUS                      PORTS                                           NAMES
d25d8252253a   ubuntu:18.04                  "bash"                   24 seconds ago   Created                                                                     compassionate_black

新建的容器,status = Create,處於停止狀態,可以使用 docker start 命令啟動它。

create 命令常用的可選的引數有

  • -a:是否繫結到標準輸入、輸出和錯誤
  • -d:是否在後臺執行容器,預設為否
  • -i:保持標準輸入開啟,預設為false
  • -P:是容器內部埠隨機對映到主機的某埠
  • -p:指定對映到本地埠,例如,-p 11234-11240:1234-1240
  • -t:是否分配一個偽終端,預設為false
  • -v:掛載主機上的檔案捲到容器內
  • --name:為容器指定名稱

啟動容器

使用 docker start container-id/container-name 命令啟動一個剛剛建立的容器 ,例如

$ docker start d25d8252253a

d25d8252253a

$ docker ps
CONTAINER ID   IMAGE          COMMAND   CREATED          STATUS          PORTS     NAMES
d25d8252253a   ubuntu:18.04   "bash"    13 minutes ago   Up 54 seconds             compassionate_black

啟動容器後,可以使用 docker ps 命令檢視到容器 d25d8252253a 狀態已經變成了啟動

新建並啟動容器

命令 docker run 命令等同於先執行 docker create 再執行 docker start。例如,使用下面的命令輸出 Hello World!,之後容器會自動停止。

$ docker run ubuntu /bin/echo 'Hello World!'
Hello World!

$ docker ps -a
docker ps -a
CONTAINER ID   IMAGE                         COMMAND                  CREATED          STATUS                      PORTS                                           NAMES
e5f5b35152ed   ubuntu:18.04                  "/bin/echo 'Hello Wo…"   10 seconds ago   Exited (0) 9 seconds ago                                                    stoic_elion
d25d8252253a   ubuntu:18.04                  "bash"                   18 minutes ago   Up 5 minutes                                                                compassionate_black

可以看到剛剛執行 echo 命令的容器,狀態已經變成了 Exited

使用 docker run 命令,是按照以下的執行流程

  1. 如果映象不存在,會先從共有倉庫下載映象
  2. 分配一個檔案系統給容器,並在只讀映象層外掛載一層可讀寫層
  3. 從宿主主機的配置的網橋介面中橋接一個虛擬介面到容器中
  4. 從網橋的地址池中分配一個ip給容器
  5. 執行使用者指定的應用程式
  6. 執行完畢容器自動停止

下面的命令,啟動一個 bash 終端,允許使用者進行互動

$ docker run -it ubuntu:18.04 /bin/bash
root@6b4389195232:/#

# -t:分配一個偽終端
# -i:保持標準輸入開啟
# 可以輸入 Ctrl+d 或輸入 exit 命令來退出程式

檢視容器輸出

使用 docker logs 命令獲取容器輸出,例如

$ docker logs e5f5b35152ed
Hello World!

$ docker logs 6b4389195232
root@6b4389195232:/# man docker-run
bash: man: command not found
root@6b4389195232:/# exit
exit
root@6b4389195232:/# pwd
/
root@6b4389195232:/# ls
bin  boot  dev  etc  home  lib  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@6b4389195232:/# ps
  PID TTY          TIME CMD
    1 pts/0    00:00:00 bash
   13 pts/0    00:00:00 ps
root@6b4389195232:/# exit

支援以下選項

  • --details:列印詳細資訊
  • -f:保持持續輸出
  • --since string:輸出某個時間開始的日誌,例如 --since 2021-01-01
  • --tail string:輸出最近的若干日誌,例如 --tail 2
  • -t:顯示時間戳資訊
  • --until string:輸出某個時間之前的日誌

停止容器

暫停容器

例如,啟動一個容器,將其暫停

$ docker run --name test --rm -it ubuntu bash 
root@6d65107c8001:/#

# 開啟一個新終端
$ docker pause test
test

# docker ps 檢視
docker ps
CONTAINER ID   IMAGE          COMMAND   CREATED             STATUS                   PORTS     NAMES
6d65107c8001   ubuntu:18.04   "bash"    28 seconds ago      Up 27 seconds (Paused)             test

可以看到容器是啟動並且暫停狀態,且第一個終端無法處於無法輸入的狀態

# 使用該命令恢復暫停的容器
$ docker unpause test

恢復後,終端1恢復到可以輸入的正常狀態

終止容器

可以使用 docker stop[-t|--time[=10] 來終止一個執行的容器,該命令會首先向容器傳送 SIGTERM 訊號,等待一段時間後(預設為10秒),再發送 SIGKILL 訊號來終止容器,例如

$ docker stop test
test

此外,可以使用 docker kill 直接傳送 SIGKILL 訊號來強行終止容器,docker restart 會先終止容器,再啟動容器

進入容器

在啟動容器時,使用 -d 選項,會使容器在後臺執行,使用者無法看到容器內的輸入也無法進行操作,這是有兩個命令可以進入容器,分別是 attach 和 exec 名命令

  1. attach 命令

    $ docker attach [option] container
    

    這個命名主要支援三個選項,非別是:

    • --detach-keys=[]:指定退出 attach 模式的快捷鍵序列,預設是 ctrl + q 和 ctrl + p
    • --no-stdin=true|false:是否關閉標準輸入,預設是false
    • --sig-proxy=true|false:是否代理收到的系統訊號給應用程序,預設為true

    attach 有一個特點,當多個視窗使用 attach 進入同一個容器時,所有的視窗都會同步顯示,當一個建立因為命令阻塞了,所有的視窗都會無法操作

  2. exec 命令

    $ docker exec [option] container
    

    比較重要的選項有

    • -d:在容器後臺執行命令
    • --detack-keys="":指定容器切回後臺的按鍵
    • -e,--env=[]:指定環境變了列表
    • -i:開啟標準輸入接收使用者輸入的命令,預設為 false
    • --privileged=true|false:是否給執行命令以最高許可權,預設false
    • -t:分配偽終端
    • -t,--user:執行命令的使用者名稱

    例如,進入剛剛建立的容器

    $ docker run --name test -itd ubuntu:18.04
    1647d13558f7d8b7a03f7abbc27414e6f7befa5a6c64a3257210f6755fdcadc6
    
    $ docker exec -it test bash
    root@1647d13558f7:/#
    

刪除容器

使用 docker [container] rm [option] 命令來刪除容器

支援的選項有

  • -f:強制刪除執行中的容器,會先發送 SIGKILL 訊號給容器,再進行刪除
  • -l:刪除容器的連線,但保留容器
  • -v:刪除容器掛載的資料卷

例如

$ docker create --name ubuntu-1 -it ubuntu:18.04
daf29b04546cbc2ce21b397c8ebbdec92458a6b40361fe1e3c6cc457a76cb5f8

$ docker rm ubuntu-1
ubuntu-1

匯入和匯出容器

匯出容器

匯出容器,是把一個已經建立的容器匯出到一個檔案中,命令為

$ docker export -o outputfile container

例如

$ create --name ubuntu-1 -it ubuntu:18.04
6294e0db7bf07f0a7e08f098bb44109e5635ec7e959b8340eb822f6236b2a66f

$ export -o ubuntu-1.tar ubuntu-1
$ ls -lh
-rw-------   1 linchangkun  staff    56M 10 21 00:36 ubuntu-1.tar

匯入容器

將匯出的容器,可以複製到其他的機器上,匯入後會變為映象,命令為

$ docker import file REPOSITORY[:TAG]

例如

$ docker import ubuntu-1.tar test/u:0.1
sha256:9036cbb933c7dfa3e8e96ec1c5d54b55a9374930089a15198471903e506a6208

$ docker images
REPOSITORY              TAG           IMAGE ID       CREATED         SIZE
test/u                  0.1           9036cbb933c7   3 minutes ago   56.6MB

匯出容器再匯入成為映象,會丟失元資訊和歷史

檢視容器

  1. 檢視容器詳情

    使用 docker inspect container 檢視容器詳情,會以 json 格式返回容器id、建立時間、路徑、狀態等資訊

    $ docker inspect ubuntu-1
    [
        {
            "Id": "6294e0db7bf07f0a7e08f098bb44109e5635ec7e959b8340eb822f6236b2a66f",
            "Created": "2021-10-20T16:35:38.685585044Z",
            "Path": "bash",
            "Args": [],
            "State": {
                "Status": "exited",
                "Running": false,
                "Paused": false,
                "Restarting": false,
                "OOMKilled": false,
                ......
    
  2. 檢視容器內程序

    使用 docker top container 檢視容器內程序

    $ docker top ubuntu-1
    UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
    root                3612                3587                0                   07:46               ?                   00:00:00            bash
    root                3650                3612                0                   07:46               ?                   00:00:00            top
    
  3. 檢視統計資訊

    使用 docker stats container 可以檢視統計資訊,會顯示cpu、記憶體、儲存、網路等使用情況的統計資訊

    $ docker stats ubuntu-1
    CONTAINER ID   NAME       CPU %     MEM USAGE / LIMIT    MEM %     NET I/O       BLOCK I/O   PIDS
    6294e0db7bf0   ubuntu-1   0.00%     1.27MiB / 1.942GiB   0.06%     1.16kB / 0B   0B / 0B     2
    

其他容器命令

複製檔案

使用 docker cp 可以在容器和物理機之間複製檔案

$ ll
total 354488
-rw-r--r--  1 linchangkun  staff     0B 10 24 15:54 2.txt

# 複製本地檔案到容器
$ docker cp ./2.txt ubuntu-1:/

# 進入容器檢視
$ docker start -i ubuntu-1
root@6294e0db7bf0:/# ls
2      bin   dev  hello  lib    mnt  proc  run   srv  tmp  var
2.txt  boot  etc  home   media  opt  root  sbin  sys  usr

# 複製容器內檔案到本地
$ docker cp ubuntu-1:/3.txt .
$ ls -l
total 354488
-rw-r--r--  1 linchangkun  staff         0 10 24 15:54 2.txt
-rw-r--r--  1 linchangkun  staff         0 10 24 15:57 3.txt

支援的選項有

  • -L:跟隨軟連線。預設當原路徑是軟連線時,預設只複製連結資訊,該選項會複製包含連結內容

檢視容器變更

使用 docker diff container 檢視容器內檔案變更

$ docker diff ubuntu-1
A /3.txt
A /hello
A /2.txt
A /2
C /root
A /root/.bash_history

檢視埠對映

使用 docker port container 命名可以檢視容器埠對映

$ docker run --name ubuntu-2 -it -p 80:80 ubuntu:18.04

$ docker port ubuntu-2
80/tcp -> 0.0.0.0:80

更新容器配置

使用 docker update container 命令可以更新容器資源限制配置,比如,cpu核心數、允許使用記憶體大小、io速度等等