網(wǎng)站設(shè)計與制作教程1百度搜索引擎優(yōu)化怎么做
第 1?章:核心概念與安裝配置
本章首先介紹Docker 的三大核心概念:
- 鏡像 (Image)
- 容器(Container)
- 倉庫(Repository)
只有理解了這三個核心概念,才能順利地理解Docker容器的整個生命周期。
隨后,將介紹如何在CentOS操作系統(tǒng)上安裝Docker。
1.1 核心概念
Docker 大部分的操作都圍繞著它的三大核心概念: 鏡像、容器和倉庫。因此,準(zhǔn)確把握這三大核心概念對于掌握Docker技術(shù)尤為重要。
1. Docker 鏡像
Docker 鏡像類似于虛擬機(jī)鏡像,可以將它理解為一個只讀的模板。
例如,一個鏡像可以包含一個基本的操作系統(tǒng)環(huán)境,里面僅安裝了Apache應(yīng)用程序(或用戶需要的其他軟件)。 可以把它稱為一個Apache鏡像。
鏡像是創(chuàng)建Docker容器的基礎(chǔ)。
通過版本管理和增量的文件系統(tǒng), Docker 提供了一套十分簡單的機(jī)制來創(chuàng)建和更新現(xiàn)有的鏡像,用戶甚至可以從網(wǎng)上下載一個已經(jīng)做好的應(yīng)用鏡像,并直接使用。
2. Docker 容器
Docker 容器類似于一個輕量級的沙箱, Docker利用容器來運(yùn)行和隔離應(yīng)用。
容器是從鏡像創(chuàng)建的應(yīng)用運(yùn)行實例。 它可以啟動、開始、停止、 刪除,而這些容器都是彼此相互隔離、互不可見的。
可以把容器看作一個簡易版的 Linux 系統(tǒng)環(huán)境(包括root用戶權(quán)限、進(jìn)程空間、用戶空間和網(wǎng)絡(luò)空間等)以及運(yùn)行在其中的應(yīng)用程序打包而成的盒子。
注:鏡像自身是只讀的。 容器從鏡像啟動的時候,會在鏡像的最上層創(chuàng)建一個可寫層。
3. Docker 倉庫
Docker 倉庫類似于代碼倉庫,是Docker集中存放鏡像文件的場所。
有時候我們會將Docker倉庫和倉庫注冊服務(wù)器(Registry)混為一談,并不嚴(yán)格區(qū)分。 實際上,倉庫注冊服務(wù)器是存放倉庫的地方,其上往往存放著多個倉庫。 每個倉庫集中存放某一類鏡像,往往包括多個鏡像文件,通過不同的標(biāo)簽(tag)來進(jìn)行區(qū)分。 例如存放Ubuntu 操作系統(tǒng)鏡像的倉庫,被稱為 Ubuntu 倉庫,其中可能包括 16.04、 18.04 等不同版本的鏡像。倉庫注冊服務(wù)器的示例如圖2-1所示。
根據(jù)所存儲的鏡像公開分享與否, Docker倉庫可以分為公開倉庫(Public)和私有倉庫(Private)兩種形式。
目前,最大的公開倉庫是官方提供的Docker Hub,其中存放著數(shù)量龐大的鏡像供用戶下載。 國內(nèi)不少云服務(wù)提供商(如騰訊云、 阿里云等)也提供了倉庫的本地源,可以提供穩(wěn)定的國內(nèi)訪問。
當(dāng)然,用戶如果不希望公開分享自己的鏡像文件, Docker 也支持用戶在本地網(wǎng)絡(luò)內(nèi)創(chuàng)建 一個只能自己訪問的私有倉庫。
當(dāng)用戶創(chuàng)建了自己的鏡像之后就可以使用push命令將它上傳到指定的公有或者私有倉 庫。 這樣用戶下次在另外一臺機(jī)器上使用該鏡像時,只需要將其從倉庫上pull下來就可以了。
注意:可以看出, Docker利用倉庫管理鏡像的設(shè)計理念與 Git代碼倉庫的概念非常相似,實際上Docker 設(shè)計上借鑒了 Git 的很多優(yōu)秀思想。
1.2 安裝Docker 引擎
Docker引擎是使用 Docker容器的核心組件,可以在主流的操作系統(tǒng)和云平臺上使用,包括Linux操作系統(tǒng)(如 Ubuntu、Debian, CentOS、 Red.hat 等), macOS 和 Windows 操作系統(tǒng), 以及IBM、亞馬遜、微軟等知名云平臺。
用戶可以訪問Docker官網(wǎng)的 Get Docker ( https://www.docker.com/get-docker)頁面,查看獲取Docker 的方式,以及Docker支持的平臺類型,如圖 2-2所示。
目前Docker 支持 Docker 引擎、 Docker Hub、 Docker Cloud 等多種服務(wù)。
- Docker 引擎:包括支持在桌面系統(tǒng)或云平臺安裝 Docker,以及為企業(yè)提供簡單安全 彈性的容器集群編排和管理;
- DockerHub:官方提供的云托管服務(wù),可以提供公有或私有的鏡像倉庫;
- DockerCloud :官方提供的容器云服務(wù),可以完成容器的部署與管理,可以完整地支 持容器化項目,還有CI、 CD功能。
1.CentOS 環(huán)境下安裝 Docker
Docker 目前支持 CentOS 7 及以后的版本。 系統(tǒng)的要求跟 Ubuntu 情況類似, 64 位操作 系統(tǒng),內(nèi)核版本至少為3.10。
首先,為了方便添加軟件源,以及支持devicemapper存儲類型,安裝如下軟件包:
$ sudo yum update
$ sudo yum instal l -y yum-utils \
device-mapper-persistent-data \
lvm2
添加Docker 穩(wěn)定版本的 yum軟件源:
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
之后更新yum軟件源緩存,并安裝Docker:
sudo yum update sudo yum install -y docker-ce
最后,確認(rèn)Docker服務(wù)啟動正常:
sudo systernctl start docker
2.通過腳本安裝
用戶還可以使用官方提供的 shell 腳本來在 Linux 系統(tǒng)上安裝 Docker 的最新正式版本,該腳本會自動檢測系統(tǒng)信息并進(jìn)行相應(yīng)配置:
curl -fsSL https://get.docker.com/ | sh
或者:
wget -qO- https://get.docker.com/ | sh
如果想嘗鮮最新功能,可以使用下面的腳本來安裝最新的“嘗鮮”版本。 但要注意,非穩(wěn)定版本往往意味著功能還不夠穩(wěn)定,不要在生產(chǎn)環(huán)境中使用:
curl -fsSL https://test.docker.com/ | sh
另外, 也可以從store.docker.com/search?offering=community&q=&type=edition找到各個平臺上的Docker安裝包,自行下載使用。
1.3 配置Docker服務(wù)
為了避免每次使用 Docker 命令時都需要切換到特權(quán)身份,可以將當(dāng)前用戶加入安裝中自動創(chuàng)建的docker用戶組,代碼如下:
sudo usermod -aG docker USER_NAME
用戶更新組信息,退出并重新登錄后即可生效。
Docker 服務(wù)啟動時實際上是調(diào)用了dockerd命令,支持多種啟動參數(shù)。 因此,用戶可以直接通過執(zhí)行dockerd命令來啟動Docker服務(wù),如下面的命令啟動Docker服務(wù),開啟 Debug 模式,并監(jiān)聽在本地的 2376端口:
dockerd -D -H tcp://127.0.0.1:2376
這些選項可以寫入/etc/docker/路徑下的 daemon.json 文件中,由 dockerd服務(wù)啟動時讀取:
對于CentOS、 RedHat等系統(tǒng),服務(wù)通過 systemd來管理,配置文件路徑為/etc/systemd/ system/docker.service.d/docker.conf。更新配置后需要通過 systemctl 命令來管理 Docker 服務(wù):
sudo systemctl daemon-reload
sudo systemctl start docker.service
此外,如果服務(wù)工作不正常,可以通過查看Docker 服務(wù)的日志信息來確定問題,例如在RedHat 系統(tǒng)上日志文件可能為/var/log/messages,在CentOS 系統(tǒng)上可以執(zhí)行命令:
journalctl -u?docker.service
每次重啟 Docker服務(wù)后,可以通過查看Docker信息(docker info命令),確保服務(wù)已經(jīng)正常運(yùn)行。
第 2 章:使用Docker鏡像
鏡像是Docker三大核心概念中最重要的, 自 Docker誕生之日起鏡像就是相關(guān)社區(qū)最為熱門的關(guān)鍵詞。
Docker 運(yùn)行容器前需要本地存在對應(yīng)的鏡像, 如果鏡像不存在,Docker 會嘗試先從默認(rèn)鏡像倉庫下載(默認(rèn)使用 DockerHub 公共注冊服務(wù)器中的倉庫,用戶也可以通過配置, 使用自定義的鏡像倉庫。
本章將圍繞鏡像這一核心概念介紹具體操作, 包括如何使用pull命令從國內(nèi)倉庫中下載鏡像到本地;如何查看本地已有的鏡像信息和管理鏡像標(biāo)簽;如何在遠(yuǎn)端倉庫使用 search 命令進(jìn)行搜索和過濾;如何刪除鏡像標(biāo)簽和鏡像文件;如何創(chuàng)建用戶定制的鏡像并且保存為外部文件。 最后,還將介紹如何往國內(nèi)倉庫中推送自己的鏡像。
2.1 配置國內(nèi)鏡像源并獲取鏡像
鏡像是運(yùn)行容器的前提, 官方的DockerHub網(wǎng)站已經(jīng)提供了數(shù)十萬個鏡像供大家開放下載。但由于DockerHub倉庫在國內(nèi)訪問需要加速器,所以需要配置國內(nèi)鏡像源。本節(jié)主要介紹Docker鏡像的pull子命令。
首先進(jìn)入/etc/docker/daemon.json文件中添加一下鏡像:
[root@open-Euler1 docker]# cat /etc/docker/daemon.json
{"registry-mirrors": ["https://docker.m.daocloud.io","https://hub-mirror.c.163.com","https://mirror.baidubce.com","https://docker.nju.edu.cn"]
}
可以使用docker [image] pull 命令直接從配置的鏡像源來下載鏡像。 該命令的格式為
docker [image] pull NAME[:TAG]
其中, NAME是鏡像倉庫名稱(用來區(qū)分鏡像), TAG是鏡像的標(biāo)簽(往往用來表示版本信息)。 通常情況下,描述一個鏡像需要包括 “名稱+標(biāo)簽“ 信息。
例如, 獲取一個Ubuntu 18.04系統(tǒng)的基礎(chǔ)鏡像可以使用如下的命令:
docker pull ubuntu:18.04
18. 04: Pulling from library/ubuntu
......
Digest: sha256:e27e9d7f7f28d67aa9e2d7540bdc2b33254b452ee8e60f388875e5b7d9b2b696
S七atus: Downloaded newer image for ubuntu:18.04
對于Docker鏡像來說, 如果不顯式指定TAG, 則默認(rèn)會選擇latest標(biāo)簽,這會下載倉庫中最新版本的鏡像。
下面的例子將從Ubuntu倉庫下載一個最新版本的Ubuntu操作系統(tǒng)的鏡像:
docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
......
Digest: sha256:e27e9d7f7f28d67aa9e2d7540bdc2b33254b452ee8e60f388875e5b7d9b2b696
Status: Downloaded newer image for ubuntu:latest
該命令實際上下載的就是 ubuntu:latest鏡像。
注意:一般來說, 鏡像的latest 標(biāo)簽意味著該鏡像的內(nèi)容會跟蹤最新版本的變更而變化, 內(nèi) 容是不穩(wěn)定的。因此,從穩(wěn)定性上考慮,不要在生產(chǎn)環(huán)境中忽略鏡像的標(biāo)簽信息或使用默認(rèn)的latest 標(biāo)記的鏡像。
下載過程中可以看出 ,鏡像文件一般由若干層(layer)組成 ,6c953ac5d795這樣的串是層的唯一id(實際上完整的id包括256比特,64個十六進(jìn)制字符組成)。使用docker pull命令下載中會獲取并輸出鏡像的各層信息。當(dāng)不同的鏡像包括相同的層時,本地僅存儲了層的一份內(nèi)容,減小了存儲空間。
大家可能會想到,在不同的鏡像倉庫服務(wù)器的情況下,可能會出現(xiàn)鏡像重名的情況。
嚴(yán)格地講,鏡像的倉庫名稱中還應(yīng)該添加倉庫地址(即registry, 注冊服務(wù)器)作為前綴,只是默認(rèn)使用的是官方DockerHub服務(wù),該前綴可以忽略。
不過Docker 會通過你在?daemon.json
?中配置的?registry-mirrors
?列表來嘗試下載?ubuntu
?鏡像,而不是直接從 Docker Hub 下載。如果第一個鏡像站點(diǎn)不可用,Docker 會自動嘗試列表中的下一個,直到鏡像被成功下載或列表中的所有鏡像站點(diǎn)都嘗試過。
總之,通過這種方式,你可以簡化?docker pull
?命令,不需要為每個鏡像手動添加前綴,同時還能享受到加速下載的好處。
pull子命令支持的選項主要包括:
-a, --all-tags=true|false:是否獲取倉庫中的所有鏡像,默認(rèn)為否;
--disable-content-trust:取消鏡像的內(nèi)容校驗,默認(rèn)為真。
另外,有時需要使用鏡像代理服務(wù)來加速Docker鏡像獲取過程 ,可以在Docker服務(wù)啟動配置中增加--registry-mirror=proxy_URL來指定鏡像代理服務(wù)地址
下載鏡像到本地后,即可隨時使用該鏡像了,例如利用該鏡像創(chuàng)建一個容器,在其中運(yùn) 行bash應(yīng)用,執(zhí)行打印 "Hello World"命令:
docker run -it ubuntu:18.04 bash
root@65663247040f:/# echo "Hello World"
Hello World
roo七@65663247040f:/# exit
2.2 查看鏡像信息
本節(jié)主要介紹Docker鏡像的ls、tag和inspect子命令。
1. 使用images命令列出鏡像
使用docker images或docker image ls 命令可以列出本地主機(jī)上已有鏡像的基本信息。
例如,下面的命令列出了上一小節(jié)中下載的鏡像信息:
[root@open-Euler1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
wordpress latest 458dad822ff7 3 weeks ago 701MB
nginx latest b52e0b094bc0 4 weeks ago 192MB
busybox latest 31311c5853a2 5 months ago 4.27MB
reg.yym.com/library/busybox latest 31311c5853a2 5 months ago 4.27MB
myubuntu 18.04 f9a80a55f492 21 months ago 63.2MB
ubuntu 18.04 f9a80a55f492 21 months ago 63.2MB
reg.yym.com/openlab/ubuntu 18.04 f9a80a55f492 21 months ago 63.2MB
mysql 5.6 dd3b2a5dcb48 3 years ago 303MB
在列出信息中,可以看到幾個字段信息:
- 來自于哪個倉庫,比如ubuntu表示ubuntu系列的基礎(chǔ)鏡像;
- 鏡像的標(biāo)答信息,比如 18.04、latest表示不同的版本信息。 標(biāo)簽只是標(biāo)記,并不能標(biāo) 識鏡像內(nèi)容;
- 鏡像的ID(唯一標(biāo)識鏡像),如果兩個鏡像的ID相同,說明它們實際上指向了同一 個鏡像,只是具有不同標(biāo)簽名稱而已;
- 創(chuàng)建時間,說明鏡像最后的更新時間;
- 鏡像大小,優(yōu)秀的鏡像往往體積都較小。
其中鏡像的ID信息十分重要,它唯一標(biāo)識了鏡像。在使用鏡像ID的時候,一般可以使用該ID的前若干個字符組成的可區(qū)分串來替代完整的ID。
TAG 信息用于標(biāo)記來自同一個倉庫的不同鏡像。例如ubuntu 倉庫中有多個鏡像,通過 TAG 信息來區(qū)分發(fā)行版本,如18.04、18.10 等。
鏡像大小信息只是表示了該鏡像的邏輯體積大小,實際上由于相同的鏡像層本地只會存儲一份,物理上占用的存儲空間會小于各鏡像邏輯體積之和。
images子命令主要支持如下選項,用戶可以自行進(jìn)行嘗試:
- -a, --all=true |?false: 列出所有(包括臨時文件)鏡像文件,默認(rèn)為否;
- --digests=true | false: 列出鏡像的數(shù)字摘要值,默認(rèn)為否;
- -f, --filter=[]?: 過濾列出的鏡像,如dangling=true只顯示沒有被使用的鏡像;也可指定帶有特定標(biāo)注的鏡像等;
- --format="TEMPLATE" : 控制輸出格式,如. ID代表ID信息,.Repository 代表倉庫信息等;
- --no-trunc=true |?false: 對輸出結(jié)果中太長的部分是否進(jìn)行截斷,如鏡像的ID 信息,默認(rèn)為是;
- -q, --quiet=true |?false: 僅輸出ID信息, 默認(rèn)為否。
更多子命令選項還可以通過man docker-images來查看。
2. 使用tag命令添加鏡像標(biāo)簽
為了方便在后續(xù)工作中使用特定鏡像,還可以使用docker tag命令來為本地鏡像任意添加新的標(biāo)簽。 例如,添加一個新的myubuntu:latest鏡像標(biāo)簽:
docker tag ubuntu:18.04 myubuntu:18.04
再次使用docker images列出本地主機(jī)上鏡像信息,可以看到多了一個myubuntu:18.04標(biāo)簽的鏡像:
[root@open-Euler1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
wordpress latest 458dad822ff7 3 weeks ago 701MB
nginx latest b52e0b094bc0 4 weeks ago 192MB
reg.yym.com/library/busybox latest 31311c5853a2 5 months ago 4.27MB
busybox latest 31311c5853a2 5 months ago 4.27MB
myubuntu 18.04 f9a80a55f492 21 months ago 63.2MB
ubuntu 18.04 f9a80a55f492 21 months ago 63.2MB
reg.yym.com/openlab/ubuntu 18.04 f9a80a55f492 21 months ago 63.2MB
mysql 5.6 dd3b2a5dcb48 3 years ago 303MB
之后,用戶就可以直接使用myubuntu:18.04來表示這個鏡像了。
注意:這些myubuntu:18.04鏡像的ID跟ubuntu:18.04是完全一致的,它們實際上指向了同一個鏡像文件,只是別名不同而巳。docker tag命令添加的標(biāo)簽實際上起到了類似鏈接的作用。
3.使用inspect命令查看詳細(xì)信息
[root@open-Euler1 ~]# docker inspect ubuntu:18.04
[{"Id": "sha256:f9a80a55f492e823bf5d51f1bd5f87ea3eed1cb31788686aa99a2fb61a27af6a","RepoTags": ["myubuntu:18.04","ubuntu:18.04","reg.yym.com/openlab/ubuntu:18.04"],"RepoDigests": ["reg.yym.com/openlab/ubuntu@sha256:0891d22f55fab66664581bbfca80601dfc9d6e8fff8f65a493e9f96644e29417"],"Parent": "","Comment": "","Created": "2023-05-30T09:32:09.432301537Z","DockerVersion": "20.10.21","Author": "","Config": {"Hostname": "","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd": ["/bin/bash"],"Image": "sha256:e24e6fe4d70b767b0621c909f548dab783f946ef6d9346ecc2272730b821a402","Volumes": null,"WorkingDir": "","Entrypoint": null,"OnBuild": null,"Labels": {"org.opencontainers.image.ref.name": "ubuntu","org.opencontainers.image.version": "18.04"}},"Architecture": "amd64","Os": "linux","Size": 63156473,"GraphDriver": {"Data": {"MergedDir": "/var/lib/docker/overlay2/926b8629b6c6a80e8f5763650a82542ebc1a730897eac9969eb9941f8058ce9b/merged","UpperDir": "/var/lib/docker/overlay2/926b8629b6c6a80e8f5763650a82542ebc1a730897eac9969eb9941f8058ce9b/diff","WorkDir": "/var/lib/docker/overlay2/926b8629b6c6a80e8f5763650a82542ebc1a730897eac9969eb9941f8058ce9b/work"},"Name": "overlay2"},"RootFS": {"Type": "layers","Layers": ["sha256:548a79621a426b4eb077c926eabac5a8620c454fb230640253e1b44dc7dd7562"]},"Metadata": {"LastTagTime": "2025-03-09T16:15:06.918305625+08:00"}}
]
4.使用history命令查看鏡像歷史
既然鏡像文件由多個層組成, 那么怎么知道各個層的內(nèi)容具體是什么呢?這時候可以使用history子命令, 該命令將列出各層的創(chuàng)建信息。
例如,查看ubuntu:18.04 鏡像的創(chuàng)建過程,可以使用如下命令:
[root@open-Euler1 ~]# docker history ubuntu:18.04
IMAGE CREATED CREATED BY SIZE COMMENT
f9a80a55f492 21 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 21 months ago /bin/sh -c #(nop) ADD file:3c74e7e08cbf9a876… 63.2MB
<missing> 21 months ago /bin/sh -c #(nop) LABEL org.opencontainers.… 0B
<missing> 21 months ago /bin/sh -c #(nop) LABEL org.opencontainers.… 0B
<missing> 21 months ago /bin/sh -c #(nop) ARG LAUNCHPAD_BUILD_ARCH 0B
<missing> 21 months ago /bin/sh -c #(nop) ARG RELEASE 0B
注意, 過長的命令被自動截斷了,可以使用前面提到的--no-trunc選項來輸出完整的命令。
2.3 搜尋鏡像
本節(jié)主要介紹Docker 鏡像的search子命令。 使用docker search命令可以搜索Docker Hub官方倉庫中的鏡像。語法為docker search [option] keyword。支持的命令選項主要包括:
例如, 搜索官方提供的帶nginx關(guān)鍵字的鏡像,如下所示:
2.4 刪除和清理鏡像
本節(jié)主要介紹Docker鏡像的rm和prune子命令。
1.使用標(biāo)簽刪除鏡像
使用docker rmi或docker image rm命令可以刪除鏡像,命令格式為docker rmi IMAGE [IMAGE ... ], 其中IMAGE可以為標(biāo)簽或 ID。
支持選項包括:
例如, 要刪除掉myubuntu:latest鏡像, 可以使用如下命令:
docker rmi myubuntu:18.04
大家可能會想到,本地的ubuntu:18.04鏡像是否會受到此命令的影響。 無須擔(dān)心, 當(dāng)同一個鏡像擁有多個標(biāo)簽的時候, docker rmi 命令只是刪除了該鏡像多個標(biāo)簽中的指定標(biāo)簽而已,并不影響鏡像文件。 因此上述操作相當(dāng)于只是刪除了鏡像f9a80a55f492的一 個標(biāo)簽副本而已。
但當(dāng)鏡像只剩下一個標(biāo)簽的時候就要小心了, 此時再使用docker rmi命令會徹底刪除鏡像。
例如通過執(zhí)行docker rmi命令來刪除只有一個標(biāo)簽的鏡像,可以看出會刪除這個鏡像文件的所有文件層:
[root@open-Euler1 ~]# docker rmi busybox:latest
Untagged: busybox:latest
Untagged: busybox@sha256:498a000f370d8c37927118ed80afe8adc38d1edcbfc071627d17b25c88efcab0
2. 使用鏡像ID來刪除鏡像
當(dāng)使用docker rmi 命令,并且后面跟上鏡像的ID(也可以是能進(jìn)行區(qū)分的部分ID串前綴)時,會先嘗試刪除所有指向該鏡像的標(biāo)簽,然后刪除該鏡像文件本身。
注意,當(dāng)有該鏡像創(chuàng)建的容器存在時,鏡像文件默認(rèn)是無法被刪除的,例如:先利用ubuntu:18.04鏡像創(chuàng)建一個簡單的容器來輸出一段話:
使用docker ps -a命令可以看到本機(jī)上存在的所有容器:
可以看到, 后臺存在一個退出狀態(tài)的容器,是剛基于ubuntu:18.04鏡像創(chuàng)建的。試圖刪除該鏡像,Docker會提示有容器正在運(yùn)行, 無法刪除:
如果要想強(qiáng)行刪除鏡像,可以使用-f參數(shù):
注意,通常并不推薦使用-f參數(shù)來強(qiáng)制刪除一個存在容器依賴的鏡像。正確的做法是,先刪除依賴該鏡像的所有容器,再來刪除鏡像。
首先刪除容器a21c0840213e:
然后使用ID來刪除鏡像, 此時會正常打印出刪除的各層信息:
3. 清理鏡像
使用Docker一段時間后, 系統(tǒng)中可能會遺留一些臨時的鏡像文件, 以及一些沒有被使用的鏡像, 可以通過docker image prune命令來進(jìn)行清理。
支待選項包括:
例如,如下命令會自動清理臨時的遺留鏡像文件層,最后會提示釋放的存儲空間:
2.5?存出和載入鏡像
本節(jié)主要介紹 Docker 鏡像的 save 和 load子命令。 用戶可以使用 docker [image] save 和 docker [image] load命令來存出和載人鏡像。
1. 存出鏡像
如果要導(dǎo)出鏡像到本地文件,可以使用docker [image] save命令。 該命令支持-o、-output string 參數(shù), 導(dǎo)出鏡像到指定的文件中。
例如,導(dǎo)出本地的ubuntu:18.04 鏡像為文件ubuntu_18.04.tar,如下所示:
[root@open-Euler1 ~]# docker save -o ubuntu_18.04.tar ubuntu:18.04
[root@open-Euler1 ~]# ll
total 645544
-rw-------. 1 root root 884 Jan 10 11:11 anaconda-ks.cfg
-rw-r--r-- 1 root root 9150593 Mar 1 11:03 apache-tomcat-8.0.30.tar.gz
-rw-r--r-- 1 root root 30720 Mar 8 12:09 backup.tar
-rw-r--r-- 1 root root 586290688 Mar 8 12:56 discuz.tar
-rw-r--r-- 1 root root 27 Mar 2 17:11 index.html
-rw------- 1 root root 65541632 Mar 9 16:26 ubuntu_18.04.tar
之后,用戶就可以通過復(fù)制ubuntu_18.04.tar文件將該鏡像分享給他人。
2. 載入鏡像
可以使用docker [image] load將導(dǎo)出的 tar 文件再導(dǎo)人到本地鏡像庫。支持-i、-input string 選項,從指定文件中讀入鏡像內(nèi)容。
例如,從文件ubuntu_18.04.tar 導(dǎo)人鏡像到本地鏡像列表,如下所示:
docker load -i ubuntu_18.04.tar
或者
docker load < ubuntu_18.04.tar
這將導(dǎo)入鏡像及其相關(guān)的元數(shù)據(jù)信息(包括標(biāo)簽等)。導(dǎo)入成功后,可以使用docker images命令進(jìn)行查看, 與原鏡像一致。
第 3?章:操作Docker容器
容器是Docker 的另一個核心概念。 簡單來說,容器是鏡像的一個運(yùn)行實例。所不同的是,鏡像是靜態(tài)的只讀文件,而容器帶有運(yùn)行時需要的可寫文件層,同時,容器中的應(yīng)用進(jìn)程處于運(yùn)行狀態(tài)。
如果認(rèn)為虛擬機(jī)是模擬運(yùn)行的一整套操作系統(tǒng)(包括內(nèi)核、 應(yīng)用運(yùn)行態(tài)環(huán)境和其他系統(tǒng)環(huán)境)和跑在上面的應(yīng)用。 那么 Docker 容器就是獨(dú)立運(yùn)行的一個(或一組)應(yīng)用,以及它們必需的運(yùn)行環(huán)境。
本章將具體介紹圍繞容器的重要操作,包括創(chuàng)建一個容器、 啟動容器、終止一個容器、進(jìn)入容器內(nèi)執(zhí)行操作、刪除容器和通過導(dǎo)入導(dǎo)出容器來實現(xiàn)容器遷移等。
3.1 創(chuàng)建容器
從現(xiàn)在開始,忘掉“臃腫”的虛擬機(jī)吧,對容器的操作就像直接操作應(yīng)用一樣簡單和快速。
本節(jié)主要介紹Docker容器的 create、 start、 run,、wait 和 logs 子命令。
1. 新建容器
可以使用docker [container] create 命令創(chuàng)建一個容器,例如:
[root@open-Euler2 ~]# docker create -it busybox:latest
22c599d83bcb4393f2a7c4749a809c86d1735ddeb3b720356db57213e2e9f2e9
[root@open-Euler2 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
22c599d83bcb busybox:latest "sh" 4 seconds ago Created musing_sutherland
[root@open-Euler2 ~]#
使用docker [container] create 命令新建的容器處于停止?fàn)顟B(tài),可以使用 docker [container] start 命令來啟動它。
由于容器是整個Docker技術(shù)棧的核心, create命令和后續(xù)的run命令支持的選項都 十分復(fù)雜,需要在實踐中不斷體會。
選項主要包括如下幾大類: 與容器運(yùn)行模式相關(guān)、與容器環(huán)境配置相關(guān)、與容器資源限制和安全保護(hù)相關(guān),參見表4-1~表4-3。
2. 啟動容器
使用docker [container] start 命令來啟動一個已經(jīng)創(chuàng)建的容器。例如,啟動剛創(chuàng)建的busybox容器,然后通過docker ps命令,可以查看到一個運(yùn)行中的容器:
[root@open-Euler2 ~]# docker start 22c599d83bcb #通過容器id啟動
22c599d83bcb
[root@open-Euler2 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
22c599d83bcb busybox:latest "sh" 6 minutes ago Up 14 seconds musing_sutherland
3. 新建并啟動容器
除了創(chuàng)建容器后通過start命令來啟動也可以直接新建并啟動容器。
所需要的命令主要為docker [container]run,等價于先執(zhí)行docker [container] create 命令,再執(zhí)行docker [container] start 命令。
例如,下面的命令輸出一個“Hello World!"之后容器自動終止:
[root@open-Euler2 ~]# docker run ubuntu /bin/echo 'Hello World!'
Hello World!
[root@open-Euler2 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7f620e289a32 ubuntu "/bin/echo 'Hello Wo…" 46 seconds ago Exited (0) 45 seconds ago zen_chaum
這跟在本地直接執(zhí)行/bin/echo 'Hello World!"?相比幾乎感覺不出任何區(qū)別。
當(dāng)利用 docker [container] run來創(chuàng)建并啟動容器時, Docker在后臺運(yùn)行的標(biāo)準(zhǔn)操作包括:
- 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載;
- 利用鏡像創(chuàng)建一個容器,并啟動該容器;
- 分配一個文件系統(tǒng)給容器,并在只讀的鏡像層外面掛載一層可讀寫層;
- 從宿主主機(jī)配置的網(wǎng)橋接口中橋接一個虛擬接口到容器中去;
- 從網(wǎng)橋的地址池配置一個IP地址給容器;
- 執(zhí)行用戶指定的應(yīng)用程序;
- 執(zhí)行完畢后容器被自動終止。
下面的命令啟動一個bash終端,允許用戶進(jìn)行交互:
[root@open-Euler2 ~]# docker run -it ubuntu /bin/bash
root@28d877face35:/#
其中,-t 選項讓Docker分配一個偽終端(pseudo-tty)并綁定到容器的標(biāo)準(zhǔn)輸入上,-i 則讓容器的標(biāo)準(zhǔn)輸入保持打開。 更多的命令選項可以通過man docker-run命令來查看。
在交互模式下,用戶可以通過所創(chuàng)建的終端來輸人命令,例如:
root@28d877face35:/# pwd
/
root@28d877face35:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@28d877face35:/# psPID TTY TIME CMD1 pts/0 00:00:00 bash10 pts/0 00:00:00 ps
在容器內(nèi)用ps命令查看進(jìn)程,可以看到,只運(yùn)行了bash應(yīng)用,并沒有運(yùn)行其他無關(guān)的進(jìn)程。 用戶可以按Ctrl+d或輸入exit 命令來退出容器。
對于所創(chuàng)建的 bash 容器,當(dāng)用戶使用exit命令退出 bash 進(jìn)程之后,容器也會自動退出。 這是因為對于容器來說,當(dāng)其中的應(yīng)用退出后,容器的使命完成,也就沒有繼續(xù)運(yùn)行的必要了。
4. 守護(hù)態(tài)運(yùn)行
更多的時候,需要讓Docker容器在后臺以守護(hù)態(tài)(Daemonized)形式運(yùn)行。 此時,可以通過添加-d參數(shù)來實現(xiàn)。
例如,下面的命令會在后臺運(yùn)行容器:
[root@open-Euler2 ~]# docker run -itd ubuntu:latest
552e48e07720bf063b6f4c4208c04188d98afee57c9a0f3cf6d4fec5ca1d5d9b
[root@open-Euler2 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
552e48e07720 ubuntu:latest "/bin/bash" 4 seconds ago Up 3 seconds frosty_dirac
5. 查看容器輸出
要獲取容器的輸出信息,可以通過docker [container] logs命令。
例如,查看某容器的輸出可以使用如下命令:
[root@open-Euler2 ~]# docker logs 552e48e07720
root@552e48e07720:/# pwd
/
root@552e48e07720:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@552e48e07720:/# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 09:23 pts/0 00:00:00 /bin/bash
root 10 1 0 09:25 pts/0 00:00:00 ps -ef
root@552e48e07720:/#
exit
3.2 停止容器
本節(jié)主要介紹Docker容器的 pause/unpause、 stop 和 prune 子命令。
1. 暫停容器
可以使用docker [container] pause CONTAINER [CONTAINER ... ]命令來暫停一個運(yùn)行中的容器。
例如,啟動一個容器,并將其暫停:
[root@open-Euler2 ~]# docker run --name test1 --rm -it ubuntu bash
root@3d0b00932ba4:/# (這里可以用ctrl+p然后ctrl+q后臺運(yùn)行該容器)
[root@open-Euler2 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3d0b00932ba4 ubuntu "bash" 19 seconds ago Up 19 seconds test1
[root@open-Euler2 ~]# docker pause test1
test1
[root@open-Euler2 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3d0b00932ba4 ubuntu "bash" 43 seconds ago Up 43 seconds (Paused) test1
處于 paused 狀態(tài)的容器,可以使用 docker [container] unpause CONTAINER [CONTAINER ... ] 命令來恢復(fù)到運(yùn)行狀態(tài)。
2. 終止容器
可以使用docker [container] stop 來終止一個運(yùn)行中的容器。 該命令的格式為 docker [container] stop [-t | --time [=10]]? [CONTA工NER... ] 。
該命令會首先向容器發(fā)送SIGTERM信號,等待一段超時時間后(默認(rèn)為 10 秒),再發(fā)送SIGKILL 信號來終止容器:
[root@open-Euler2 ~]# docker stop 3d0b00932ba4
3d0b00932ba4
此時,執(zhí)行docker container prune 命令,會自動清除掉所有處于停止?fàn)顟B(tài)的容器。
此外,還可以通過docker [container] kill 直接發(fā)送SIGKILL信號來強(qiáng)行終止容器。
當(dāng) Docker 容器中指定的應(yīng)用終結(jié)時,容器也會自動終止。 例如,對于上一章節(jié)中只啟動了一個終端的容器,用戶通過exit命令或Ctrl+d來退出終端時,所創(chuàng)建的容器立刻終止,處于stopped狀態(tài)。
可以用docker ps -qa命令看到所有容器的 ID。 例如:
[root@open-Euler1 ~]# docker ps -aq
2b7d17d89536
62a2df1db920
處于終止?fàn)顟B(tài)的容器,可以通過docker [container] start命令來重新啟動:
[root@open-Euler2 ~]# docker run -itd ubuntu
5301c6e2b355b1459af95e73214b9f2abd1eb86c044e6a771214150335f78dd7
[root@open-Euler2 ~]# docker stop 5301c6e2b355
5301c6e2b355
[root@open-Euler2 ~]# docker start 5301c6e2b355
5301c6e2b355
[root@open-Euler2 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5301c6e2b355 ubuntu "/bin/bash" 5 minutes ago Up 4 seconds loving_hamilton
注意:Docker 容器在后臺運(yùn)行時,通常依賴于一個前臺進(jìn)程。如果這個進(jìn)程退出,容器就會自動停止。這通常是容器自動關(guān)閉的最常見原因。如果你在創(chuàng)建容器時沒有指定一個前臺運(yùn)行的命令,容器啟動后沒有前臺進(jìn)程在運(yùn)行,它就會立即退出。例如,如果你只運(yùn)行了?
docker run -d ubuntu
?而沒有指定要運(yùn)行的命令,容器會啟動然后立即停止。
docker [container] restart 命令會將一個運(yùn)行態(tài)的容器先終止,然后再重新啟動:
[root@open-Euler2 ~]# docker restart 5301c6e2b355
5301c6e2b355
[root@open-Euler2 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5301c6e2b355 ubuntu "/bin/bash" 17 minutes ago Up 5 seconds loving_hamilton
3.3 進(jìn)入容器
在使用-d參數(shù)時,容器啟動后會進(jìn)入后臺,用戶無法看到容器中的信息,也無法進(jìn)?操作。
這個時候如果需要進(jìn)入容器進(jìn)行操作,推薦使用官方的attach或exec命令。
1. attach 命令
attach 是 Docker自帶的命令,命令格式為:
docker [container] attach [--detach-keys[=[]]] [--no-stdin] [--sig-proxy[=true]] CONTAINER
這個命令支持三個主要選項:
下面示例如何使用該命令:
[root@open-Euler2 ~]# docker run -itd ubuntu
724bce51d10962c460c0fea34233b70c7df48cf4177a7bb3eaae5e8b2b58b330
[root@open-Euler2 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
724bce51d109 ubuntu "/bin/bash" 6 seconds ago Up 5 seconds laughing_haslett
[root@open-Euler2 ~]# docker attach 724bce51d109
root@724bce51d109:/#
docker attach
?的限制
同步顯示:當(dāng)多個終端窗口使用?
docker attach
?命令連接到同一個容器時,所有窗口都會同步顯示相同的輸出。這意味著,如果一個窗口執(zhí)行了一個命令,其輸出會出現(xiàn)在所有連接的窗口中。阻塞問題:如果容器中的某個前臺進(jìn)程阻塞了(例如,等待用戶輸入),所有通過?
docker attach
?連接的會話都會被阻塞。這導(dǎo)致其他窗口無法執(zhí)行操作,直到阻塞的命令被解除。退出行為:當(dāng)你通過?
docker attach
?進(jìn)入容器并運(yùn)行 bash 時,如果你退出 bash(例如,通過輸入?exit
),容器會因為沒有前臺進(jìn)程在運(yùn)行而停止。這是因為 Docker 容器在沒有前臺進(jìn)程運(yùn)行時會自動停止。
2.exec 命令
從Docker 的 1.3.0 版本起, Docker提供了一個更加方便的工具exec命令,可以在運(yùn)行中容器內(nèi)直接執(zhí)行任意命令。
該命令的基本格式為:
比較重要的參數(shù)有:
例如,進(jìn)入到剛創(chuàng)建的容器中,并啟動一個bash:
[root@open-Euler2 ~]# docker exec -it 163622efdbfb bash
root@163622efdbfb:/# exit
[root@open-Euler2 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
163622efdbfb ubuntu "/bin/bash" 9 minutes ago Up 9 minutes sad_mclaren
可以看到會打開一個新的bash終端,在不影響容器內(nèi)其他應(yīng)用的前提下,用戶可以與容器進(jìn)行交互。在退出這個終端后docker容器依舊在運(yùn)行。
注意:通過指定-it參數(shù)來保持標(biāo)準(zhǔn)輸入打開,并且分配一個偽終端。 通過exec命令對容器執(zhí)行操作是最為推薦的方式。
3.4 刪除容器
可以使用docker [container) rm命令來刪除處于終止或退出狀態(tài)的容器,命令格式為
主要支持的選項包括:
例如,查看容器信息,并刪除:
[root@open-Euler2 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
163622efdbfb ubuntu "/bin/bash" 15 minutes ago Up 15 minutes sad_mclaren
[root@open-Euler2 ~]# docker rm -f 163622efdbfb
3.5 導(dǎo)入和導(dǎo)出容器
某些時候,需要將容器從一個系統(tǒng)遷移到另外一個系統(tǒng),此時可以使用 Docker 的導(dǎo)入和導(dǎo)出功能,這也是Docker自身提供的一個重要特性。
1. 導(dǎo)出容器
導(dǎo)出容器是指,導(dǎo)出一個已經(jīng)創(chuàng)建的容器到一個文件,不管此時這個容器是否處于運(yùn)行狀態(tài)。 可以使用docker [container] export 命令,該命令格式為:
其中,可以通過-O選項來指定導(dǎo)出的tar文件名,也可以直接通過重定向來實現(xiàn)。
首先,查看所有的容器,如下所示:
[root@open-Euler2 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6f90ba016d87 ubuntu "/bin/bash" 3 seconds ago Exited (0) 2 seconds ago tender_galileo
163622efdbfb ubuntu "/bin/bash" 30 minutes ago Up 30 minutes sad_mclaren
分別導(dǎo)出容器163622efdbfb和6f90ba016d87?容器到文件test_for_run.tar文件和test_for_stop.tar文件:
[root@open-Euler2 ~]# docker export -o test_for_stop.tar 6f90ba016d87
[root@open-Euler2 ~]# ls
anaconda-ks.cfg docker docker-28.0.1.tgz test_for_stop.tar
[root@open-Euler2 ~]# docker export 163622efdbfb > test_for_run.tar
[root@open-Euler2 ~]# ls
anaconda-ks.cfg docker docker-28.0.1.tgz test_for_run.tar test_for_stop.tar
之后,可將導(dǎo)出的tar文件傳輸?shù)狡渌麢C(jī)器上,然后再通過導(dǎo)人命令導(dǎo)入到系統(tǒng)中,實現(xiàn)容器的遷移。
2. 導(dǎo)入容器
導(dǎo)出的文件又可以使用docker [container] import 命令導(dǎo)入變成鏡像,該命令格式為:
下面將導(dǎo)出的test_for_run.tar和test_for_stop.tar文件導(dǎo)入到系統(tǒng)中:
從本地文件導(dǎo)入
[root@open-Euler2 ~]# docker import test_for_run.tar test/ubuntu:latest
sha256:2870932093027479e25dd3ba0ce271e2f5165ab6888211f5da5cfde67871714e
從本地文件導(dǎo)入
[root@open-Euler2 ~]# cat test_for_stop.tar | docker import - test1/ubuntu:latest
sha256:e2a387d82e57fc391ec26eff072da08afe93b82c48c321e6f8b61040636c8c44
[root@open-Euler2 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test1/ubuntu latest e2a387d82e57 About a minute ago 78.1MB
test/ubuntu latest 287093209302 2 minutes ago 78.1MB
ubuntu latest a04dc4851cbc 5 weeks ago 78.1MB
busybox latest 31311c5853a2 5 months ago 4.27MB
reg.yym.com/library/busybox latest 31311c5853a2 5 months ago 4.27MB
實際上,既可以使用docker load命令來導(dǎo)入鏡像存儲文件到本地鏡像庫,也可以使用docker [container] import 命令來導(dǎo)入一個容器快照到本地鏡像庫。這兩者的區(qū)別在于:容器快照文件將丟棄所有的歷史記錄和元數(shù)據(jù)信息(僅保存容器當(dāng)時的快照狀態(tài)),而鏡像存儲文件將保存完整記錄,體積更大。 此外,從容器快照文件導(dǎo)入時可以重新指定標(biāo)簽等元數(shù)據(jù)信息。
3.6 查看容器
本節(jié)主要介紹Docker容器的inspect、 top 和 stats子命令。
1 . 查看容器詳情
查看容器詳情可以使用docker container inspect [OPTIONS] CONTAINER [CONTAINER . .. ]子命令。
例如,查看某容器的具體信息,會以json格式返回包括容器Id、 創(chuàng)建時間、路徑、狀態(tài)、鏡像、配置等在內(nèi)的各項信息:
[root@open-Euler2 ~]# docker inspect 163622efdbfb
[{"Id": "163622efdbfb20af07e9e6683329b10040cec7908da3aba32816198f74992cc9","Created": "2025-03-09T10:10:41.968207238Z","Path": "/bin/bash","Args": [],"State": {"Status": "running","Running": true,"Paused": false,"Restarting": false,"OOMKilled": false,"Dead": false,"Pid": 5297,"ExitCode": 0,"Error": "","StartedAt": "2025-03-09T10:10:42.088967496Z","FinishedAt": "0001-01-01T00:00:00Z"},"Image": "sha256:a04dc4851cbcbb42b54d1f52a41f5f9eca6a5fd03748c3f6eb2cbeb238ca99bd","ResolvConfPath": "/var/lib/docker/containers/163622efdbfb20af07e9e6683329b10040cec7908da3aba32816198f74992cc9/resolv.conf","HostnamePath": "/var/lib/docker/containers/163622efdbfb20af07e9e6683329b10040cec7908da3aba32816198f74992cc9/hostname","HostsPath": "/var/lib/docker/containers/163622efdbfb20af07e9e6683329b10040cec7908da3aba32816198f74992cc9/hosts","LogPath": "/var/lib/docker/containers/163622efdbfb20af07e9e6683329b10040cec7908da3aba32816198f74992cc9/163622efdbfb20af07e9e6683329b10040cec7908da3aba32816198f74992cc9-json.log","Name": "/sad_mclaren","RestartCount": 0,"Driver": "overlay2","Platform": "linux","MountLabel": "","ProcessLabel": "","AppArmorProfile": "","ExecIDs": null,"HostConfig": {"Binds": null,"ContainerIDFile": "","LogConfig": {"Type": "json-file","Config": {}},"NetworkMode": "bridge","PortBindings": {},"RestartPolicy": {"Name": "no","MaximumRetryCount": 0},"AutoRemove": false,"VolumeDriver": "","VolumesFrom": null,"ConsoleSize": [53,131],"CapAdd": null,"CapDrop": null,"CgroupnsMode": "host","Dns": [],"DnsOptions": [],"DnsSearch": [],"ExtraHosts": null,"GroupAdd": null,"IpcMode": "private","Cgroup": "","Links": null,"OomScoreAdj": 0,"PidMode": "","Privileged": false,"PublishAllPorts": false,"ReadonlyRootfs": false,"SecurityOpt": null,"UTSMode": "","UsernsMode": "","ShmSize": 67108864,"Runtime": "runc","Isolation": "","CpuShares": 0,"Memory": 0,"NanoCpus": 0,"CgroupParent": "","BlkioWeight": 0,"BlkioWeightDevice": [],"BlkioDeviceReadBps": [],"BlkioDeviceWriteBps": [],"BlkioDeviceReadIOps": [],"BlkioDeviceWriteIOps": [],"CpuPeriod": 0,"CpuQuota": 0,"CpuRealtimePeriod": 0,"CpuRealtimeRuntime": 0,"CpusetCpus": "","CpusetMems": "","Devices": [],"DeviceCgroupRules": null,"DeviceRequests": null,"MemoryReservation": 0,"MemorySwap": 0,"MemorySwappiness": null,"OomKillDisable": false,"PidsLimit": null,"Ulimits": [],"CpuCount": 0,"CpuPercent": 0,"IOMaximumIOps": 0,"IOMaximumBandwidth": 0,"MaskedPaths": ["/proc/asound","/proc/acpi","/proc/kcore","/proc/keys","/proc/latency_stats","/proc/timer_list","/proc/timer_stats","/proc/sched_debug","/proc/scsi","/sys/firmware","/sys/devices/virtual/powercap"],"ReadonlyPaths": ["/proc/bus","/proc/fs","/proc/irq","/proc/sys","/proc/sysrq-trigger"]},"GraphDriver": {"Data": {"LowerDir": "/var/lib/docker/overlay2/3706374a37c42283828eddcc48dae753e2163b75bccd434ab95646f25f832fd8-init/diff:/var/lib/docker/overlay2/b84437fb662c47b2bd81a8cbd37c8fd5942cc53bda52ad4c04ca5ad9ee5734c5/diff","MergedDir": "/var/lib/docker/overlay2/3706374a37c42283828eddcc48dae753e2163b75bccd434ab95646f25f832fd8/merged","UpperDir": "/var/lib/docker/overlay2/3706374a37c42283828eddcc48dae753e2163b75bccd434ab95646f25f832fd8/diff","WorkDir": "/var/lib/docker/overlay2/3706374a37c42283828eddcc48dae753e2163b75bccd434ab95646f25f832fd8/work"},"Name": "overlay2"},"Mounts": [],"Config": {"Hostname": "163622efdbfb","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"Tty": true,"OpenStdin": true,"StdinOnce": false,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd": ["/bin/bash"],"Image": "ubuntu","Volumes": null,"WorkingDir": "","Entrypoint": null,"OnBuild": null,"Labels": {"org.opencontainers.image.ref.name": "ubuntu","org.opencontainers.image.version": "24.04"}},"NetworkSettings": {"Bridge": "","SandboxID": "54ef1aa90e578ab95a9312a67535bcc54301fe61fecb0d359d2d7108156d4f1a","SandboxKey": "/var/run/docker/netns/54ef1aa90e57","Ports": {},"HairpinMode": false,"LinkLocalIPv6Address": "","LinkLocalIPv6PrefixLen": 0,"SecondaryIPAddresses": null,"SecondaryIPv6Addresses": null,"EndpointID": "411700c6f651957227448d3ed62631fa6b4225767abde9188c0aaa7e8a3fbe63","Gateway": "172.17.0.1","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"IPAddress": "172.17.0.2","IPPrefixLen": 16,"IPv6Gateway": "","MacAddress": "02:42:ac:11:00:02","Networks": {"bridge": {"IPAMConfig": null,"Links": null,"Aliases": null,"MacAddress": "02:42:ac:11:00:02","NetworkID": "510077d34566ca7d2e3594e34653a4b07424e460fd9fe8b4d0769fe7e6e8d758","EndpointID": "411700c6f651957227448d3ed62631fa6b4225767abde9188c0aaa7e8a3fbe63","Gateway": "172.17.0.1","IPAddress": "172.17.0.2","IPPrefixLen": 16,"IPv6Gateway": "","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"DriverOpts": null,"DNSNames": null}}}}
]
2. 查看容器內(nèi)進(jìn)程
查看容器內(nèi)進(jìn)程可以使用docker [container] top [OPTIONS] CONTAINER [CONTAINER . .. ]?子命令。
這個子命令類似于Linux 系統(tǒng)中的 top命令,會打印出容器內(nèi)的進(jìn)程信息,包括PID、 用戶、時間、命令等。 例如,查看某容器內(nèi)的進(jìn)程信息,命令如下:
[root@open-Euler2 ~]# docker top 163622efdbfb
UID PID PPID C STIME TTY TIME CMD
root 5297 5276 0 18:10 pts/0 00:00:00 /bin/bash
3. 查看統(tǒng)計信息
查看統(tǒng)計信息可以使用docker [container] stats [OPTIONS] [CONTAINER ... ] 子命令,會動態(tài)顯示CPU、內(nèi)存、存儲、網(wǎng)絡(luò)等使用情況的統(tǒng)計信息。
支持選項包括:
例如,查看當(dāng)前運(yùn)行中容器的系統(tǒng)資源使用統(tǒng)計:
[root@open-Euler2 ~]# docker stats 163622efdbfb CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
163622efdbfb sad_mclaren 0.00% 592KiB / 1.394GiB 0.04% 1.44kB / 0B 0B / 0B 1
3.7 其他容器命令
本節(jié)主要介紹Docker容器的 cp、 diff、 port和update子命令。
1. 復(fù)制文件
container cp 命令支持在容器和主機(jī)之間復(fù)制文件。命令格式為docker [container] cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH |-。 支持的選項包括:
例如,將本地的路徑data復(fù)制到test容器的/tmp路徑下:
[root@open-Euler2 ~]# docker container cp test.txt 163622efdbfb:/tmp/
Successfully copied 2.05kB to 163622efdbfb:/tmp/
2. 查看變更
container diff 查看容器內(nèi)文件系統(tǒng)的變更。 命令格式為 docker [container] diff CONTAINER。
例如,查看指定容器內(nèi)的數(shù)據(jù)修改:
[root@open-Euler2 ~]# docker container diff 163622efdbfb
C /root
A /root/.bash_history
C /tmp
A /tmp/test.txt
3. 查看端口映射
container port 命令可以查看容器的端口映射情況。 命令格式為docker container port CONTAINER [PRIVATE_PORT[/PROTO]] 。例如,查看指定容器的端口映射情況:
[root@open-Euler2 ~]# docker container port 163622efdbfb
9000/tcp -> 0.0.0.0:9000
4. 更新配置
container update 命令可以更新容器的一些運(yùn)行時配置,主要是一些資源限制份額。 命令格式為docker [container] update [OPTIONS] CONTAINER [CONTAINER .. . ] 。
支持的選項包括: