介紹下 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 - 映象使用者/映象名:映象版本號
。其中映象使用者、映象名和映象版本號是可以自定義的。
(完)