本文將總結一些常見的重要的docker命令,以作備忘。后續如果有新的比較常用重要的也會更新進來。歡迎補充。
docker服務管理
首先我們要解釋一下:systemctl
和docker
命令的不同
systemctl
:是許多 Linux 發行版中默認的初始化系統和服務管理器。使用systemctl
可以管理系統服務,包括啟動、停止、重啟和查看服務狀態,通常需要超級用戶權限。可使用他來管理 Docker 服務。
docker
:用于管理容器的生命周期,包括創建、啟動、停止和刪除容器。通常在 Docker 服務已啟動的情況下使用
啟動 Docker 服務
sudo systemctl start docker
停止 Docker 服務
sudo systemctl stop docker
重啟 Docker 服務
sudo systemctl restart docker
查看 Docker 服務狀態
sudo systemctl status docker
啟用 Docker 服務開機自啟
sudo systemctl enable docker
禁用 Docker 服務開機自啟
sudo systemctl disable docker
容器管理
運行容器
bash docker run -it --name [container-name] [image-name]:[tag] docker run -d --name [container-name] [image-name]:[tag]
運行時有 許多參數,熟記這些參數很重要!
運行時的一些參數
-it
docker run -it [image-name]
結合
-i
和-t
參數,-i表示讓容器保持標準輸入(stdin)打開,-t將分配一個偽終端。說白了就是 :運行并進入容器-d
docker run -d [image-name]
-d代表 以后臺模式運行容器。
--name
docker run --name [container-name] [image-name]
為容器指定一個名稱。
-p
docker run -p [host-port]:[container-port] [image-name]
將主機端口映射到容器端口。可以多次使用
-p
映射多個端口。--expose
docker run --expose [container-port] [image-name]
暴露容器的指定端口,但不會映射到主機端口。主要用于容器間通信。(當使用Dockerfile時 在Dockerfile寫就行了)-v
docker run -v [host-dir]:[container-dir] [image-name]
將主機目錄掛載到容器目錄。可以多次使用
-v
掛載多個目錄。注意:掛載很重要,如果不掛載當容器刪除后再次運行的話, 數據將會跟隨容器被抹掉。這是大忌,尤其是一些需要留存的數據,比如redis mysql nacos rocketMQ等等。如果你使用docker來運行,那么切記一定要掛載。--mount
docker run --mount type=bind,source=[host-dir],target=[container-dir] [image-name]
綁定掛載,功能類似
-v
,但還是有區別,如下介紹:- v 和 --mount的區別
- -v: 出現比較早的掛載選項,功能強大且靈活,語法簡潔,可支持匿名卷,即:可以不指定主機路徑,只指定容器內路徑,Docker 會在主機上創建一個匿名卷。 也可以支持命名卷就是使用者指定。-v 這種方式兼容性好,適用于 Docker 的各個版本。 > 支持匿名卷:可以不指定主機路徑,只指定容器內路徑,Docker 會在主機上創建一個匿名卷
docker run -v /container-dir [image-name]
> 支持命名卷:可以使用已有的命名卷或創建新的命名卷docker run -v my-volume:/container-dir [image-name]
- --mount: 是較新的掛載選項,語法更具可讀性且更明確,他使用鍵值對形式,明確指出掛載類型、源路徑和目標路徑。支持多種掛載類型如: > 綁定掛載(bind mount) :將主機的特定路徑掛載到容器內。
docker run --mount type=bind,source=/host-dir,target=/container-dir [image-name]
> 卷掛載(volume) :使用 Docker 卷,支持創建、管理和使用命名卷。docker run --mount type=volume,source=my-volume,target=/container-dir [image-name]
> 臨時文件系統掛載(tmpfs) :在內存中創建一個臨時文件系統。docker run --mount type=tmpfs,target=/container-dir [image-name]
- -v: 出現比較早的掛載選項,功能強大且靈活,語法簡潔,可支持匿名卷,即:可以不指定主機路徑,只指定容器內路徑,Docker 會在主機上創建一個匿名卷。 也可以支持命名卷就是使用者指定。-v 這種方式兼容性好,適用于 Docker 的各個版本。 > 支持匿名卷:可以不指定主機路徑,只指定容器內路徑,Docker 會在主機上創建一個匿名卷
- v 和 --mount的區別
-e
docker run -e [env-var]=[value] [image-name]
為容器設置環境變量。可以多次使用-e
設置多個環境變量。--env-file
docker run --env-file [file-path] [image-name]
從文件中讀取環境變量并設置到容器中。
--network
```
docker run --network [network-name] [image-name] ```
將容器連接到指定的網絡。
--ip
docker run --network [network-name] --ip [container-ip] [image-name]
為容器分配指定的 IP 地址。-m
docker run -m [memory-limit] [image-name]
限制容器使用的內存量,例如-m 512m
或-m 1g
。--cpus
```
docker run --cpus=[number] [image-name] ```
限制容器可以使用的 CPU 數量。
--cpu-shares
```
docker run --cpu-shares [weight] [image-name] ``` 設置容器的 CPU 共享權重,默認值為 1024。
-u
docker run -u [user] [image-name]
指定以哪個用戶運行容器。
--privileged
```
docker run --privileged [image-name] ```
以特權模式運行容器,給予容器更高的權限。但是權限越大,風險也就越大, 使用時需要慎重!
--rm
```
docker run --rm [image-name] ```
容器停止后自動刪除容器。
--restart
```
docker run --restart [policy] [image-name] ```
容器的重啟策略,可選值包括
no:
(不重啟容器,默認設置)on-failure:
(僅當容器以非零退出狀態(即出現錯誤)退出時重啟容器可以在后邊跟:號并指定最多重啟幾次)always:
(無論退出狀態如何,總是重啟容器。如果手動停止容器,則不會重啟)unless-stopped:
(與 always 類似,但如果容器在 Docker 停止后沒有手動重啟,則不會在 Docker 啟動后重新啟動)。
--hostname
```
docker run --hostname [hostname] [image-name] ```
設置容器的主機名其實就是設置到了容器的 /etc/hosts 文件中去了。
--log-driver
```
docker run --log-driver [driver] [image-name] ```
指定容器的日志驅動,例如
json-file
、syslog
。--entrypoint
```
docker run --entrypoint [entrypoint] [image-name] ```
覆蓋 Dockerfile 中指定的默認入口點。假設Dockerfile中設置這個容器的入口點是
/bin/bash
。你可以使用--entrypoint
參數將入口點覆蓋為/bin/sh
--link
docker run --link [container-name-or-id]:[alias] [image-name]
鏈接到另一個容器,可以通過別名訪問。
列出容器
bash docker ps -a # 列出所有 docker ps # 列出運行中的容器
停止容器
```
docker stop [container-id/container-name] ```
啟動容器
```
docker start [container-id/container-name] ```
重啟容器
```
docker restart [container-id/container-name] ```
重命名一個容器
docker rename [old-name] [new-name]
更新一個或多個容器的配置
docker update [container-id]
刪除容器
一般刪除前要先stop容器 ```
docker rm [container-id/container-name] ```
殺死容器
docker kill [container-id/container-name]
暫停容器
docker pause [container-id/container-name]
恢復容器
docker unpause [container-id/container-name]
停止并刪除所有容器
docker rm -f $(sudo docker ps -a -q)
查看容器日志
docker logs [container-id/container-name] docker logs -f [container-id/container-name] # 實時顯示最新日志 當然你也可以加其他參數在需要的時候
當然如果你的容器的日志掛載到了宿主機, 那么直接去掛載目錄查看對應日志文件就行了。
查看容器詳細信息
docker inspect [container-id/container-name]
此命令比較重要
,可以一覽容器的詳情(實際輸出我就不粘了要不太占地),下邊解釋下輸出都有哪些東西:
- Id
- 說明:容器或鏡像的唯一標識符。
- 示例:
"Id": "e90e34656806"
- Name
- 說明:容器的名稱。
- 示例:
"Name": "/my-container"
- State
- 說明:容器的當前狀態。
- 子字段:
Status
:容器狀態(如running
、exited
)。Running
:容器是否在運行。Paused
:容器是否暫停。Restarting
:容器是否正在重啟。OOMKilled
:容器是否因內存不足而被殺死。Dead
:容器是否已死。Pid
:容器的進程 ID。ExitCode
:容器的退出代碼。Error
:容器的錯誤信息。
- Image
- 說明:容器所使用的鏡像的 ID。
- 示例:`"Image": "sha256:3b534f..."
- Config
- 說明:容器的配置。
- 子字段:
Hostname
:容器的主機名。Domainname
:容器的域名。User
:容器內運行的用戶。Env
:環境變量列表。Cmd
:容器啟動時運行的命令。Volumes
:容器使用的卷。WorkingDir
:容器的工作目錄。Entrypoint
:容器的入口點。ExposedPorts
:容器暴露的端口。
- NetworkSettings
- 說明:容器的網絡設置。(在排查網絡問題時你很有用!)
- 子字段:
IPAddress
:容器的 IP 地址。MacAddress
:容器的 MAC 地址。Ports
:容器的端口映射信息。
- Mounts
- 說明:容器的掛載信息。
- 子字段:
Source
:主機上的源路徑。Destination
:容器內的目標路徑。Mode
:掛載模式。RW
:掛載是否為讀寫模式。Propagation
:掛載傳播設置。
- HostConfig
- 說明:容器的主機配置。
- 子字段:
Binds
:綁定掛載列表。NetworkMode
:網絡模式。PortBindings
:端口綁定信息。RestartPolicy
:重啟策略。LogConfig
:日志配置。Cgroup
:cgroup 設置。
查看容器資源使用情況
這個比較常用 docker stats [container-id/container-name]
比如我執行:docker stats nacos
看下nacos容器的情況:
進入容器
``` docker exec -it [container-id/container-name] /bin/bash
當然你也可以指定其他shell類型 如:
docker exec -it [container-id/container-name] /bin/sh ```
導出容器
docker export [container-id/container-name] > [file-name].tar
導入容器
docker import [file-name].tar
- 導出和導入容器主要作用:
- 備份容器:保存容器當前狀態,以便在需要時恢復。
- 遷移容器:將容器從一個主機轉移到另一個主機上。
- 共享容器:將容器發送給其他用戶或開發團隊,以便他們可以在自己的環境中使用
顯示容器中運行的進程
docker top [container-id]
鏡像管理
搜索鏡像從鏡像倉庫
docker search [image-name]
拉取鏡像
bash docker pull [image-name]:[tag]
列出鏡像
docker images
刪除鏡像
docker rmi [image-name]:[tag]
刪除未使用到的image鏡像
這個一般要慎重哦,否則還得重新拉或者重新build鏡像 docker image prune -a
刪除所有鏡像
更是要慎重 ,凡是提到 刪除所有 一定要慎重。 docker rmi $(docker images -q)
構建鏡像
docker build -t [image-name]:[tag] [path-to-dockerfile]
保存鏡像
docker save -o [file-name].tar [image-name]:[tag]
- 主要作用: - 備份鏡像:將鏡像保存為文件,以便在需要時恢復。 - 遷移鏡像:將鏡像從一個 Docker 主機轉移到另一個主機。 - 共享鏡像:將鏡像保存為文件,并與其他用戶或團隊共享
加載鏡像
docker load -i [file-name].tar
- 主要作用: - 從備份中恢復鏡像:當你有一個通過 docker save
命令導出的鏡像備份時,可以使用 docker load
命令將其恢復到 Docker 中。 - 遷移鏡像:當你需要在不同的主機之間傳輸鏡像時,可以先使用 docker save
命令導出鏡像,然后在目標主機上使用 docker load
命令加載鏡像。 - 共享鏡像:你可以將鏡像存檔文件共享給其他用戶,其他用戶可以使用 docker load
命令加載這些鏡像
標記鏡像
即:將本地鏡像標記為遠程倉庫中的鏡像格式
docker tag my-image myusername/my-image:latest
推送鏡像
docker push myusername/my-image:latest
推送到遠程倉庫,供其他需要使用的人 pull。
顯示鏡像構建歷史
docker history [image-name]
網絡管理
列出網絡
docker network ls
創建自定義網絡
docker network create [network-name]
刪除網絡
docker network rm [network-name]
刪除未使用的網絡
docker network prune
指定容器使用哪個網絡
docker network connect [network-name] [container-name]
斷開容器與網絡的連接
docker network disconnect [network-name] [container-name]
數據卷管理
列出數據卷
docker volume ls
創建數據卷
```
docker volume create [volume-name] ```
刪除數據卷
```
docker volume rm [volume-name] ```
查看數據卷詳細信息
docker volume inspect [volume-name]
隨便找一個數據卷,看看都有哪些信息: - CreatedAt:卷的創建時間。 - Driver:此卷使用本地驅動創建。 - Labels:代表是匿名卷,沒有設置特定標簽。 - Mountpoint:卷的數據存儲在主機上的
/var/lib/docker/volumes/1cfbeeb7e8decf5b9758cddea04e882c71a63e2684056096153d26b5638693b5/_data
目錄中。 - Name:卷的唯一標識符是 1cfbeeb7e8decf5b9758cddea04e882c71a63e2684056096153d26b5638693b5
。 - Options:卷沒有設置特殊選項。 - Scope:卷的作用域是本地的,僅在創建它的 Docker 主機上可見。
查看容器的數據卷信息
你也可以查看某個容器中的卷信息,使用這個: docker inspect container-id | grep -A 30 '"Mounts"'
如下是nacos容器的掛載信息:
Docker Compose 常用命令
啟動服務
docker-compose up docker-compose up -d # 后臺形式 啟動
停止服務
docker-compose down
刪除容器和網絡(但是不會刪除卷和鏡像)
docker-compose rm
重新啟動服務
docker-compose restart
構建或從頭(不使用緩存方式)構建鏡像
```
根據 docker-compose.yml
文件中定義的構建配置構建服務鏡像。它會讀取 docker-compose.yml
文件
中的 build
指令,執行 Dockerfile 中定義的構建步驟,生成新的鏡像 docker-compose build
也是構建鏡像 但是不使用緩存
docker-compose build --no-cache ```
注意這個docker-compose build --no-cache
命令其實在一些場合也比較有用這里解釋下:
- 此命令用于構建 Docker Compose 定義的服務鏡像,并在構建過程中不使用任何緩存。這意味著每個步驟都會從頭開始構建,而不會使用之前構建的中間層緩存。
- 主要作用:
- 強制全新構建:忽略之前構建過程中產生的所有緩存層,從頭開始重新構建鏡像的每個步驟。
- 確保最新代碼:確保使用最新的代碼和依賴項,而不會受到之前緩存的影響。
- 調試和測試:在調試和測試環境中,使用此命令可以確保每次構建都從頭開始,不會受緩存的影響
拉取服務所需的鏡像
docker-compose pull
注意:對于包含 build
指令的服務,通常不需要手動執行 docker-compose pull
因為build命令會自動根據docker-compose 的build模塊構建 或者如果你沒指定根據Dockerfile build那么將會自動pull
如下示例:
列出服務
和docker ps
一樣的效果 docker-compose ps
查看服務日志
和 docker logs [container-id/container-name]
一樣的效果 docker-compose logs docker-compose logs -f
查看服務的詳細信息
docker-compose config
注意:此命令比較實用,解釋下: docker-compose config
命令用于驗證并查看 Docker Compose 文件的有效配置。它會輸出合并后的配置,其中包含一些從環境變量、默認值等獲取的附加信息。運行此命令后,輸出通常會比原始的 docker-compose.yml
文件多一些自動生成或默認的字段。
其他常見的自動生成信息如下:
- build
- context:構建上下文目錄,通常是包含 Dockerfile 的目錄。
- dockerfile:使用的 Dockerfile 文件名,如果未指定,則默認為
Dockerfile
。 - 實際情況如下:
- ports
- mode:端口映射模式,
ingress
表示流量進入容器的方式。 - target:容器內部的目標端口。
- published:發布到主機的端口。
- protocol:使用的協議,通常是
tcp
。 - 實際情況如下:
- mode:端口映射模式,
- networks
- default:默認網絡配置。自動添加的網絡配置信息,表示容器將連接到默認網絡。
- name:默認網絡的名稱。
docker-compose
會自動為項目創建一個默認網絡。 - 實際情況如下:
- depends_on
- 如果服務之間存在依賴關系,
depends_on
字段會列出依賴的服務。該字段會顯示服務啟動的順序。 - 實際情況:
- 如果服務之間存在依賴關系,
volumes
- 如果服務使用了卷掛載,
volumes
字段會顯示卷的具體掛載點。 - 實際情況:
- 如果服務使用了卷掛載,
restart
- 如果未在
docker-compose.yml
文件中指定restart
策略,docker-compose
可能會顯示默認的restart
策略 - 這個我一般都指定了 就是 always,不指定的話默認是no也即不重啟。
- 如果未在
停止并刪除服務容器、網絡和卷
慎用! docker-compose down --volumes --remove-orphans
停止服務但保留網絡和卷
docker-compose stop
docker系統的一些信息
查看docker系統能有效讓我們了解docker整體的情況胸有成竹。下邊列幾個常用的:
列出系統中的docker 資源
docker system ls
解釋下: - df - 命令:docker system df
- 說明:顯示 Docker 磁盤使用情況,包含鏡像、容器、卷和構建緩存的大小和可回收空間。 - events - 命令:docker system events
- 說明:獲取 Docker 守護進程的實時事件流,如容器啟動、停止等。 - info - 命令:docker system info
- 說明:顯示系統范圍的 Docker 信息,包括版本、存儲驅動、網絡插件等詳細信息。 - prune - 命令:docker system prune
- 說明:刪除未使用的數據,包括停止的容器、未使用的網絡、懸空鏡像和未使用的構建緩存,以釋放磁盤空間。
下邊我們就來用用這些
查看docker所占磁盤信息
- Images - TOTAL:共有 25 個鏡像。 - ACTIVE:其中 17 個鏡像正在使用中。 - SIZE:所有鏡像總共占用 4.159GB 的磁盤空間。 - RECLAIMABLE:1.412GB(33%)的空間可以通過清理未使用的鏡像回收。 - Containers - TOTAL:共有 18 個容器。 - ACTIVE:其中 18 個容器正在運行中。 - SIZE:所有容器總共占用 10.32MB 的磁盤空間。 - RECLAIMABLE:沒有可回收的空間(0B),因為所有容器都在運行。 - Local Volumes - TOTAL:共有 521 個本地卷。 - ACTIVE:其中 7 個卷正在使用中。 - SIZE:所有卷總共占用 9.129MB 的磁盤空間。 - RECLAIMABLE:8.919MB(97%)的空間可以通過清理未使用的卷回收。 - Build Cache - TOTAL:共有 134 個構建緩存項。 - ACTIVE:沒有活動的構建緩存項(0)。 - SIZE:構建緩存總共占用 8.082GB 的磁盤空間。 - RECLAIMABLE:8.082GB 的空間可以通過清理構建緩存回收
查看 Docker 守護進程的實時事件流,如容器啟動、停止
docker system events
在我運行此命令之前,我執行了docker-compose restart
命令(注意如果restart執行完畢 docker system events是沒有輸出的就得蹭他正在啟動或者正在停止等正在進行時
),運行此命令才會有輸出,如下:
查看docker系統詳情
docker info # 等價與 docker system info
此命令不錯,可以一覽docker的信息,輸出如下: ``` Client: Docker Engine - Community Version: 26.1.4 Context: default Debug Mode: false Plugins: buildx: Docker Buildx (Docker Inc.) Version: v0.14.1 Path: /usr/libexec/docker/cli-plugins/docker-buildx compose: Docker Compose (Docker Inc.) Version: v2.27.1 Path: /usr/libexec/docker/cli-plugins/docker-compose
Server: Containers: 18 Running: 18 Paused: 0 Stopped: 0 Images: 25 Server Version: 26.1.4 Storage Driver: overlay2 Backing Filesystem: xfs Supports dtype: true Using metacopy: false Native Overlay Diff: true userxattr: false Logging Driver: json-file Cgroup Driver: cgroupfs Cgroup Version: 1 Plugins: Volume: local Network: bridge host ipvlan macvlan null overlay Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog Swarm: inactive Runtimes: io.containerd.runc.v2 runc Default Runtime: runc Init Binary: docker-init containerd version: d2d58213f83a351ca8f528a95fbd145f5654e957 runc version: v1.1.12-0-g51d5e94 init version: de40ad0 Security Options: seccomp Profile: builtin Kernel Version: 3.10.0-1160.102.1.el7.x8664 Operating System: CentOS Linux 7 (Core) OSType: linux Architecture: x8664 CPUs: 4 Total Memory: 7.637GiB Name: localhost.localdomain ID: 6b8a6c0d-813a-4d11-90a2-f402d7829ada Docker Root Dir: /var/lib/docker Debug Mode: false Experimental: false Insecure Registries: 127.0.0.0/8 Registry Mirrors: https://iub4ix1a.mirror.aliyuncs.com/ Live Restore Enabled: false `` 解釋: 1. **Containers**:容器數量統計: - **Running**:正在運行的容器數量,如上輸出:
18。 - **Paused**:暫停的容器數量,如上輸出:
0。 - **Stopped**:停止的容器數量,如上輸出:
0。 1. **Images**:鏡像數量,如上輸出:
25。 1. **Server Version**:服務端版本號,如上輸出:
26.1.4。 1. **Storage Driver**:存儲驅動類型,如上輸出:
overlay2。 - **Backing Filesystem**:底層文件系統,如上輸出:
xfs。 - **Supports d_type**:是否支持
dtype,如上輸出:
true。 - **Using metacopy**:是否使用 metacopy, 如上輸出:
false。 - **Native Overlay Diff**:是否啟用原生 overlay 差異, 如上輸出:
true。 - **userxattr**:是否啟用用戶擴展屬性, 如上輸出:
false。 1. **Logging Driver**:日志驅動類型,如上輸出:
json-file。 1. **Cgroup Driver**:Cgroup 驅動類型,如上輸出:
cgroupfs。 1. **Cgroup Version**:Cgroup 版本,如上輸出:
1。 1. **Plugins**:服務器插件信息: - **Volume**:卷插件,如上輸出:
local。 - **Network**:網絡插件,如上輸出:
bridge、
host等。 - **Log**:日志插件,如上輸出:
json-file、
syslog等。 1. **Swarm**:Swarm 模式狀態,如上輸出:
inactive。 1. **Runtimes**:支持的運行時,如上輸出:
io.containerd.runc.v2和
runc。 1. **Default Runtime**:默認運行時,如上輸出:
runc。 1. **Init Binary**:初始化二進制文件,如上輸出:
docker-init。 1. **containerd version**:containerd 版本。 1. **runc version**:runc 版本。 1. **init version**:init 版本。 1. **Security Options**:安全選項,如上輸出:
seccomp和其配置文件。 1. **Kernel Version**:內核版本,如上輸出:
3.10.0-1160.102.1.el7.x8664。 1. **Operating System**:操作系統,如上輸出:
CentOS Linux 7 (Core)。 1. **OSType**:操作系統類型,如上輸出:
linux。 1. **Architecture**:CPU 架構,如上輸出:
x8664。 1. **CPUs**:CPU 核心數,如上輸出:
4。 1. **Total Memory**:總內存,如上輸出:
7.637GiB。 1. **Name**:主機名,如上輸出:
localhost.localdomain。 1. **ID**:主機唯一標識符。 1. **Docker Root Dir**:Docker 根目錄,如上輸出:
/var/lib/docker。 1. **Debug Mode**:調試模式狀態,如上輸出:
false。 1. **Experimental**:實驗性功能狀態,如上輸出:
false。 1. **Insecure Registries**:不安全的注冊表地址,如上輸出:
127.0.0.0/8。 1. **Registry Mirrors**:鏡像地址,如上輸出:
https://iub4ix1a.mirror.aliyuncs.com/。 1. **Live Restore Enabled**:是否啟用 Live Restore,如上輸出:
false`。
清理docker系統中未使用到的數據
這命令其實也挺常用的,有些不用的數據該清理就清理 docker system prune
這個命令會清理的內容包括: - all stopped containers:刪除所有停止的容器。 - all networks not used by at least one container:刪除所有未被任何容器使用的網絡。 - all dangling images:刪除所有懸空鏡像(沒有標簽的鏡像)。 - unused build cache:刪除所有未使用的構建緩存 好家伙我執行了下發現我去,竟然這些無用數據占了 8.621 GB ! 清理完,感覺一身輕哈哈。
顯示容器的資源使用情況(cpu 內存等等 和linxu 的 top命令類似)
docker stats
ok,暫時到這里,后續遇到了比較常見的、有用的docker命令,隨時補充進來!