Docker 常用命令

peterjxl發表於2024-09-06

介紹下 Docker 常用命令

幫助啟動類命令

啟動 docker: systemctl start docker

停止 docker: systemctl stop docker

重啟 docker: systemctl restart docker

檢視 docker 狀態: systemctl status docker

開機自啟: systemctl enable docker

檢視 docker 概要資訊:docker info

檢視 docker 總體幫助文件: docker --help

檢視 docker 命令幫助文件: docker 具體命令 --help

docker --help ​會列出全部的命令,(部分)輸出如下:

# docker --help
Usage:  docker [OPTIONS] COMMAND
A self-sufficient runtime for containers

Common Commands:
  run         Create and run a new container from an image
  exec        Execute a command in a running container
  ps          List containers
  build       Build an image from a Dockerfile
  pull        Download an image from a registry
  push        Upload an image to a registry
  images      List images
  login       Log in to a registry
  logout      Log out from a registry
  search      Search Docker Hub for images
  version     Show the Docker version information
  info        Display system-wide information

.................

docker 具體命令 --help​ 則可以檢視某個命令的幫助文件(類似 Linux 下的 man 命令),例如看 pull 命令:

$ docker pull --help

Usage:  docker pull [OPTIONS] NAME[:TAG|@DIGEST]

Download an image from a registry

Aliases:
  docker image pull, docker pull

Options:
  -a, --all-tags                Download all tagged images in the repository
      --disable-content-trust   Skip image verification (default true)
      --platform string         Set platform if server is multi-platform capable
  -q, --quiet                   Suppress verbose output

映象命令

檢視本地映象

docker images:可以列出本地主機上的映象。執行結果:

$ docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    9c7a54a9a43c   3 months ago   13.3kB

各個欄位的說明:

  • REPOSITORY:表示映象的倉庫源
  • TAG:映象的版本號(例如 MySQL 有版本 5,版本 7)
  • IMAGE ID:映象 ID(類似資料庫主鍵,不會重複)
  • CREATED:映象建立時間
  • SIZE:映象大小

同一倉庫源可以有多個版本,代表這個倉庫源的不同個版本,我們使用 REPOSITORY:TAG ​來定義不同的映象。如果不指定一個映象的版本標籤,例如只使用 Redis,預設最新版,例如 Redis:latest

docker images 可以帶兩個引數:

  • -a:列出本地所有的映象(含歷史映像層,後續會說)
  • -q:只顯示映象 ID

docker images 後面還可以帶映象的名字,表明要檢視某個映象的資訊(支援正規表示式)

$ docker images hello-world
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    feb5d9fea6a5   23 months ago   13.3kB

$ docker images hello*
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    feb5d9fea6a5   23 months ago   13.3kB

搜尋映象

格式:docker search 映象名字

例如搜尋 Redis:

$ docker search redis
NAME                   DESCRIPTION                                 STARS     OFFICIAL  AUTOMATED
redis                  Redis is an open source key-value store..   12309     [OK]   
redislabs/redisearch   Redis With the RedisSearch module pre....   57  
............             

​​

name:映象名字

DESCRIPTION:映象的一些說明

STARS:該映象的點贊數(例如 GitHub 專案也有點贊數)

OFFICIAL:是否經過了官方認證

AUTOMATED:是否為自動構建的(暫時不表)

和在 hub.docker.com 搜尋是一樣的:

該命令可選引數:

--limit : 只列出 N 個映象(預設 25 個),例如 docker search --limit 5 redis

下載映象

該命令可以下載映象到本地,格式:docker pull 映象名字

注意,我們沒用指定用什麼版本(TAG),因此預設是最新版,該命令等價於 docker pull 映象名字:latest

例如下載兩個版本的 Redis:

$ docker pull redis
Using default tag: latest
......

$ docker pull redis:6.0.8
6.0.8: Pulling from library/redis
....
 
$ docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    9c7a54a9a43c   3 months ago    13.3kB
redis         latest    7614ae9453d1   20 months ago   113MB
redis         6.0.8     16ecd2772934   2 years ago     104MB

檢視佔用空間

docker system df​:檢視映象/容器/資料卷所佔的空間。至於什麼是資料卷,後續再說

$ docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          3         1         216.9MB   216.9MB (99%)
Containers      1         0         0B        0B
Local Volumes   0         0         0B        0B
Build Cache     0         0         0B        0B

ps:Linux 下也有 df 命令,也是看磁碟空間的

刪除映象

docker rmi ​可以用來刪除映象。

刪除某個映象:docker rmi 映象ID​,或者 docker rmi 映象名​ 。例如 docker rmi hello-world​​

刪除多個映象:docker rmi -f 映象名1:TAG 映象名2:TAG​ (也可以用映象 ID)

刪除全部(慎用):docker rmi -f $(docker images -qa)​ 注:先找出所有映象 ID,然後作為引數傳遞給 docker rmi -f​,這是 Linux 的命令列知識

注意,如果某個映象之前被使用過,刪除是會報錯的:

$ docker rmi hello-world
Error response from daemon: conflict: unable to remove repository reference "hello-world" (must force) - container e3d569c1f07a is using its referenced image 9c7a54a9a43c

此時可以強制刪除:

$ docker rmi -f hello-world
Untagged: hello-world:latest
Untagged: hello-world@sha256:dcba6daec718f547568c562956fa47e1b03673dd010fe6ee58ca806767031d1c
Deleted: sha256:9c7a54a9a43cca047013b82af109fe963fde787f63f9e016fdc3384500c2823d

$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
redis        latest    7614ae9453d1   20 months ago   113MB
redis        6.0.8     16ecd2772934   2 years ago     104MB

面試題:談談 docker 虛懸映象是什麼?

倉庫名、標籤都是 <none> ​的映象,俗稱虛懸映象(dangling image)

$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
<none>       <none>    ba6acccedd29   22 months ago   72.8MB

一般沒什麼用,建議刪除。後續 Dockerfile 章節再介紹

容器命令

有映象才能建立容器, 這是根本前提(因為 Centos 比較大,這裡下載 Ubuntu 映象)

$ docker pull ubuntu


$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
ubuntu       latest    ba6acccedd29   22 months ago   72.8MB

新建 + 啟動容器

命令格式

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

常用 OPTIONS 說明(注意有些是一個減號開頭,有些是兩個減號開頭):

  • --name="容器新名字"​ :為容器指定一個名稱;
  • -d​:後臺執行容器並返回容器 ID,也即啟動守護式容器(後臺執行);
  • -i​:以互動模式(interactive)執行容器,通常與 -t 同時使用;
  • -t​:為容器重新分配一個偽輸入終端(tty),通常與 -i​ 同時使用。也即啟動互動式容器(前臺有偽終端,等待互動);
  • -P​(大寫 P):隨機埠對映。可以在啟動後透過 docker ps 檢視分配的埠
  • -p​(小寫 p):指定埠對映

這裡說下埠對映的概念:比如現在是 Docker 內的容器,執行了 Redis;那麼外界想要通訊這個 Redis,首先得找到這個 Docker 監聽的埠(假設是 6379),然後再由 Docker 轉發給這個容器內的埠

引數 說明
-p hostPort:containerPort 埠對映 -p:8080:80
-p ip:hostPort:containerPort 配置監聽地址 -p 10.0.0.100:8080:80
-p ip::containerPort 隨機分配埠 -p 10.0.0.100::80
-p hostPort:containerPort:網路協議 指定協議 -p 8080:80:tcp
-p 81:80 -p 443:443 指定多個埠對映

互動式容器的概念:比如用 Docker 啟動了一個作業系統 Ubuntu,那麼得用一個終端能連線上該 Ubuntu,這樣才能操作;示例:

[root@10 peterjxl]# docker run -it ubuntu /bin/bash

root@6f47c5c0dee0:/# ps -ef 
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  1 01:42 pts/0    00:00:00 /bin/bash
root         9     1  0 01:42 pts/0    00:00:00 ps -ef

root@6f47c5c0dee0:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media

run 命令中,帶上了 bash,說明我們要用 bash;

執行 run 命令後,就可以看到接下來就是容器內的終端了,並且可以執行 ps ​和 ls ​等命令

退出終端:用 exit ​命令

檢視執行中的容器

命令格式: docker ps [OPTIONS]

(常用)OPTIONS 說明:

  • -a:列出當前所有正在執行的容器 + 歷史上執行過的
  • -l(小寫的 L):顯示最近建立的容器。
  • -n:顯示最近 n 個建立的容器。例如 docker ps -n 1​ 顯示最近建立的 1 個容器
  • -q:靜默模式,只顯示容器 ID。
  • ..... 更多選項參考:docker run --help

我們可以先啟動一個 Ubuntu 容器,然後開啟一個新的終端,檢視:

$ docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS         PORTS     NAMES
0b6f86519ec6   ubuntu    "/bin/bash"   16 seconds ago   Up 7 seconds             happy_banach

欄位說明:

  • CONTAINER ID:容器 ID
  • IMAGE:映象
  • CREATED:建立時間,這裡是 16s 之前建立的
  • STATUS:狀態,這裡是 up,7s,也就是啟動了 7 秒
  • PORTS:暴露的埠,這裡是沒有暴露,因此為空
  • NAMES:容器名字,可以在 docker run​ 命令中透過 --name='容器名字'​ 來指定,這裡沒有指定,因此是隨機的

退出容器

兩種退出方式:

  • exit:透過 run 進去的容器,用 exit 退出後,容器會停止
  • ctrl+p+q: 透過 run 進去的容器,用快捷鍵 ctrl+p+q 退出,容器不停止

啟動已停止執行的容器

命令格式:docker start 容器ID或容器名

重啟容器

命令格式:​docker restart 容器ID或者容器

停止容器

命令格式:docker stop 容器ID或者容器名

強制停止容器

命令格式:docker kill 容器ID或容器名

刪除已停止的容器

命令格式:docker rm 容器ID

注意,正在執行中的容器不能被刪除,得先用 docker stop ​停止容器。如果一定要刪除執行中的,得使用 -f​ 選項強制刪除

一次性刪除多個容器例項:

docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm

啟動守護式容器

之前我們都是啟動互動式容器,一啟動就直接進入其終端;

但在大部分的場景下,我們希望 docker 的服務是在後臺執行的,可以用 docker run -d​ 選項指定容器的後臺執行模式。

好比學 Redis 的時候,可以在配置檔案寫 daemon 來使其變成守護程序

我們來試試:

$ docker run -d ubuntu
b1cce118042c6773628e67284d610dc37124ee4509813f12afcd648d27694010

$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

可以看到確實建立容器成功了(返回了容器 ID),但是為什麼沒有執行呢?這就涉及到一個知識點:Docker 容器後臺執行,就必須有一個前臺程序。容器執行的命令如果不是那些一直掛起的命令(比如執行 top,tail),就是會自動退出的。

這個是 Docker 的機制問題,以 web 容器 nginx 為例,正常情況下,我們配置啟動服務只需要啟動響應的 service 即可。例如 service nginx start;

但是這樣做,nginx 為後臺程序模式執行,就導致 docker 前臺沒有執行的應用,這樣的容器後臺啟動後,會立即自動停止,因為他覺得他沒事可做了。

所以,最佳的解決方案是,將要執行的程式以前臺程序的形式執行,常見就是命令列模式(比如之前的 docker -it​),表示還有互動操作,不用自動停止

檢視容器日誌

命令格式:docker logs 容器ID

該命令會將容器中終端的內容列印出來。例如先啟動一個 Redis,然後檢視日誌:

$ docker run -d redis
96dea7b6285ada51813d4b7cc1c5498ed44bfefc4018d36e868d4a435371b2ea

$ docker logs 96d
1:C 31 Aug 2023 10:39:11.909 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 31 Aug 2023 10:39:11.909 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=1, just started
1:C 31 Aug 2023 10:39:11.909 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
1:M 31 Aug 2023 10:39:11.909 * monotonic clock: POSIX clock_gettime
1:M 31 Aug 2023 10:39:11.910 * Running mode=standalone, port=6379.
1:M 31 Aug 2023 10:39:11.910 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1:M 31 Aug 2023 10:39:11.910 # Server initialized
1:M 31 Aug 2023 10:39:11.910 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
1:M 31 Aug 2023 10:39:11.910 * Ready to accept connections

檢視容器內執行的程序

命令格式:docker top 容器ID

比如之前啟動的 Redis:

$ docker top 96d
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
polkitd             15627               15609               0                   18:39               ?                   00:00:00            redis-server *:6379

檢視容器內部細節

命令格式:docker inspect 容器ID

該命令先顯示容器的很多細節,例如映象資訊,網路資訊,網橋資訊等,後續 Docker 高階篇會經常用這個

$ docker inspect 96d
[
    {
        "Id": "96dea7b6285ada51813d4b7cc1c5498ed44bfefc4018d36e868d4a435371b2ea",
        "Created": "2023-08-31T10:39:11.551125034Z",
        "Path": "docker-entrypoint.sh",
        "Args": [
            "redis-server"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 15627,
...........................

進入容器

命令格式:

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

命令詳解

  • OPTIONS​:可選引數,用於設定執行選項。
  • CONTAINER​:容器名稱或 ID,指定要執行命令的容器
  • COMMAND​:要在容器內執行的命令
  • ARG​:命令的引數,可以有多個

options 常用引數

  • -d,在後臺執行命令
  • -i,即使沒有附加也保持 STDIN 開啟,和 -t 配合
  • -t,進入容器的 CLI 模式
  • -e,設定環境變數
  • –env-file,讀入環境變數檔案
  • -w,需要執行命令的目錄
  • -u,指定訪問容器的使用者名稱
  • 更多引數及說明透過 docker exec --help​​檢視

一般來說,都是使用 docker exec -it 容器ID /bin/bash ​來進入容器。

注意:對於已經暫停或停止了的容器,無法執行 docker exec 命令

另一個進入容器的命令:docker attach 容器ID​。區別:

  • attach 直接進入容器啟動命令的終端,不會啟動新的程序。用 exit 退出,會導致容器的停止。
  • exec 是在容器中開啟新的終端,並且可以啟動新的程序。用 exit 退出,不會導致容器的停止。

推薦使用 docker exec​。

從容器內複製檔案

有時候我們需要從容器內複製檔案出來(例如用來備份)。命令格式:

docker cp  容器ID:容器內路徑 目的主機路徑

匯入和匯出容器

有時候我們希望將整個容器備份,此時就可以用匯入匯出命令:

  • export:匯出容器的內容留作為一個 tar 歸檔檔案。命令格式:docker export 容器ID > 檔名.tar​。
  • import:從 tar 包中的內容建立一個新的檔案系統再匯入為映象,命令格式:cat 檔名.tar | docker import - 映象使用者/映象名:映象版本號​。其中映象使用者、映象名和映象版本號是可以自定義的。

(完)

相關文章