做衣服外單網(wǎng)站百度識圖在線識別網(wǎng)頁版
華子目錄
- Docker鏡像操作
- 創(chuàng)建鏡像
- 方式1docker commit
- 示例
- 方式2docker import
- 示例1:從本地文件系統(tǒng)導(dǎo)入
- 示例2:從遠(yuǎn)程URL導(dǎo)入
- 注意事項
- 方式3docker build
- 示例1:構(gòu)建鏡像并指定名稱和標(biāo)簽
- 示例2:使用自定義的 Dockerfile 路徑構(gòu)建鏡像
- 示例3:構(gòu)建時傳遞參數(shù)給 Dockerfile
- 注意事項
- 搜索倉庫鏡像docker search
- 查看正在運(yùn)行的容器docker ps
- 獲取鏡像docker pull
- docker tag
- docker history
- 上傳鏡像docker push
- 示例
- 注意事項
- 鏡像體積SIZE
- 虛懸鏡像
- 導(dǎo)出鏡像docker image save
- 刪除鏡像docker image rm
- 注意
- 導(dǎo)入鏡像docker image load
- 查看鏡像的詳細(xì)信息docker image inspect
- Docker容器操作
- 啟動容器
- 方法1
- 示例
- 常用選項
- 注意
- 方式2(不推薦)
- 注意
- 刪除容器
- 刪除單個容器
- 刪除多個容器
- 刪除所有容器(包括正在運(yùn)行的)
- 清除所有處于關(guān)閉狀態(tài)的容器
- 注意事項
- 查看容器列表
- 查看容器運(yùn)行狀態(tài)
- 停止運(yùn)行的容器docker stop/kill
- 激活關(guān)閉的容器docker start/restart
- 示例
- 注意事項
- 查看容器
- 查看容器的詳細(xì)信息docker container inspect
- 查看容器內(nèi)的進(jìn)程docker top
- 示例
- 注意事項
- docker stats
- 在window上訪問Linux中運(yùn)行的nginx容器
- 查詢?nèi)萜鲀?nèi)部日志docker logs
- 示例
- 示例1:查看容器的日志
- 示例2:實時查看容器的日志
- 示例3:查看容器的日志并限制輸出行數(shù)
- 示例4:查看容器的日志并顯示時間戳
- 注意事項
- docker wait
- 使用示例
- 注意事項
- 進(jìn)入容器docker exec
- 常用選項
- 示例
- 導(dǎo)出容器docker export
- 選項
- 使用示例
- 注意事項
- 導(dǎo)入容器docker import
- 示例
- 示例1:從本地文件系統(tǒng)導(dǎo)入
- 示例2:從遠(yuǎn)程URL導(dǎo)入
- 注意事項
- 查看容器的IP地址
- 查看容器中的環(huán)境變量
- 其他容器命令
- docker rename
- docker cp
- docker diff
- docker port
- docker update
Docker鏡像操作
創(chuàng)建鏡像
方式1docker commit
docker commit
命令用于基于一個已存在的 Docker 容器來創(chuàng)建一個新的 Docker 鏡像。當(dāng)你修改了正在運(yùn)行的容器(例如,在容器中安裝了新的軟件包或更改了配置文件),并希望保存這些更改為一個新的鏡像時,你可以使用 docker commit
命令。
命令的基本語法如下:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
其中:
-
OPTIONS
是可選參數(shù),用于配置 commit 的行為。-a
或--author
:設(shè)置新鏡像的作者。-c
或--change
:應(yīng)用 Dockerfile 指令來創(chuàng)建鏡像。-m
或--message
:設(shè)置 commit 時的說明信息。-p
或--pause
:在 commit 時,將容器暫停。這有助于減少在創(chuàng)建提交過程中遇到數(shù)據(jù)損壞的可能性。
-
CONTAINER
是你要基于其創(chuàng)建新鏡像的容器的名稱或 ID。 -
REPOSITORY[:TAG]
是新鏡像的倉庫名和標(biāo)簽。如果不指定標(biāo)簽,Docker 會使用默認(rèn)的latest
標(biāo)簽。
示例
假設(shè)你有一個正在運(yùn)行的容器,ID 為 c162we1ycy2k
,你想將這個容器保存為一個新的鏡像,并命名為 exp_mysql
,標(biāo)簽為 v1
,同時添加提交人信息為 test_exp
和說明信息為 test apache
,你可以執(zhí)行以下命令:
docker commit -a "test_exp" -m "test apache" c162we1ycy2k exp_mysql:v1
執(zhí)行這個命令后,Docker 會基于 c162we1ycy2k
容器創(chuàng)建一個新的鏡像,名為 exp_mysql
,標(biāo)簽為 v1
,并且?guī)в兄付ǖ淖髡吆驼f明信息。
需要注意的是,使用 docker commit
創(chuàng)建的鏡像通常不如使用 Dockerfile 創(chuàng)建的鏡像透明和可維護(hù)。Dockerfile 提供了更清晰的鏡像構(gòu)建歷史和可重復(fù)性。然而,在某些情況下,如容器被入侵后需要保存現(xiàn)場,docker commit
可能是一個有用的工具。在常規(guī)的應(yīng)用開發(fā)和部署過程中,推薦使用 Dockerfile 來構(gòu)建和管理鏡像。
方式2docker import
docker import
命令用于將本地文件系統(tǒng)上的文件或目錄,或者從遠(yuǎn)程URL導(dǎo)入為Docker鏡像。
其基本語法如下:
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
參數(shù)說明:
OPTIONS
:可選參數(shù),用于配置導(dǎo)入操作的一些選項。file|URL|-
:必需參數(shù),指定要導(dǎo)入的文件路徑或URL。可以是一個文件路徑,也可以是一個URL,或者使用-
表示從標(biāo)準(zhǔn)輸入中讀取tar歸檔文件。REPOSITORY
:可選參數(shù),指定要創(chuàng)建的新鏡像的名稱。TAG
:可選參數(shù),指定要創(chuàng)建的新鏡像的標(biāo)簽。
示例1:從本地文件系統(tǒng)導(dǎo)入
假設(shè)我們有一個名為example.tar
的tar歸檔文件,它包含了我們想要導(dǎo)入的文件系統(tǒng)。我們可以使用docker import
命令來創(chuàng)建一個新的鏡像:
docker import example.tar myimage:1.0
這將會將example.tar
中的文件系統(tǒng)導(dǎo)入到myimage:1.0
鏡像中。之后,我們可以使用docker run
命令來運(yùn)行這個新建的容器。
示例2:從遠(yuǎn)程URL導(dǎo)入
如果我們想要從一個遠(yuǎn)程URL導(dǎo)入文件系統(tǒng),我們可以直接將URL作為參數(shù)傳遞給docker import
命令:
docker import http://example.com/path/to/image.tar myimage:1.0
這將會將遠(yuǎn)程URL中的文件系統(tǒng)導(dǎo)入到myimage:1.0
鏡像中。
注意事項
如果在使用docker import
命令時遇到無法啟動容器的問題,可能的原因包括導(dǎo)入的文件或URL中缺少依賴項或配置文件,或者與宿主機(jī)環(huán)境不兼容等。這時,需要檢查導(dǎo)入的文件或URL是否包含所需的依賴項和配置文件,以及宿主機(jī)環(huán)境是否與導(dǎo)入的鏡像兼容。如果以上方法都無法解決問題,可以嘗試重新導(dǎo)入鏡像。
請注意,docker import
命令創(chuàng)建的鏡像可能不如使用Dockerfile創(chuàng)建的鏡像透明和可維護(hù)。在可能的情況下,推薦使用Dockerfile來構(gòu)建和管理鏡像。
方式3docker build
docker build
命令用于使用 Dockerfile 來創(chuàng)建 Docker 鏡像。Dockerfile 是一個文本文件,其中包含了一系列指令,這些指令描述了如何構(gòu)建一個 Docker 鏡像。通過執(zhí)行 docker build
命令并指定 Dockerfile 所在的目錄,Docker 會按照 Dockerfile 中的指令逐步構(gòu)建出一個新的鏡像。
基本語法如下:
docker build [OPTIONS] PATH | URL | -
其中:
OPTIONS
是可選參數(shù),用于配置構(gòu)建過程的行為。例如,--tag
或-t
用于指定鏡像的名稱和標(biāo)簽。PATH
是 Dockerfile 所在的目錄路徑。Docker 會在該目錄下查找名為Dockerfile
(默認(rèn)的文件名,除非使用-f
參數(shù)指定了其他文件名)的文件,并按照其中的指令構(gòu)建鏡像。URL
是 Git 倉庫的 URL,如果 Dockerfile 位于遠(yuǎn)程 Git 倉庫中,可以通過這個 URL 直接構(gòu)建。-
表示從標(biāo)準(zhǔn)輸入(stdin)讀取 Dockerfile 內(nèi)容,這通常與管道操作符|
結(jié)合使用,以便從其他命令的輸出中直接構(gòu)建鏡像。
示例1:構(gòu)建鏡像并指定名稱和標(biāo)簽
docker build -t myimage:latest .
這條命令會在當(dāng)前目錄(.
表示當(dāng)前目錄)下查找 Dockerfile,并按照其中的指令構(gòu)建一個新的鏡像,鏡像的名稱為 myimage
,標(biāo)簽為 latest
。
示例2:使用自定義的 Dockerfile 路徑構(gòu)建鏡像
docker build -t myimage:custom -f path/to/my/Dockerfile .
在這個例子中,-f
參數(shù)用于指定 Dockerfile 的路徑為 path/to/my/Dockerfile
,而不是默認(rèn)的 Dockerfile
。構(gòu)建出的鏡像名稱和標(biāo)簽分別為 myimage
和 custom
。
示例3:構(gòu)建時傳遞參數(shù)給 Dockerfile
docker build --build-arg USER=johndoe --build-arg UID=1000 -t myimage:withargs .
在這個例子中,--build-arg
參數(shù)用于傳遞構(gòu)建參數(shù)給 Dockerfile 中的指令。在 Dockerfile 中,可以使用 ${USER}
和 ${UID}
的方式來引用這些參數(shù)。
注意事項
- Dockerfile 中的指令必須按照正確的順序和語法編寫,否則構(gòu)建過程可能會失敗。
- 在構(gòu)建過程中,Docker 會根據(jù) Dockerfile 中的指令創(chuàng)建臨時的容器,執(zhí)行相應(yīng)的命令,并生成鏡像分層。最終,所有命令執(zhí)行完畢后,會生成一個新的鏡像。
- 優(yōu)化 Dockerfile 可以減少最終生成的鏡像大小,提高構(gòu)建效率。例如,盡量合并多個命令到一個命令中,避免不必要的中間層。
總之,docker build
命令是 Docker 中用于構(gòu)建鏡像的重要工具,通過合理使用 Dockerfile 和構(gòu)建參數(shù),可以高效地創(chuàng)建符合需求的 Docker 鏡像。
搜索倉庫鏡像docker search
-
docker search nginx
是一個 Docker 命令,用于在 Docker Hub 或其他配置的 Docker 鏡像倉庫中搜索名為 “nginx” 的鏡像。當(dāng)你執(zhí)行這個命令時,Docker 會向配置的倉庫發(fā)送搜索請求,并返回與 “nginx” 相關(guān)的鏡像列表。 -
搜索結(jié)果通常包括:
- NAME:鏡像的名稱。
- DESCRIPTION:鏡像的描述信息。
- STARS:鏡像的星標(biāo)數(shù)量,反映了鏡像的受歡迎程度。
- OFFICIAL:是否是官方鏡像的標(biāo)志。
[root@server ~]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL
nginx Official build of Nginx. 19721 [OK]
unit Official build of NGINX Unit: Universal Web … 25 [OK]
nginx/nginx-ingress NGINX and NGINX Plus Ingress Controllers fo… 89
nginxinc/nginx-unprivileged Unprivileged NGINX Dockerfiles 144
nginx/nginx-prometheus-exporter NGINX Prometheus Exporter for NGINX and NGIN… 39
nginxinc/nginx-s3-gateway Authenticating and caching gateway based on … 6
nginx/unit This repository is retired, use the Docker o… 64
nginx/nginx-ingress-operator NGINX Ingress Operator for NGINX and NGINX P… 2
nginxinc/amplify-agent NGINX Amplify Agent docker repository 1
nginx/nginx-quic-qns NGINX QUIC interop 1
nginxinc/ingress-demo Ingress Demo 4
nginxproxy/nginx-proxy Automated nginx proxy for Docker containers … 132
nginxproxy/acme-companion Automated ACME SSL certificate generation fo… 131
bitnami/nginx Bitnami nginx Docker Image 184
bitnami/nginx-ingress-controller Bitnami Docker Image for NGINX Ingress Contr… 32
nginxinc/nginmesh_proxy_debug 0
ubuntu/nginx Nginx, a high-performance reverse proxy & we… 112
nginxproxy/docker-gen Generate files from docker container meta-da… 16
nginxinc/mra-fakes3 0
kasmweb/nginx An Nginx image based off nginx:alpine and in… 7
nginxinc/mra_python_base 0
nginxinc/ngx-rust-tool 0
nginxinc/nginmesh_proxy_init 0
rancher/nginx-ingress-controller 12
查看正在運(yùn)行的容器docker ps
[root@server ~]# docker ps #列出正在運(yùn)行的容器[root@server ~]# docker ps -a #列出正在運(yùn)行和未運(yùn)行的容器
獲取鏡像docker pull
- Docker Hub上有大量的高質(zhì)量的鏡像可以用,從Docker鏡像倉庫獲取鏡像的命令是
docker pull
,其命令格式為:
[root@server ~]# docker pull [options] [域名[:端口號]/]倉庫名[:TAG標(biāo)簽]options: #拉取時,options一般不寫-a 下載存儲庫中的所有標(biāo)記圖像-q 抑制冗長輸出#如果不指定TAG標(biāo)簽, 則默認(rèn)會選擇latest標(biāo)簽,這樣會下載倉庫中最新版本的鏡像。
[root@server ~]# docker pull nginx
Using default tag: latest #默認(rèn)拉取最新版本
latest: Pulling from library/nginx
8a1e25ce7c4f: Pull complete
e78b137be355: Pull complete
39fc875bd2b2: Pull complete
035788421403: Pull complete
87c3fb37cbf2: Pull complete
c5cdd1ce752d: Pull complete
33952c599532: Pull complete
Digest: sha256:6db391d1c0cfb30588ba0bf72ea999404f2764febf0f1f196acd5867ac7efa7e
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest[root@server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 92b11f67642b 5 weeks ago 187MB[root@server ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 92b11f67642b 5 weeks ago 187MB
[root@server ~]# docker pull nginx:1.14
1.14: Pulling from library/nginx #拉取1.14版本
27833a3ba0a5: Pull complete
0f23e58bd0b7: Pull complete
8ca774778e85: Pull complete
Digest: sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d
Status: Downloaded newer image for nginx:1.14
docker.io/library/nginx:1.14
[root@server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 92b11f67642b 5 weeks ago 187MB
nginx 1.14 295c7be07902 4 years ago 109MB
docker tag
docker tag 命令添加的標(biāo)簽實際上起到了類似于軟鏈接的作用
[root@server ~]# docker tag nginx:1.14 test/nginx:v1
[root@server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 92b11f67642b 5 weeks ago 187MB
nginx 1.14 295c7be07902 4 years ago 109MB
test/nginx v1 295c7be07902 4 years ago 109MB
#這里我們可以看到nginx:1.14和test/nginx:v1的鏡像ID號是一致的[root@server ~]# docker image ls nginx
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 92b11f67642b 5 weeks ago 187MB
nginx 1.14 295c7be07902 4 years ago 109MB
-
docker tag nginx:1.14 test/nginx:v1
命令用于給已有的 Docker 鏡像添加一個新的標(biāo)簽。在這個例子中,你正在給 nginx:1.14 鏡像添加一個新的標(biāo)簽 test/nginx:v1。 -
具體來說:
- nginx:1.14 是源鏡像的名稱和標(biāo)簽。這通常意味著你有一個名為 nginx,標(biāo)簽為 1.14 的鏡像在本地。
- test/nginx:v1 是目標(biāo)鏡像的名稱和標(biāo)簽。其中 test 是新的鏡像倉庫名,nginx 是鏡像名,v1 是新的標(biāo)簽。
-
執(zhí)行這個命令后,nginx:1.14 鏡像仍然存在于本地,并且你還會有一個新的標(biāo)簽 test/nginx:v1 指向相同的鏡像。這意味著你可以通過這兩個標(biāo)簽中的任何一個來運(yùn)行或推送鏡像。
-
這個命令通常在你想要重新組織本地鏡像庫,或者準(zhǔn)備將鏡像推送到一個自定義的 Docker 倉庫時使用。例如,如果你有一個私有的 Docker 倉庫,并且你想要將本地的 nginx:1.14 鏡像推送到這個倉庫,你可能需要先給它加上一個符合你私有倉庫命名規(guī)范的標(biāo)簽。
-
在執(zhí)行
docker tag
命令之后,你可以使用docker images
來查看本地所有的鏡像及其標(biāo)簽,確保新的標(biāo)簽已經(jīng)被添加。 -
如果之后你想要將這個新標(biāo)簽的鏡像推送到遠(yuǎn)程倉庫,你可以使用
docker push
命令,如下所示:
[root@server ~]# docker push test/nginx:v1
在執(zhí)行這個命令之前,你需要確保已經(jīng)登錄到了對應(yīng)的遠(yuǎn)程 Docker 倉庫(使用 docker login
命令),并且你有權(quán)限向該倉庫推送鏡像。
docker history
列出鏡像的各分層
[root@server ~]# docker history nginx:1.14 #查看該鏡像的層數(shù)
IMAGE CREATED CREATED BY SIZE COMMENT
295c7be07902 4 years ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B
<missing> 4 years ago /bin/sh -c #(nop) STOPSIGNAL SIGTERM 0B
<missing> 4 years ago /bin/sh -c #(nop) EXPOSE 80 0B
<missing> 4 years ago /bin/sh -c ln -sf /dev/stdout /var/log/nginx… 22B
<missing> 4 years ago /bin/sh -c set -x && apt-get update && apt… 53.8MB
<missing> 4 years ago /bin/sh -c #(nop) ENV NJS_VERSION=1.14.2.0.… 0B
<missing> 4 years ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.14.2-… 0B
<missing> 4 years ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B
<missing> 4 years ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 4 years ago /bin/sh -c #(nop) ADD file:4fc310c0cb879c876… 55.3MB
docker history nginx:1.14
命令用于顯示 Docker 鏡像 nginx:1.14
的構(gòu)建歷史。執(zhí)行這個命令后,你會看到一個包含鏡像各層的列表,每一層都記錄了創(chuàng)建時的命令以及該層的大小。
輸出可能類似于以下內(nèi)容:
IMAGE CREATED CREATED BY SIZE COMMENT
... ... ... ... ...
<missing> months ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon o... 0B
<missing> months ago /bin/sh -c #(nop) STOPSIGNAL SIGTERM 0B
<missing> months ago /bin/sh -c #(nop) EXPOSE 80/tcp 0B
<missing> months ago /bin/sh -c ln -sf /dev/stdout /var/log/nginx... 22B
<missing> months ago /bin/sh -c set -x && addgroup --system --... 57.2MB
<missing> months ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.14.2 0B
<missing> months ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do... 0B
<missing> months ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> months ago /bin/sh -c #(nop) ADD file:15139a917863c048... 69.1MB
在輸出中:
IMAGE
列顯示的是每一層的 ID。CREATED
列顯示了該層創(chuàng)建的時間。CREATED BY
列顯示了創(chuàng)建該層時執(zhí)行的 Dockerfile 指令。SIZE
列顯示了該層的大小。COMMENT
列通常用于記錄額外的信息,但在這個例子中沒有使用。
注意,有些層的 CREATED
列可能顯示為 <missing>
,這通常意味著這些層是在構(gòu)建基礎(chǔ)鏡像時創(chuàng)建的,而不是在構(gòu)建 nginx:1.14
鏡像時直接添加的。
上傳鏡像docker push
docker push
命令用于將本地的 Docker 鏡像推送到 Docker 鏡像倉庫中,可以是 Docker Hub 這樣的公共倉庫,也可以是自托管的私有倉庫。在推送鏡像之前,你需要先使用 docker login
命令登錄到目標(biāo)倉庫。
基本語法如下:
docker push [OPTIONS] NAME[:TAG]
其中:
[OPTIONS]
是可選參數(shù),用于配置推送操作的一些選項。NAME
是要推送的鏡像的名稱。TAG
是可選的鏡像標(biāo)簽,用于指定要推送的鏡像版本。如果省略標(biāo)簽,Docker 會默認(rèn)使用latest
標(biāo)簽。
推送鏡像時,Docker 會將鏡像拆分成多個層(layer),并逐一上傳到倉庫中。在上傳過程中,Docker 會顯示進(jìn)度條以及每層的大小信息。請注意,進(jìn)度條顯示的是未壓縮的層大小,實際的上傳數(shù)據(jù)在發(fā)送前會被壓縮,因此上傳的大小可能不會與進(jìn)度條完全匹配。
示例
假設(shè)你已經(jīng)登錄到了一個 Docker 倉庫,并且有一個名為 myimage
的本地鏡像,你可以使用以下命令將其推送到倉庫中:
docker push myimage:v1.0
這條命令會將標(biāo)簽為 v1.0
的 myimage
鏡像推送到你登錄的 Docker 倉庫中。
注意事項
- 在推送鏡像之前,請確保你已經(jīng)登錄到了目標(biāo) Docker 倉庫,并且擁有足夠的權(quán)限來推送鏡像。
- 如果遇到推送失敗的情況,可能是由于網(wǎng)絡(luò)連接問題、倉庫權(quán)限問題、鏡像名稱或標(biāo)簽格式不正確等原因。你可以根據(jù)錯誤信息來排查問題。
- 在推送鏡像時,最好加上明確的標(biāo)簽,以便在后續(xù)使用時能夠區(qū)分不同的鏡像版本。
總之,docker push
命令是 Docker 中用于將本地鏡像推送到遠(yuǎn)程倉庫的重要工具,通過它可以實現(xiàn)鏡像的共享和分發(fā)。
鏡像體積SIZE
[root@server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 92b11f67642b 5 weeks ago 187MB
nginx 1.14 295c7be07902 4 years ago 109MB
test/nginx v1 295c7be07902 4 years ago 109MB
- 這里標(biāo)識的所占用空間和在Docker Hub上看到的鏡像大小不同。Docker Hub中顯示的體積是壓縮后的體積。在鏡像下載和上傳過程中鏡像是保持著壓縮狀態(tài)的,因此 Docker Hub 所顯示的大小是網(wǎng)絡(luò)傳輸中更關(guān)心的流量大小。而
docker images
顯示的是鏡像下載到本地后展開的大小,準(zhǔn)確說,是展開后的各層所占空間的總和,因為鏡像到本地后,查看空間的時候, 更關(guān)心的是本地磁盤空間占用的大小。 - 另外一個需要注意的問題是,
docker images
列表中的鏡像體積總和并非是所有鏡像實際硬盤消耗。由于 Docker 鏡像是多層存儲結(jié)構(gòu),并且可以繼承、復(fù)用,因此不同鏡像可能會因為使用相同的基礎(chǔ)鏡像,從而擁有共同的層。由于 Docker 使用 UnionFs,相同的層只需要保存一份即可,因此實際鏡像硬盤占用空間很可能要比這個列表鏡像大小的總和要小的多。
虛懸鏡像
如果docker images
查看鏡像的顯示結(jié)果中出現(xiàn)了沒有倉庫名,也沒有標(biāo)簽,均為<none>的鏡像,舊的鏡像上的這個名稱則被取消,從而成為了<none>。除了 docker pull
可能導(dǎo)致這種情況, docker build
也同樣可以導(dǎo)致這種現(xiàn)象。 由于新舊鏡像同名,舊鏡像名稱被取消,從而出現(xiàn)倉庫名、標(biāo)簽均為<one>的鏡像。這類無標(biāo)簽鏡像也被稱為虛懸鏡像(danglingimage),可以用下面的命令專門顯示這類鏡像:
#查看虛懸鏡像
[root@server ~]# docker images -f dangling=true
- 一般來說,虛懸鏡像已經(jīng)失去了存在的價值,是可以隨意刪除的,可以用下面的命令刪除:
#清空虛懸鏡像
[root@server ~]# docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
#顯示包括中間層鏡像在內(nèi)的所有鏡像
[root@server ~]# docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 92b11f67642b 5 weeks ago 187MB
nginx 1.14 295c7be07902 4 years ago 109MB
test/nginx v1 295c7be07902 4 years ago 109MB
導(dǎo)出鏡像docker image save
- 或者使用
docker save
docker image save
是一個 Docker CLI 命令,用于將指定的 Docker 鏡像打包成一個 .tar
文件, 并保存到本地計算機(jī)上。這樣, 你就可以在沒有該Docker 環(huán)境的機(jī)器上導(dǎo)入和運(yùn)行這個鏡像,或者將其備份以供將來使用。
該命令的語法如下:
docker image save [OPTIONS] IMAGE [IMAGE...]
其中,OPTIONS
可以包括:
-o, --output
:指定輸出文件名。--quiet, -q
:僅顯示鏡像ID。
例如,要將名為 myimage
的 Docker 鏡像保存到名為 myimage.tar
的文件中,你可以運(yùn)行以下命令:
docker image save -o myimage.tar myimage
你也可以在同一命令中指定多個鏡像名稱,以將它們一起保存到歸檔文件中。例如:
docker image save -o multiple-images.tar image1 image2 image3
這將把 image1
、image2
和 image3
這三個鏡像一起打包到 multiple-images.tar
文件中。
總之,docker image save
命令提供了一種方便的方式來備份和傳輸 Docker 鏡像,是 Docker 管理中的重要工具之一。
[root@server ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest ca2b0f26964c 3 weeks ago 77.9MB
nginx latest 92b11f67642b 5 weeks ago 187MB
nginx 1.14 295c7be07902 4 years ago 109MB
test/nginx v1 295c7be07902 4 years ago 109MB[root@server ~]# docker image save ubuntu.tar.gz ubuntu #執(zhí)行錯誤原因:沒有-o或重定向
cowardly refusing to save to a terminal. Use the -o flag or redirect[root@server ~]# docker image save ubuntu > ubuntu.tar.gz #使用重定向
[root@server ~]# ll
-rw-r--r-- 1 root root 80425472 3月 24 11:33 ubuntu.tar.gz[root@server ~]# docker image save -o nginx.tar.gz nginx #使用-o
[root@server ~]# ll -h #由文件大小,我們可以看到,他把上面兩個名為nginx的鏡像都打包了
總用量 367M
-rw------- 1 root root 290M 3月 24 11:36 nginx.tar.gz
-rw-r--r-- 1 root root 77M 3月 24 11:33 ubuntu.tar.gz[root@server ~]# docker image save -o docker-nginx.gz nginx:1.14 #打包1.14版本的nginx
[root@server ~]# ll -h
總用量 475M
-rw------- 1 root root 108M 3月 24 11:37 docker-nginx.gz
-rw------- 1 root root 290M 3月 24 11:36 nginx.tar.gz
-rw-r--r-- 1 root root 77M 3月 24 11:33 ubuntu.tar.gz
#使用docker save
[root@server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest ca2b0f26964c 3 weeks ago 77.9MB
nginx latest 92b11f67642b 5 weeks ago 187MB
mysql latest 019814493c7a 2 months ago 632MB
[root@server ~]# docker save -o mysql.tar.gz mysql
[root@server ~]# ll -h
總用量 1.1G
-rw------- 1 root root 108M 3月 24 11:37 docker-nginx.gz
-rw------- 1 root root 619M 3月 24 12:25 mysql.tar.gz
-rw------- 1 root root 290M 3月 24 11:36 nginx.tar.gz
-rw-r--r-- 1 root root 77M 3月 24 11:33 ubuntu.tar.gz
刪除鏡像docker image rm
刪除Docker鏡像的方法有多種,以下是一些常見的操作:
-
使用鏡像ID或鏡像名進(jìn)行刪除:
docker rmi [鏡像ID]
docker rmi [鏡像名:標(biāo)簽]
請注意,如果鏡像正在被容器使用,你需要先刪除容器才能刪除鏡像。
-
強(qiáng)制刪除鏡像:
當(dāng)Docker因為某種原因無法刪除某個鏡像時,可以使用-f
選項來強(qiáng)制刪除。docker rmi -f [鏡像ID或鏡像名]
-
刪除所有未使用的鏡像:
使用docker image prune
命令可以清理所有未被容器引用的鏡像。docker image prune
-
刪除所有鏡像(包括正在使用的):
這是一個較為危險的操作,因為它會刪除所有鏡像,包括那些正在被容器使用的鏡像。docker rmi $(docker images -q)
-
批量刪除特定時間前的鏡像:
使用過濾器可以刪除所有創(chuàng)建時間超過特定時長的鏡像。docker image prune -a --filter "until=168h"
上面的命令會刪除所有創(chuàng)建時間超過168小時(7天)的鏡像。
-
清理虛懸鏡像:
虛懸鏡像通常是構(gòu)建過程中留下的,沒有標(biāo)簽的鏡像。可以使用docker image prune
命令進(jìn)行清理。docker image prune
-
查看Docker鏡像、容器和卷:
在刪除之前,建議首先查看當(dāng)前系統(tǒng)中存在的Docker鏡像、容器和卷,以避免誤刪。- 使用
docker images
查看鏡像列表。 - 使用
docker ps
查看正在運(yùn)行的容器。 - 使用
docker volume ls
查看卷列表。
- 使用
在刪除鏡像之前,請確保已經(jīng)備份了重要的數(shù)據(jù),并且確認(rèn)要刪除的鏡像確實不再需要,以避免數(shù)據(jù)丟失或服務(wù)中斷。
[root@server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest ca2b0f26964c 3 weeks ago 77.9MB
nginx latest 92b11f67642b 5 weeks ago 187MB
nginx 1.14 295c7be07902 4 years ago 109MB
test/nginx v1 295c7be07902 4 years ago 109MB#第一種刪除方式docker image rm 鏡像名
[root@server ~]# docker image rm nginx:1.14
Untagged: nginx:1.14
Untagged: nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d
[root@server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest ca2b0f26964c 3 weeks ago 77.9MB
nginx latest 92b11f67642b 5 weeks ago 187MB
test/nginx v1 295c7be07902 4 years ago 109MB#第二種刪除方式docker rmi 鏡像名
[root@server ~]# docker rmi nginx
Untagged: nginx:latest
Untagged: nginx@sha256:6db391d1c0cfb30588ba0bf72ea999404f2764febf0f1f196acd5867ac7efa7e
Deleted: sha256:92b11f67642b62bbb98e7e49169c346b30e20cd3c1c034d31087e46924b9312e
Deleted: sha256:d9e826dbb4b3c5770fe92638baa8c6614f210d782a5d021a123fe9fa1f92c23d
Deleted: sha256:2a75285e888884bed4d630896c86ecd71739c6e82669e21ad7a050f33c9ac48d
Deleted: sha256:32bfe3f040358ab8f9872a63d4ddefdc68f35d991ca10a812cbac5912ae9f97b
Deleted: sha256:1330486eb62ea7e96f384961b77b0fc85f5d4422e761114ef3a72e7cb89751a4
Deleted: sha256:a375372209a0f2b2c697a52cce46bc41b495bf86184ae83dd5146e20c22078eb
Deleted: sha256:450787ca55caa59d0288de9cf36fc6b77d1b208a77eb837ec3d25b385f99cafb
Deleted: sha256:a483da8ab3e941547542718cacd3258c6c705a63e94183c837c9bc44eb608999
[root@server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest ca2b0f26964c 3 weeks ago 77.9MB
test/nginx v1 295c7be07902 4 years ago 109MB[root@server ~]# docker pull nginx #再拉取一個nginx鏡像
Using default tag: latest
latest: Pulling from library/nginx
8a1e25ce7c4f: Pull complete
e78b137be355: Pull complete
39fc875bd2b2: Pull complete
035788421403: Pull complete
87c3fb37cbf2: Pull complete
c5cdd1ce752d: Pull complete
33952c599532: Pull complete
Digest: sha256:6db391d1c0cfb30588ba0bf72ea999404f2764febf0f1f196acd5867ac7efa7e
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
[root@server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest ca2b0f26964c 3 weeks ago 77.9MB
nginx latest 92b11f67642b 5 weeks ago 187MB
test/nginx v1 295c7be07902 4 years ago 109MB#通過鏡像ID強(qiáng)制刪除鏡像(-f表示強(qiáng)制性刪除)
[root@server ~]# docker rmi -f 295
Untagged: test/nginx:v1
Deleted: sha256:295c7be079025306c4f1d65997fcf7adb411c88f139ad1d34b537164aa060369
Deleted: sha256:19606512dfe192788a55d7c1efb9ec02041b4e318587632f755c5112f927e0e3
Deleted: sha256:0b83495b3ad3db8663870c3babeba503a35740537a5e25acdf61ce6a8bdad06f
Deleted: sha256:5dacd731af1b0386ead06c8b1feff9f65d9e0bdfec032d2cd0bc03690698feda
[root@server ~]# docker images -a #列出所有鏡像
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest ca2b0f26964c 3 weeks ago 77.9MB
nginx latest 92b11f67642b 5 weeks ago 187MB
注意
- 如果觀察上面這幾個命令的運(yùn)行輸出信息的話,你會注意到刪除行為分為兩類,一類是Untagged,另一類是Deleted。鏡像的唯一標(biāo)
識是其 ID 和摘要,而一個鏡像可以有多個標(biāo)簽。 - 當(dāng)我們使用上面命令刪除鏡像的時候, 實際上是在要求刪除某個標(biāo)簽的鏡像。所以首先需要做的是將滿足我們要求的所有鏡像標(biāo)簽都取
消,這就是我們看到的 Untagged 的信息。 - 因為一個鏡像可以對應(yīng)多個標(biāo)簽,因此當(dāng)我們刪除了所指定的標(biāo)簽后,可能還有別的標(biāo)簽指向了這個鏡像,如果是這種情況, 那么Delete 行為就不會發(fā)生。所以并非所有的
docker image rm
都會產(chǎn)生刪除鏡像的行為,有可能僅僅是取消了某個標(biāo)簽而已。 - 當(dāng)該鏡像所有的標(biāo)簽都被取消了,該鏡像很可能會失去了存在的意義,因此會觸發(fā)delete刪除行為。鏡像是多層存儲結(jié)構(gòu), 因此在刪除的時候也是從上層向基礎(chǔ)層方向依次進(jìn)行判斷刪除,鏡像的多層結(jié)構(gòu)讓鏡像復(fù)用變動非常容易,因此很有可能某個其它鏡像正依賴于當(dāng)前鏡像的某一層。 這種情況,依舊不會觸發(fā)刪除該層的行為。 直到?jīng)]有任何層依賴當(dāng)前層時,才會真實的刪除當(dāng)前層。
- 除了鏡像依賴以外,還需要注意的是容器對鏡像的依賴。如果有用這個鏡像啟動的容器存在(即使容器沒有運(yùn)行), 那么同樣不可以刪除這個鏡像。
導(dǎo)入鏡像docker image load
- 或者使用
docker load
docker image load
是一個 Docker CLI 命令,用于將以前使用 docker save
命令保存的鏡像加載到 Docker 中。這個命令可以將 .tar
文件中存儲的一個或多個 Docker 鏡像恢復(fù)為其原始狀態(tài),并將其添加到本地 Docker 鏡像庫中。
通常,你可能會先使用 docker save
命令將一個或多個鏡像保存到一個 .tar
文件中,以便在沒有直接訪問 Docker 倉庫的情況下,能夠?qū)⑦@些鏡像傳輸?shù)狡渌麢C(jī)器或備份起來。然后,當(dāng)需要加載這些鏡像時,可以使用 docker image load
命令將它們從 .tar
文件中恢復(fù)到 Docker 中。
下面是 docker image load
命令的基本使用方式:
docker image load < 鏡像文件名.tar
或者,你可以使用 -i
選項指定輸入文件的路徑:
docker image load -i /path/to/鏡像文件名.tar
例如,如果你有一個名為 myimage.tar
的文件,你可以使用以下命令將其加載到 Docker 中:
docker image load < myimage.tar
加載完成后,你可以使用 docker images
命令來查看新加載的鏡像是否出現(xiàn)在本地鏡像列表中。
需要注意的是,docker image load
命令不會創(chuàng)建容器,只是將鏡像加載到本地 Docker 環(huán)境中。要基于這些鏡像創(chuàng)建容器,你需要使用 docker run
命令。
[root@server ~]# docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest ca2b0f26964c 3 weeks ago 77.9MB
nginx latest 92b11f67642b 5 weeks ago 187MB
mysql latest 019814493c7a 2 months ago 632MB
[root@server ~]# docker images -aq
ca2b0f26964c
92b11f67642b
019814493c7a
[root@server ~]# ll -h
總用量 1.1G
-rw------- 1 root root 108M 3月 24 11:37 docker-nginx.gz
-rw------- 1 root root 619M 3月 24 12:25 mysql.tar.gz
-rw------- 1 root root 290M 3月 24 11:36 nginx.tar.gz
-rw-r--r-- 1 root root 77M 3月 24 11:33 ubuntu.tar.gz[root@server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest ca2b0f26964c 3 weeks ago 77.9MB
nginx latest 92b11f67642b 5 weeks ago 187MB[root@server ~]# docker image load -i mysql.tar.gz
18a3ada103a9: Loading layer [==================================================>] 118.8MB/118.8MB
96549124ed74: Loading layer [==================================================>] 11.26kB/11.26kB
331304b328ea: Loading layer [==================================================>] 2.359MB/2.359MB
7d05fbfb31ee: Loading layer [==================================================>] 13.85MB/13.85MB
d8fb47b60f94: Loading layer [==================================================>] 6.656kB/6.656kB
a5d9662dde43: Loading layer [==================================================>] 3.072kB/3.072kB
7fafcf5c6ac1: Loading layer [==================================================>] 201MB/201MB
ec9a59df23f2: Loading layer [==================================================>] 3.072kB/3.072kB
5458227f9e0f: Loading layer [==================================================>] 312.7MB/312.7MB
14544546851f: Loading layer [==================================================>] 16.9kB/16.9kB
Loaded image: mysql:latest
[root@server ~]# docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest ca2b0f26964c 3 weeks ago 77.9MB
nginx latest 92b11f67642b 5 weeks ago 187MB
mysql latest 019814493c7a 2 months ago 632MB
[root@server ~]# docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 92b11f67642b 5 weeks ago 187MB
mysql latest 019814493c7a 2 months ago 632MB[root@server ~]# ll -h
總用量 1.1G
-rw------- 1 root root 108M 3月 24 11:37 docker-nginx.gz
-rw------- 1 root root 619M 3月 24 12:25 mysql.tar.gz
-rw------- 1 root root 290M 3月 24 11:36 nginx.tar.gz
-rw-r--r-- 1 root root 77M 3月 24 11:33 ubuntu.tar.gz[root@server ~]# docker load < ubuntu.tar.gz
5498e8c22f69: Loading layer [==================================================>] 80.41MB/80.41MB
Loaded image: ubuntu:latest
[root@server ~]# docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest ca2b0f26964c 3 weeks ago 77.9MB
nginx latest 92b11f67642b 5 weeks ago 187MB
mysql latest 019814493c7a 2 months ago 632MB
查看鏡像的詳細(xì)信息docker image inspect
docker image inspect
是一個 Docker CLI 命令,用于獲取一個或多個 Docker 鏡像的詳細(xì)信息。這個命令返回有關(guān)鏡像的 JSON 格式的結(jié)構(gòu)化數(shù)據(jù),包括鏡像的 ID、創(chuàng)建時間、父鏡像、大小、配置、層等。
基本語法如下:
docker image inspect [OPTIONS] IMAGE [IMAGE...]
其中,IMAGE
是你想要檢查的鏡像的名稱或 ID??梢灾付ǘ鄠€鏡像來同時獲取它們的信息。
OPTIONS
是可選參數(shù),可以用來定制輸出的格式。比如,可以使用 --format
參數(shù)來指定一個 Go 模板,以自定義輸出的格式。
例如,如果你想要獲取名為 myimage
的鏡像的詳細(xì)信息,你可以運(yùn)行:
docker image inspect myimage
這將返回一個 JSON 對象,其中包含了 myimage
鏡像的詳細(xì)信息。
如果你只想獲取某些特定的信息,比如鏡像的創(chuàng)建時間,你可以使用 --format
參數(shù)來定制輸出。例如:
docker image inspect --format='{{.Created}}' myimage
這將只返回鏡像的創(chuàng)建時間。
[root@server ~]# docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest ca2b0f26964c 3 weeks ago 77.9MB
nginx latest 92b11f67642b 5 weeks ago 187MB
mysql latest 019814493c7a 2 months ago 632MB
[root@server ~]# docker image inspect mysql
[{"Id": "sha256:019814493c7ab16a057af0399b1288a1208b75ba852b915541840095c0fedfd0","RepoTags": ["mysql:latest"],"RepoDigests": [],"Parent": "","Comment": "buildkit.dockerfile.v0","Created": "2024-01-18T17:37:32Z","DockerVersion": "","Author": "","Config": {"Hostname": "","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"ExposedPorts": {"3306/tcp": {},"33060/tcp": {}},"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","GOSU_VERSION=1.16","MYSQL_MAJOR=innovation","MYSQL_VERSION=8.3.0-1.el8","MYSQL_SHELL_VERSION=8.3.0-1.el8"],"Cmd": ["mysqld"],"ArgsEscaped": true,"Image": "","Volumes": {"/var/lib/mysql": {}},"WorkingDir": "","Entrypoint": ["docker-entrypoint.sh"],"OnBuild": null,"Labels": null},"Architecture": "amd64","Os": "linux","Size": 632338890,"GraphDriver": {"Data": {"LowerDir": "/var/lib/docker/overlay2/71019f4f52c5c447bc6c339e4a33d35d43060053f80199afe55f0a74c97f950b/diff:/var/lib/docker/overlay2/98071bd50aaace91cafcbbd6d6f1f61667b863b844a14c55500d9b5dff5496ea/diff:/var/lib/docker/overlay2/51bbf41162dfd698ab0d05d934272ac6d407ee840dd23ad148b689ec08ff6ad0/diff:/var/lib/docker/overlay2/ea36002cf9f7fab18e7f80f6a73876de5ab2a9600091a5c3abf299eec79f8fc2/diff:/var/lib/docker/overlay2/59e2297f480e1a4fbe0b2664bab19ac5875598ab5b8096dfbcd4a3ad7f1a3bc3/diff:/var/lib/docker/overlay2/73c545c7c9c2075a9027c75f35d26d571395f0d2e2ec5c347c553b26a005ea8f/diff:/var/lib/docker/overlay2/5fa774e73b382b03832fde505e94e3d1583edb1ea81c331646ece1480a2361c8/diff:/var/lib/docker/overlay2/8a43e4bce01c3577aa197076d2afe2f35866386e6d999a211c72b7aa53f0cfa4/diff:/var/lib/docker/overlay2/031b942ad12868d5b2f563779b592447f7c7f1439d6d402b7587e9a6be920e25/diff","MergedDir": "/var/lib/docker/overlay2/9f2e70c39118a4a92510f835d5e2fc704fb5a88d4c6b5dbf1c1c8cb0b15b0794/merged","UpperDir": "/var/lib/docker/overlay2/9f2e70c39118a4a92510f835d5e2fc704fb5a88d4c6b5dbf1c1c8cb0b15b0794/diff","WorkDir": "/var/lib/docker/overlay2/9f2e70c39118a4a92510f835d5e2fc704fb5a88d4c6b5dbf1c1c8cb0b15b0794/work"},"Name": "overlay2"},"RootFS": {"Type": "layers","Layers": ["sha256:18a3ada103a9229bc00b549b66ae7caa0bc0eb47e785859d8b1346a254a871d1","sha256:96549124ed74012f28231a5c9584343eccb1352a3cdfc17234fa0d22d59c0667","sha256:331304b328ea1ee4e6f879ee5ea83a84dfeee92e8f6eed430dc0ec91daf6325e","sha256:7d05fbfb31eee6df20a572fafc7b50f9518838d3c13de89b88e9fae44585306e","sha256:d8fb47b60f94e1033c12c982cc669024cafa77b33d9ad7d1cd7f2605740417b5","sha256:a5d9662dde43371156b5a4dd21052b47f40606a780d039d37ed112e03049baf9","sha256:7fafcf5c6ac1cd816b47ef599217575cdde05e4a05e12e4e96afbe3e6236896e","sha256:ec9a59df23f223ccd0d7d4490f904c95b1d1d1c6ad83d11c4cb7ebc1b1672d74","sha256:5458227f9e0f698c36186c085570240db025e101186f88fce300958cda13651f","sha256:14544546851f4a2de63ac98a464da491096c36cdfc94b10cd26dc8da572a5eb5"]},"Metadata": {"LastTagTime": "0001-01-01T00:00:00Z"}}
]
Docker容器操作
啟動容器
Docker運(yùn)行容器前需要本地存在對應(yīng)的鏡像,如果本地不存在該鏡像,Docker會從鏡像倉庫下載該鏡像。
方法1
- 使用
docker run
- 或者使用
docker container run
docker run
是 Docker 命令行接口(CLI)中用于創(chuàng)建并啟動新容器的命令。使用 docker run
,您可以基于指定的鏡像來運(yùn)行一個新的容器實例,并可以傳遞各種參數(shù)來配置容器的行為。
下面是 docker run
的基本語法:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS
:這是可選的,用于配置容器的行為。例如,您可以設(shè)置端口映射、環(huán)境變量、卷掛載等。IMAGE
:指定要基于哪個鏡像來創(chuàng)建并啟動容器。COMMAND
:在容器內(nèi)部要執(zhí)行的命令。如果鏡像定義了默認(rèn)的命令,那么這個COMMAND
可以省略。ARG
:傳遞給COMMAND
的參數(shù)。
示例
- 運(yùn)行一個基于
ubuntu
鏡像的容器,并啟動 bash shell:
docker run -it ubuntu bash
這里 -it
選項用于保持容器的標(biāo)準(zhǔn)輸入(stdin)打開,并分配一個偽終端(pseudo-TTY)。
- 在后臺運(yùn)行一個基于
nginx
鏡像的容器,并映射端口:
docker run -d -p 8080:80 nginx
這里 -d
選項用于在后臺運(yùn)行容器,-p 8080:80
將容器的 80 端口映射到主機(jī)的 8080 端口。
- 設(shè)置環(huán)境變量并運(yùn)行容器:
docker run -e MY_VAR=myvalue ubuntu echo $MY_VAR
這里 -e MY_VAR=myvalue
設(shè)置了一個環(huán)境變量 MY_VAR
,并在容器內(nèi)執(zhí)行 echo $MY_VAR
命令。
- 掛載卷并運(yùn)行容器:
docker run -v /host/directory:/container/directory ubuntu ls /container/directory
這里 -v /host/directory:/container/directory
將主機(jī)上的 /host/directory
目錄掛載到容器內(nèi)的 /container/directory
目錄。
常用選項
-d, --detach
:在后臺運(yùn)行容器并打印容器 ID。-i, --interactive
:保持 stdin 打開,即交互式訪問-t, --tty
:分配一個偽終端或保持 stdin 打開。-p, --publish list
:發(fā)布容器端口到主機(jī)。格式為主機(jī)端口:容器端口
-P
:隨機(jī)端口映射,容器內(nèi)部端口隨機(jī)映射到主機(jī)的端口-e, --env list
:設(shè)置環(huán)境變量。-v, --volume list
:掛載卷。--rm
:容器一停,自動刪除--name string
:為容器指定一個名稱。--restart string
:設(shè)置容器的重啟策略。--network string
:指定容器要使用的網(wǎng)絡(luò)。
注意
如果在沒有對應(yīng)鏡像的情況下使用docker run
,則docker run
就等價于docker pull,docker create,docker start
[root@server ~]# docker run -it ubuntu bash
root@58349642f2b2:/# ls
bin dev home lib32 libx32 mnt proc run srv tmp var
boot etc lib lib64 media opt root sbin sys usr
root@58349642f2b2:/# exit
exit
[root@server ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
58349642f2b2 ubuntu "bash" 26 seconds ago Exited (0) 21 seconds ago quizzical_meninsky
#Exited表示容器已關(guān)閉[root@server ~]# docker run -it --rm ubuntu bash
root@24d9e0f33ed4:/# ls
bin dev home lib32 libx32 mnt proc run srv tmp var
boot etc lib lib64 media opt root sbin sys usr
root@24d9e0f33ed4:/# exit
exit
[root@server ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@server ~]# docker run -it -d -P nginx bash
8cf6390252dfdd5025ebcb9329cd4fd45fedc6a9174bf564cf1b5e6d7597e725
[root@server ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8cf6390252df nginx "/docker-entrypoint.…" 11 seconds ago Up 10 seconds 0.0.0.0:32768->80/tcp, :::32768->80/tcp wonderful_austin
#Up表示容器正在運(yùn)行
[root@server ~]# docker run --name web1 -it -d -p 8888:80 nginx #加-d后臺運(yùn)行
d7688268707e97555ee4745bfdf0e7f334f8e2d690325b74309f1012656fdcad
[root@server ~]# docker port web1 #查看web1的docker端口映射
80/tcp -> 0.0.0.0:8888
80/tcp -> [::]:8888
[root@server ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d7688268707e nginx "/docker-entrypoint.…" 22 seconds ago Up 21 seconds 0.0.0.0:8888->80/tcp, :::8888->80/tcp web1
[root@server ~]# docker run --name web1 -it -p 8888:80 nginx /bin/bash #不加-d進(jìn)入交互模式
root@1f1e37ecc503:/# ls
bin dev docker-entrypoint.sh home lib64 mnt proc run srv tmp var
boot docker-entrypoint.d etc lib media opt root sbin sys usr
root@1f1e37ecc503:/# exit
exit
[root@server ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1f1e37ecc503 nginx "/docker-entrypoint.…" 27 seconds ago Exited (0) 6 seconds ago web1
方式2(不推薦)
- 先使用
docker create
創(chuàng)建一個容器 - 在使用
docker start
啟動容器
注意
如果在沒有對應(yīng)鏡像的情況下使用docker create
,則docker create
就等價于docker pull,docker create
刪除容器
要刪除Docker容器,你可以使用docker rm
命令。以下是關(guān)于刪除容器的一些常見操作和注意事項:
刪除單個容器
要刪除一個正在運(yùn)行的容器,你需要首先停止它,然后再刪除?;蛘?#xff0c;你可以使用-f
選項來強(qiáng)制刪除正在運(yùn)行的容器。
# 停止容器
docker stop [容器ID或名稱]# 刪除容器
docker rm [容器ID或名稱]
或者,你可以一步完成,直接強(qiáng)制刪除正在運(yùn)行的容器:
docker rm -f [容器ID或名稱]
刪除多個容器
你可以使用空格分隔的容器ID或名稱列表來刪除多個容器:
docker rm [容器ID1] [容器ID2] ...
或者,結(jié)合docker ps
命令和xargs
來刪除所有停止的容器:
docker rm $(docker ps -aq)
這里的-a
選項表示顯示所有容器(包括已停止的),-q
選項表示只輸出容器ID。
刪除所有容器(包括正在運(yùn)行的)
要刪除所有容器,包括正在運(yùn)行的容器,可以使用以下命令:
docker rm -f $(docker ps -aq)
這將會強(qiáng)制刪除所有容器,所以請確保你真的想要這么做。
清除所有處于關(guān)閉狀態(tài)的容器
[root@server ~]# docker container prune
注意事項
- 在刪除容器之前,請確保容器內(nèi)的數(shù)據(jù)已經(jīng)備份或不再需要,因為刪除容器會同時刪除容器內(nèi)的文件系統(tǒng)。
- 如果容器正在運(yùn)行重要的服務(wù)或進(jìn)程,請確保在刪除之前已經(jīng)進(jìn)行了適當(dāng)?shù)耐C(jī)處理。
- 使用
-f
選項強(qiáng)制刪除容器時,請格外小心,因為這可能會中斷正在運(yùn)行的進(jìn)程或?qū)е聰?shù)據(jù)丟失。
查看容器列表
在刪除容器之前,你可以使用docker ps
命令查看正在運(yùn)行的容器,或者使用docker ps -a
查看所有容器(包括已停止的)。這可以幫助你確定要刪除的容器。
# 查看正在運(yùn)行的容器
docker ps# 查看所有容器(包括已停止的)
docker ps -a
通過結(jié)合這些命令和選項,你可以有效地管理Docker容器,確保只刪除不再需要的容器。
[root@server ~]# docker run -it -d -P nginx bash
8cf6390252dfdd5025ebcb9329cd4fd45fedc6a9174bf564cf1b5e6d7597e725
[root@server ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8cf6390252df nginx "/docker-entrypoint.…" 11 seconds ago Up 10 seconds 0.0.0.0:32768->80/tcp, :::32768->80/tcp wonderful_austin
[root@server ~]# docker rm 8cf6390252df #由于容器正在運(yùn)行,所以無法普通刪除
Error response from daemon: cannot remove container "/wonderful_austin": container is running: stop the container before removing or force remove
[root@server ~]# docker rm -f 8cf6390252df #通過-f強(qiáng)制刪除
8cf6390252df
[root@server ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@server ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c15039e3ae2a ubuntu "bash" 21 seconds ago Exited (0) 16 seconds ago affectionate_edison
83fd92a37ddf ubuntu "bash" 16 minutes ago Created fervent_knuth
341263befffb nginx "/docker-entrypoint.…" 18 minutes ago Created cool_jennings
[root@server ~]# docker ps -aq #-q只顯示容器ID
c15039e3ae2a
83fd92a37ddf
341263befffb
[root@server ~]# docker rm `docker ps -aq` #通過反引號包裹
c15039e3ae2a
83fd92a37ddf
341263befffb
[root@server ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
查看容器運(yùn)行狀態(tài)
[root@server ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e5475d3f8a4f nginx "/docker-entrypoint.…" 54 seconds ago Up 53 seconds 0.0.0.0:8888->80/tcp, :::8888->80/tcp web1
[root@server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e5475d3f8a4f nginx "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:8888->80/tcp, :::8888->80/tcp web1
[root@server ~]# docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e5475d3f8a4f nginx "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:8888->80/tcp, :::8888->80/tcp web1
[root@server ~]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e5475d3f8a4f nginx "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:8888->80/tcp, :::8888->80/tcp web1
停止運(yùn)行的容器docker stop/kill
[root@server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e5475d3f8a4f nginx "/docker-entrypoint.…" About an hour ago Up About an hour 0.0.0.0:8888->80/tcp, :::8888->80/tcp web1
[root@server ~]# docker stop web1
web1
[root@server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@server ~]# docker start web1
web1
[root@server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e5475d3f8a4f nginx "/docker-entrypoint.…" 2 hours ago Up 52 seconds 0.0.0.0:8888->80/tcp, :::8888->80/tcp web1
[root@server ~]# docker kill -s 9 web1 #-s 9表示強(qiáng)制終止
web1
[root@server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
激活關(guān)閉的容器docker start/restart
docker start
是一個 Docker 命令行接口(CLI)命令,用于啟動一個或多個已經(jīng)存在的、但是當(dāng)前處于停止?fàn)顟B(tài)的容器。當(dāng)你使用 docker run
命令創(chuàng)建并啟動容器后,你可以使用 docker stop
命令來停止容器。之后,如果你想再次啟動這個容器,就可以使用 docker start
命令。
基本語法如下:
docker start [OPTIONS] CONTAINER [CONTAINER...]
OPTIONS
:可選參數(shù),用于配置啟動容器的行為。雖然docker start
通常不需要額外的選項,但 Docker 提供了其他選項用于高級用途。CONTAINER
:要啟動的容器的名稱或ID。可以指定多個容器來同時啟動它們。
示例
- 啟動名為
mycontainer
的容器:
docker start mycontainer
- 啟動多個容器:
docker start container1 container2 container3
注意事項
- 在啟動容器之前,確保容器已經(jīng)創(chuàng)建并存在于 Docker 系統(tǒng)中。
- 當(dāng)你使用
docker start
命令時,容器將從其上次停止時的狀態(tài)恢復(fù),這意味著任何在容器內(nèi)部運(yùn)行的進(jìn)程將恢復(fù)執(zhí)行。 - 如果容器之前因為某種錯誤而退出,并且你想要重新啟動它,使用
docker start
通常是合適的。但是,如果容器因為配置錯誤或其他問題而不斷失敗,你可能需要進(jìn)入容器內(nèi)部進(jìn)行調(diào)試,或者重新創(chuàng)建容器。
[root@server ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@server ~]# docker restart web1
web1
[root@server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e5475d3f8a4f nginx "/docker-entrypoint.…" 2 hours ago Up 4 seconds 0.0.0.0:8888->80/tcp, :::8888->80/tcp web1
[root@server ~]# docker stop e5475d3f8a4f
e5475d3f8a4f
[root@server ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e5475d3f8a4f nginx "/docker-entrypoint.…" 2 hours ago Exited (0) 30 seconds ago web1
[root@server ~]# docker start e5475d3f8a4f
e5475d3f8a4f
[root@server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e5475d3f8a4f nginx "/docker-entrypoint.…" 2 hours ago Up 4 seconds 0.0.0.0:8888->80/tcp, :::8888->80/tcp web1
查看容器
查看容器的詳細(xì)信息docker container inspect
- 或使用
docker inspect
[root@server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e5475d3f8a4f nginx "/docker-entrypoint.…" 2 hours ago Up 6 minutes 0.0.0.0:8888->80/tcp, :::8888->80/tcp web1
[root@server ~]# docker inspect web1
[{"Id": "e5475d3f8a4f6818eb701a7b68a1f54417260510a0e3c688442139e0cf3c8eff","Created": "2024-03-24T06:03:17.50320209Z","Path": "/docker-entrypoint.sh","Args": ["nginx","-g","daemon off;"],"State": {"Status": "running","Running": true,"Paused": false,"Restarting": false,"OOMKilled": false,"Dead": false,"Pid": 38619,"ExitCode": 0,"Error": "","StartedAt": "2024-03-24T07:53:58.881752968Z","FinishedAt": "2024-03-24T07:53:42.230209857Z"},"Image": "sha256:92b11f67642b62bbb98e7e49169c346b30e20cd3c1c034d31087e46924b9312e","ResolvConfPath": "/var/lib/docker/containers/e5475d3f8a4f6818eb701a7b68a1f54417260510a0e3c688442139e0cf3c8eff/resolv.conf","HostnamePath": "/var/lib/docker/containers/e5475d3f8a4f6818eb701a7b68a1f54417260510a0e3c688442139e0cf3c8eff/hostname","HostsPath": "/var/lib/docker/containers/e5475d3f8a4f6818eb701a7b68a1f54417260510a0e3c688442139e0cf3c8eff/hosts","LogPath": "/var/lib/docker/containers/e5475d3f8a4f6818eb701a7b68a1f54417260510a0e3c688442139e0cf3c8eff/e5475d3f8a4f6818eb701a7b68a1f54417260510a0e3c688442139e0cf3c8eff-json.log","Name": "/web1","RestartCount": 0,"Driver": "overlay2","Platform": "linux","MountLabel": "","ProcessLabel": "","AppArmorProfile": "","ExecIDs": null,"HostConfig": {"Binds": null,"ContainerIDFile": "","LogConfig": {"Type": "json-file","Config": {}},"NetworkMode": "default","PortBindings": {"80/tcp": [{"HostIp": "","HostPort": "8888"}]}
[root@server ~]# docker inspect web1 | grep -i address"LinkLocalIPv6Address": "","SecondaryIPAddresses": null,"SecondaryIPv6Addresses": null,"GlobalIPv6Address": "","IPAddress": "172.17.0.2","MacAddress": "02:42:ac:11:00:02","MacAddress": "02:42:ac:11:00:02","IPAddress": "172.17.0.2","GlobalIPv6Address": "",
[root@server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e5475d3f8a4f nginx "/docker-entrypoint.…" 4 hours ago Up 2 hours 0.0.0.0:8888->80/tcp, :::8888->80/tcp web1
[root@server ~]# docker container inspect web1
[{"Id": "e5475d3f8a4f6818eb701a7b68a1f54417260510a0e3c688442139e0cf3c8eff","Created": "2024-03-24T06:03:17.50320209Z","Path": "/docker-entrypoint.sh","Args": ["nginx","-g","daemon off;"],"State": {"Status": "running","Running": true,"Paused": false,"Restarting": false,"OOMKilled": false,"Dead": false,"Pid": 38619,"ExitCode": 0,"Error": "","StartedAt": "2024-03-24T07:53:58.881752968Z","FinishedAt": "2024-03-24T07:53:42.230209857Z"},"Image": "sha256:92b11f67642b62bbb98e7e49169c346b30e20cd3c1c034d31087e46924b9312e","ResolvConfPath": "/var/lib/docker/containers/e5475d3f8a4f6818eb701a7b68a1f54417260510a0e3c688442139e0cf3c8eff/resolv.conf","HostnamePath": "/var/lib/docker/containers/e5475d3f8a4f6818eb701a7b68a1f54417260510a0e3c688442139e0cf3c8eff/hostname","HostsPath": "/var/lib/docker/containers/e5475d3f8a4f6818eb701a7b68a1f54417260510a0e3c688442139e0cf3c8eff/hosts","LogPath": "/var/lib/docker/containers/e5475d3f8a4f6818eb701a7b68a1f54417260510a0e3c688442139e0cf3c8eff/e5475d3f8a4f6818eb701a7b68a1f54417260510a0e3c688442139e0cf3c8eff-json.log","Name": "/web1","RestartCount": 0,"Driver": "overlay2","Platform": "linux","MountLabel": "","ProcessLabel": "","AppArmorProfile": "","ExecIDs": null,"HostConfig": {"Binds": null,"ContainerIDFile": "","LogConfig": {"Type": "json-file","Config": {}},"NetworkMode": "default","PortBindings": {"80/tcp": [{"HostIp": "","HostPort": "8888"}]
查看容器內(nèi)的進(jìn)程docker top
docker top
命令用于查看 Docker 容器中正在運(yùn)行的進(jìn)程。通過這個命令,你可以列出容器中所有進(jìn)程的信息,包括進(jìn)程 ID、進(jìn)程名稱、CPU 占用率、內(nèi)存占用率等。使用 docker top
命令需要指定容器的 ID 或名稱。
基本語法如下:
docker top [OPTIONS] CONTAINER [ps OPTIONS]
其中:
[OPTIONS]
是docker top
命令的可選參數(shù)。CONTAINER
是要查看的容器的名稱或 ID。[ps OPTIONS]
是傳遞給ps
命令的選項,用于定制進(jìn)程的顯示方式。
示例
-
查看容器中的進(jìn)程
使用
docker top
命令查看名為mycontainer
的容器中的進(jìn)程:docker top mycontainer
這將返回容器內(nèi)所有正在運(yùn)行的進(jìn)程列表,包括進(jìn)程 ID、進(jìn)程名稱等。
-
查看進(jìn)程并提取 CPU 和內(nèi)存信息
你可以結(jié)合其他命令(如
awk
)來提取docker top
的輸出中的特定信息,比如 CPU 和內(nèi)存使用情況:docker top mycontainer | awk '{print $2, $3, $9, $10}'
這條命令將輸出進(jìn)程名稱、PID、CPU 占用率和內(nèi)存占用率。
-
使用選項查看特定信息
docker top
命令也支持一些選項來定制輸出。例如,使用-u
選項可以以用戶為主的格式顯示進(jìn)程信息:docker top -u mycontainer
注意事項
- 在執(zhí)行
docker top
命令時,確保容器正在運(yùn)行,否則你將無法看到任何進(jìn)程信息。 - 如果容器中有多個進(jìn)程,
docker top
將顯示所有這些進(jìn)程的信息。 docker top
命令返回的是容器運(yùn)行時的實時進(jìn)程信息,如果容器中的進(jìn)程狀態(tài)發(fā)生變化,你需要重新執(zhí)行docker top
命令來查看最新的進(jìn)程信息。
總之,docker top
命令是 Docker 提供的用于查看容器內(nèi)部進(jìn)程狀態(tài)的有力工具,它可以幫助你更好地理解和監(jiān)控容器的運(yùn)行情況。
[root@server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e5475d3f8a4f nginx "/docker-entrypoint.…" 4 hours ago Up 2 hours 0.0.0.0:8888->80/tcp, :::8888->80/tcp web1[root@server ~]# docker top web1
UID PID PPID CSTIME TTY TIME CMD
root 38619 38580 015:53 pts/0 00:00:00 nginx: master process nginx -g daemon off;
101 38647 38619 015:53 pts/0 00:00:00 nginx: worker process
101 38648 38619 015:53 pts/0 00:00:00 nginx: worker process
您已經(jīng)成功地使用了 docker top
命令來查看名為 web1
的容器中的進(jìn)程信息。從您提供的輸出中,我們可以看到容器 web1
中正在運(yùn)行兩個 nginx
進(jìn)程:一個主進(jìn)程(master process)和兩個工作進(jìn)程(worker process)。
這里是每個列的解釋:
UID
:用戶ID,運(yùn)行該進(jìn)程的用戶在容器內(nèi)的唯一標(biāo)識。PID
:進(jìn)程ID,這是每個進(jìn)程在容器內(nèi)的唯一標(biāo)識。PPID
:父進(jìn)程ID,即創(chuàng)建該進(jìn)程的進(jìn)程的ID。C
:CPU利用率,這個值通常表示該進(jìn)程最近的CPU使用率。STIME
:進(jìn)程啟動時間。TTY
:進(jìn)程關(guān)聯(lián)的終端類型,如果是pts/0
,則通常表示這個進(jìn)程是在偽終端上運(yùn)行的。TIME
:該進(jìn)程自啟動以來消耗的CPU時間。CMD
:啟動進(jìn)程的命令。
從輸出中我們可以看到:
- 主進(jìn)程(PID 38619)以
nginx: master process nginx -g daemon off;
的形式運(yùn)行,這意味著它是nginx
的主進(jìn)程,并且nginx
是以守護(hù)進(jìn)程模式關(guān)閉(即在前臺運(yùn)行)啟動的。 - 兩個工作進(jìn)程(PID 38647 和 38648)以
nginx: worker process
的形式運(yùn)行,它們是處理實際HTTP請求的nginx
工作進(jìn)程。
這個輸出可以幫助您確認(rèn) nginx
在容器 web1
中正在運(yùn)行,并且有兩個工作進(jìn)程正在處理請求。如果您需要進(jìn)一步診斷或管理這些進(jìn)程,您可以使用 docker exec
命令在容器內(nèi)運(yùn)行其他命令,比如 ps
、kill
等。
docker stats
docker stats
命令用于動態(tài)顯示 Docker 容器的資源消耗情況。它可以提供關(guān)于容器使用 CPU、內(nèi)存、網(wǎng)絡(luò) I/O 和塊 I/O 等資源的實時統(tǒng)計信息。
使用 docker stats
命令時,可以指定要查看的容器名稱或 ID,也可以不指定任何參數(shù)以查看所有運(yùn)行中的容器的統(tǒng)計信息。命令的輸出將包括每個容器的 ID、名稱、CPU 使用率、內(nèi)存使用量、網(wǎng)絡(luò) I/O、塊 I/O 以及進(jìn)程數(shù)等。
此外,docker stats
命令還支持一些可選參數(shù),如 --all
用于列出所有容器的信息(包括已停止的容器,但已停止的容器不會返回任何信息),--no-stream
用于只查看容器的靜態(tài)信息,以及 --format
用于指定返回值的模板文件等。
在終端或命令行界面中運(yùn)行 docker stats
命令后,將實時顯示容器的資源使用情況??梢酝ㄟ^按 Ctrl+C
組合鍵來停止輸出。
在window上訪問Linux中運(yùn)行的nginx容器
訪問的IP地址為Linux主機(jī)的IP地址,端口是啟動nginx容器時映射的端口
查詢?nèi)萜鲀?nèi)部日志docker logs
docker logs
命令用于檢索容器的日志輸出。當(dāng)你運(yùn)行一個容器時,該容器可能會產(chǎn)生各種日志信息,比如應(yīng)用程序的運(yùn)行狀態(tài)、錯誤信息等。使用 docker logs
命令,你可以查看這些日志,以了解容器內(nèi)部的運(yùn)行情況。
基本語法如下:
docker logs [OPTIONS] CONTAINER
其中:
OPTIONS
是可選參數(shù),用于配置日志檢索的行為。CONTAINER
是你要查看日志的容器的名稱或 ID。
示例
示例1:查看容器的日志
docker logs mycontainer
這條命令會顯示名為 mycontainer
的容器的日志輸出。
示例2:實時查看容器的日志
docker logs -f mycontainer
使用 -f
或 --follow
選項,可以實時跟蹤容器的日志輸出,即當(dāng)新的日志產(chǎn)生時,它們會立即顯示在終端上。這對于觀察容器的實時運(yùn)行狀態(tài)非常有用。
示例3:查看容器的日志并限制輸出行數(shù)
docker logs --tail 10 mycontainer
使用 --tail
選項,你可以限制顯示的日志行數(shù)。在這個例子中,只顯示 mycontainer
容器的最后 10 行日志。
示例4:查看容器的日志并顯示時間戳
docker logs --timestamps mycontainer
使用 --timestamps
選項,可以在每條日志前面顯示時間戳,這有助于你了解日志的產(chǎn)生時間。
注意事項
- 如果容器已經(jīng)停止,你仍然可以查看它的日志,但實時跟蹤(使用
-f
選項)將不起作用。 - 默認(rèn)情況下,
docker logs
顯示的是容器的標(biāo)準(zhǔn)輸出(stdout)和標(biāo)準(zhǔn)錯誤(stderr)。如果你需要查看其他類型的日志,可能需要調(diào)整你的應(yīng)用程序或服務(wù)的日志配置。 - 如果容器的日志量非常大,使用
docker logs
可能會產(chǎn)生大量的輸出。在這種情況下,使用--tail
選項來限制輸出行數(shù)可能是個好主意。
[root@server ~]# docker logs 容器名或容器ID
docker wait
docker wait
命令用于阻塞一個或多個 Docker 容器,直到這些容器停止運(yùn)行,并在容器退出時打印出它們的退出代碼。這個命令對于需要等待容器完成其任務(wù)并獲取其退出狀態(tài)的情況非常有用。
命令的基本語法如下:
docker wait [OPTIONS] CONTAINER [CONTAINER...]
其中 CONTAINER
可以是容器的 ID 或名稱,并且可以指定多個容器。
使用示例
- 首先,啟動一個 Docker 容器,并給它一個名稱,例如
my_container
:
docker run --name my_container -dit ubuntu bash
- 然后,使用
docker wait
命令等待這個容器退出:
docker wait my_container
此時,docker wait
命令會阻塞,直到 my_container
容器停止運(yùn)行。一旦容器停止,docker wait
會打印出容器的退出代碼。
- 你可以在另一個終端窗口中停止
my_container
容器,例如使用docker stop
命令:
docker stop my_container
當(dāng)容器停止后,之前運(yùn)行的 docker wait
命令會退出并打印出容器的退出代碼。
注意事項
docker wait
命令不會顯示容器內(nèi)部的日志或輸出,它只關(guān)注容器的運(yùn)行狀態(tài)和退出代碼。- 如果容器已經(jīng)在運(yùn)行并且沒有退出,
docker wait
命令會阻塞直到容器退出。 - 退出代碼通常用于表示容器執(zhí)行的結(jié)果,例如 0 通常表示成功,非零值表示出錯或異常。
通過使用 docker wait
命令,你可以確保在容器完成其任務(wù)并退出之前,其他依賴于該容器狀態(tài)的操作不會繼續(xù)執(zhí)行。這對于構(gòu)建自動化腳本和容器編排非常有用。
進(jìn)入容器docker exec
- 在使用
-d
參數(shù)時,容器啟動后會進(jìn)入后臺,用戶無法看到容器中的信息,也無法進(jìn)行操作 - 這個時候如果需要進(jìn)入容器進(jìn)行操作,推薦使用官方的
attach
或exec
命令
docker exec
是一個 Docker 命令,用于在正在運(yùn)行的容器中執(zhí)行命令。它允許你在容器的上下文中運(yùn)行任何命令,就像你在容器的 shell 中手動執(zhí)行一樣。這對于需要在運(yùn)行中的容器中進(jìn)行診斷、調(diào)試或執(zhí)行其他任務(wù)時非常有用。
基本語法如下:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
其中:
OPTIONS
:是可選的,用于配置docker exec
命令的行為。CONTAINER
:是要在其中執(zhí)行命令的容器的名稱或ID。COMMAND
:是要在容器內(nèi)執(zhí)行的命令。ARG...
:是傳遞給命令的參數(shù)。
常用選項
-i
:保持標(biāo)準(zhǔn)輸入打開,通常與-t
一起使用,以便與容器進(jìn)行交互。-t
:分配一個偽終端,這通常用于創(chuàng)建一個交互式的 shell 會話。-d
:在后臺運(yùn)行命令。-u
:以指定的用戶身份執(zhí)行命令。-e
:設(shè)置環(huán)境變量。
示例
- 在容器中啟動交互式 bash shell:
docker exec -it mycontainer /bin/bash
這將在名為 mycontainer
的容器中啟動一個交互式的 bash shell,允許你與容器進(jìn)行交互。
- 在容器中執(zhí)行單個命令:
docker exec mycontainer ls -l
這將在 mycontainer
容器中執(zhí)行 ls -l
命令,并顯示結(jié)果。
- 在容器中執(zhí)行多個命令:
如果你想在容器中執(zhí)行多個命令,你需要將它們連接起來并通過 shell 執(zhí)行。例如:
docker exec mycontainer bash -c "cd /some/directory && ls -l"
在這個例子中,我們首先切換到 /some/directory
目錄,然后列出該目錄的內(nèi)容。
請注意,要使用 docker exec
命令,容器必須已經(jīng)啟動并且至少有一個進(jìn)程正在運(yùn)行。如果容器沒有運(yùn)行,你需要先使用 docker start
命令啟動它。
對于 docker exec
的更多詳細(xì)信息和可用選項,你可以查閱 Docker 官方文檔或使用 docker exec --help
命令來獲取幫助。
[root@server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e5475d3f8a4f nginx "/docker-entrypoint.…" 2 hours ago Up 22 minutes 0.0.0.0:8888->80/tcp, :::8888->80/tcp web1
[root@server ~]# docker exec -it e5475d3f8a4f /bin/bash
root@e5475d3f8a4f:/# ls
bin docker-entrypoint.d home media proc sbin tmp
boot docker-entrypoint.sh lib mnt root srv usr
dev etc lib64 opt run sys var
root@e5475d3f8a4f:/#
導(dǎo)出容器docker export
docker export
命令用于將 Docker 容器的文件系統(tǒng)導(dǎo)出為一個 tar 歸檔文件。這對于備份容器狀態(tài)、遷移容器到其他機(jī)器或共享容器的文件系統(tǒng)非常有用。
基本語法如下:
docker export [OPTIONS] CONTAINER
其中 CONTAINER
是要導(dǎo)出文件系統(tǒng)的容器的名稱或 ID。
選項
-o
或--output
:用于指定輸出的文件名或路徑。如果不指定,tar 歸檔文件將默認(rèn)輸出到標(biāo)準(zhǔn)輸出(stdout)。
使用示例
-
導(dǎo)出容器到標(biāo)準(zhǔn)輸出
將名為
mycontainer
的容器的文件系統(tǒng)導(dǎo)出到標(biāo)準(zhǔn)輸出,并將輸出重定向到一個 tar 文件:docker export mycontainer > mycontainer.tar
-
導(dǎo)出容器到指定文件
使用
-o
選項直接將容器導(dǎo)出到指定的 tar 文件:docker export -o mycontainer.tar mycontainer
-
按日期保存為 tar 文件
你可以結(jié)合 shell 命令來按日期保存 tar 文件:
docker export -o mysql-`date +%Y%m%d`.tar b5t2r1x794o3
這將會導(dǎo)出 ID 為
b5t2r1x794o3
的容器的文件系統(tǒng),并以當(dāng)前日期命名 tar 文件。
注意事項
- 導(dǎo)出的 tar 文件僅包含容器的文件系統(tǒng),并不包含容器的配置信息(如環(huán)境變量、網(wǎng)絡(luò)配置等)。
- 如果需要遷移或備份整個容器狀態(tài),除了文件系統(tǒng)外,還需要考慮其他配置和元數(shù)據(jù)。
- 導(dǎo)出的 tar 文件可以在其他 Docker 環(huán)境中使用
docker import
命令導(dǎo)入,以創(chuàng)建一個新的鏡像。
docker export
命令是 Docker 工具鏈中用于管理容器文件系統(tǒng)的重要命令之一,尤其在需要遷移、備份或共享容器狀態(tài)時非常有用。
導(dǎo)入容器docker import
docker import
命令用于將本地文件系統(tǒng)上的文件或目錄,或者從遠(yuǎn)程URL導(dǎo)入為Docker鏡像。
其基本語法如下:
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
參數(shù)說明:
OPTIONS
:可選參數(shù),用于配置導(dǎo)入操作的一些選項。file|URL|-
:必需參數(shù),指定要導(dǎo)入的文件路徑或URL??梢允且粋€文件路徑,也可以是一個URL,或者使用-
表示從標(biāo)準(zhǔn)輸入中讀取tar歸檔文件。REPOSITORY
:可選參數(shù),指定要創(chuàng)建的新鏡像的名稱。TAG
:可選參數(shù),指定要創(chuàng)建的新鏡像的標(biāo)簽。
示例
示例1:從本地文件系統(tǒng)導(dǎo)入
假設(shè)我們有一個名為example.tar
的tar歸檔文件,它包含了我們想要導(dǎo)入的文件系統(tǒng)。我們可以使用docker import
命令來創(chuàng)建一個新的鏡像:
docker import example.tar myimage:1.0
這將會將example.tar
中的文件系統(tǒng)導(dǎo)入到myimage:1.0
鏡像中。之后,我們可以使用docker run
命令來運(yùn)行這個新建的容器。
示例2:從遠(yuǎn)程URL導(dǎo)入
如果我們想要從一個遠(yuǎn)程URL導(dǎo)入文件系統(tǒng),我們可以直接將URL作為參數(shù)傳遞給docker import
命令:
docker import http://example.com/path/to/image.tar myimage:1.0
這將會將遠(yuǎn)程URL中的文件系統(tǒng)導(dǎo)入到myimage:1.0
鏡像中。
注意事項
如果在使用docker import
命令時遇到無法啟動容器的問題,可能的原因包括導(dǎo)入的文件或URL中缺少依賴項或配置文件,或者與宿主機(jī)環(huán)境不兼容等。這時,需要檢查導(dǎo)入的文件或URL是否包含所需的依賴項和配置文件,以及宿主機(jī)環(huán)境是否與導(dǎo)入的鏡像兼容。如果以上方法都無法解決問題,可以嘗試重新導(dǎo)入鏡像。
請注意,docker import
命令創(chuàng)建的鏡像可能不如使用Dockerfile創(chuàng)建的鏡像透明和可維護(hù)。在可能的情況下,推薦使用Dockerfile來構(gòu)建和管理鏡像。
查看容器的IP地址
root@e5475d3f8a4f:/# hostname -I
172.17.0.2root@e5475d3f8a4f:/# hostname -i
172.17.0.2
查看容器中的環(huán)境變量
[root@server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e5475d3f8a4f nginx "/docker-entrypoint.…" 2 hours ago Up 31 minutes 0.0.0.0:8888->80/tcp, :::8888->80/tcp web1
[root@server ~]# docker exec -it web1 echo $PATH
/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
其他容器命令
docker rename
修改容器名
- 或使用
docker container rename
[root@server _data]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
630a7fa66f4c nginx:latest "/docker-entrypoint.…" 4 minutes ago Up 4 minutes 0.0.0.0:32770->80/tcp, :::32770->80/tcp web1
[root@server _data]# docker container rename web1 nginx-web1
[root@server _data]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
630a7fa66f4c nginx:latest "/docker-entrypoint.…" 5 minutes ago Up 5 minutes 0.0.0.0:32770->80/tcp, :::32770->80/tcp nginx-web1
[root@server _data]# docker rename nginx-web1 web1
[root@server _data]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
630a7fa66f4c nginx:latest "/docker-entrypoint.…" 5 minutes ago Up 5 minutes 0.0.0.0:32770->80/tcp, :::32770->80/tcp web1
docker cp
docker cp
命令用于在 Docker 容器與本地文件系統(tǒng) 之間復(fù)制文件或目錄。這個命令允許你將文件或目錄從容器內(nèi)部復(fù)制到主機(jī)上,或者將文件或目錄從主機(jī)復(fù)制到容器內(nèi)部。這對于備份容器內(nèi)的數(shù)據(jù)、在容器和主機(jī)之間傳輸文件以及在容器內(nèi)設(shè)置初始文件等場景非常有用。
命令的基本語法如下:
- 從容器復(fù)制到宿主機(jī):
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
- 從宿主機(jī)復(fù)制到容器:
docker cp [OPTIONS] SRC_PATH DEST_PATH CONTAINER:DEST_PATH
其中:
CONTAINER
可以是容器的 ID 或名稱,無論是正在運(yùn)行還是已停止的容器都可以使用。SRC_PATH
是源文件或目錄在容器內(nèi)的路徑。DEST_PATH
是目標(biāo)路徑在主機(jī)上的位置,或者是目標(biāo)路徑在容器內(nèi)的位置(當(dāng)從主機(jī)復(fù)制到容器時)。
注意,docker cp
命令會假定容器路徑相對于容器的根(/
)目錄,而主機(jī)路徑則是相對于執(zhí)行 docker cp
命令的當(dāng)前目錄。
此外,docker cp
命令還支持一些可選參數(shù):
-a
:將復(fù)制的文件或目錄保留其原始屬性,包括所有者、權(quán)限等。-L
:如果SRC_PATH
是一個符號鏈接,則復(fù)制鏈接指向的文件或目錄。-p
:保留源文件或目錄的時間戳。-R
或-r
:遞歸復(fù)制整個目錄。
使用 docker cp
命令時,請確保目標(biāo)路徑是可寫的,并且具有足夠的權(quán)限來執(zhí)行復(fù)制操作。
docker diff
docker diff
命令用于檢查 Docker 容器內(nèi)文件系統(tǒng)的更改。當(dāng)運(yùn)行了一個容器后,你可能想知道容器內(nèi)修改了哪些文件,這時就可以使用 docker diff
命令。
該命令的語法為:docker diff <container_name or container_id>
,其中 <container_name or container_id>
是容器的名稱或 ID。
執(zhí)行 docker diff
命令后,將輸出類似于下面的內(nèi)容:
C /path/to/changed/file
:表示文件被修改。D /path/to/deleted/file
:表示文件被刪除。A /path/to/added/file
:表示文件被添加。
例如,如果你想查看名為 mycontainer
的容器內(nèi)的文件變化,可以執(zhí)行 docker diff mycontainer
。這將列出所有在容器內(nèi)被添加、刪除或修改的文件路徑。
此外,當(dāng)在容器中刪除文件時,如果你想在主機(jī)上同步刪除這些文件,可以使用 docker diff
命令查看容器中的文件變化,并使用正則表達(dá)式匹配出被刪除的文件路徑,然后在主機(jī)上執(zhí)行刪除操作。
docker port
docker port
命令用于查看容器的端口映射信息。在 Docker 中,容器的端口默認(rèn)是私有的,也就是說,容器內(nèi)部運(yùn)行的服務(wù)只能在容器內(nèi)部訪問。為了使得這些服務(wù)能夠被外部訪問,我們需要使用端口映射功能,將容器內(nèi)的端口映射到宿主機(jī)的某個端口上。docker port
命令就是用來查看這種映射關(guān)系的。
使用 docker port
命令時,需要指定容器的名稱或 ID,以及容器內(nèi)部的端口號。命令的基本語法如下:
docker port <container_name or container_id> <container_port>
其中,<container_name or container_id>
是你想要查看端口映射信息的容器的名稱或 ID,<container_port>
是容器內(nèi)部的端口號。
例如,假設(shè)你有一個名為 mycontainer
的容器,容器內(nèi)部運(yùn)行著一個服務(wù),監(jiān)聽在端口 8080
上。你可以使用以下命令來查看這個端口在宿主機(jī)上的映射情況:
docker port mycontainer 8080
如果端口已經(jīng)被映射到了宿主機(jī)的某個端口上,docker port
命令會輸出宿主機(jī)的 IP 地址和端口號。例如:
0.0.0.0:32768
這表示容器內(nèi)部的 8080
端口被映射到了宿主機(jī)的 32768
端口上,并且宿主機(jī)的任何 IP 地址都可以訪問這個端口。
需要注意的是,如果容器內(nèi)部的端口沒有被映射到宿主機(jī)上,docker port
命令將不會返回任何輸出。此外,如果容器沒有運(yùn)行,該命令也無法獲取到端口映射信息。
[root@server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e5475d3f8a4f nginx "/docker-entrypoint.…" 4 hours ago Up 2 hours 0.0.0.0:8888->80/tcp, :::8888->80/tcp web1[root@server ~]# docker port web1
80/tcp -> 0.0.0.0:8888
80/tcp -> [::]:8888
docker update
docker update
命令用于更新一個或多個正在運(yùn)行的容器的配置。它可以用來改變?nèi)萜鞯馁Y源限制,如 CPU 和內(nèi)存,或者調(diào)整容器的重啟策略等。
以下是 docker update
命令的一些常用選項和示例:
- 更新 CPU 使用量限制:
使用--cpus
選項來設(shè)置容器可使用的 CPU 核心數(shù)。
docker update --cpus=2 my_container
這會將 my_container
容器的 CPU 使用量限制設(shè)置為 2 個核心。
2. 更新內(nèi)存使用限制:
使用 --memory
選項來設(shè)置容器可使用的內(nèi)存限制。你可以使用單位(如 MB、GB)來指定內(nèi)存大小。
docker update --memory=512m my_container
這將把 my_container
容器的內(nèi)存使用限制設(shè)置為 512MB。
3. 設(shè)置容器的重啟策略:
使用 --restart
選項來設(shè)置容器的重啟策略。可能的值包括 no
(不重啟)、on-failure[:<max-retries>]
(出錯時重啟,最多重試次數(shù))和 always
(總是重啟)。
docker update --restart=on-failure:3 my_container
這會將 my_container
容器的重啟策略設(shè)置為在出錯時重試 3 次。
4. 更新容器的網(wǎng)絡(luò)設(shè)置:
雖然 docker update
命令主要用于更新容器的資源限制和重啟策略,但也可以用來更改容器的網(wǎng)絡(luò)配置,例如添加或刪除網(wǎng)絡(luò)接口、更改 IP 地址等。具體的網(wǎng)絡(luò)設(shè)置更新方法會根據(jù)你的網(wǎng)絡(luò)配置和需求而有所不同。
需要注意的是,更新容器的配置可能會影響到容器內(nèi)運(yùn)行的應(yīng)用程序和服務(wù)的性能和行為。因此,在執(zhí)行 docker update
命令之前,最好先了解各個選項的作用,并測試其對容器和應(yīng)用程序的影響。
另外,一些配置(如網(wǎng)絡(luò)設(shè)置)可能需要在創(chuàng)建容器時就指定,而不是在容器運(yùn)行后再進(jìn)行更新。如果你發(fā)現(xiàn)某些配置無法通過 docker update
命令進(jìn)行修改,可能需要考慮重新創(chuàng)建容器并指定正確的配置。