- 一、幫助命令
- 二、執行第一個容器:hello-world
- 2.1 執行命令
- 2.2 命令執行流程圖
- 三、映象相關命令及其基本操作
- 3.1 登入私有映象倉庫
- 3.2 拉取映象
- 3.3 檢視映象基本資訊
- 3.3.1 docker images 命令檢視映象基本資訊
- (一)、
docker images
命令常用選項-a
: 顯示所有的映象(包括臨時映象檔案)- -q : 只顯示映象ID
--digests
: 顯示映象再要資訊- --digests=true | false:列出映象的數字摘要值
--no-trunc
: 顯示完整的映象資訊
- 3.4 檢視映象詳細資訊
- 3.4.1 使用
docker inspect
命令獲取映象的詳細資訊 - 3.4.2
docker inspect
命令選項- -f : 可以使用golang的語言模板語法獲取所需資訊。
- 3.4.1 使用
- 3.5 為映象新增tag
- 3.6 檢視映象構建歷史
- 3.7 搜尋映象
- 3.7.1 docker search 搜尋映象
- 3.7.2
docker search
命令常用選項- -f :過濾
-s
:列出蒐藏不小於指定值的映象--automated
: 只列出 automated build 型別的映象--limit
: 限制輸出結果- --no-trunc: 不截斷輸出結果
- 3.8 刪除映象
- 3.8.1 使用docker rmi命令刪除映象
- (一)、docker rmi命令選項
- -f : 強制刪除。映象已經執行為容器則無法刪除,可以使用-f強制刪除。
- 3.8.1 使用docker rmi命令刪除映象
- 3.9 清理映象
docker image prune
命令選項
- 3.10 推送映象
- 3.11 構建映象
- 1、儲存容器為映象
docker commit
命令選項
- 2、匯入與匯出容器
export
和import
比較- export
- import
- 3、匯入和匯出映象
- 1、儲存容器為映象
- 四、容器常用命令及基本操作
- 4.1
docker ps
檢視容器- 4.1.1
docker ps
常用選項
- 4.1.1
- 4.2 檢視容器日誌
- 4.2.1
docker logs
檢視容器日誌 - 4.2.2
docker logs
命令選項
- 4.2.1
- 4.3 執行容器
- 4.3.1 docker run 執行容器
- 4.3.2
docker run
命令常用選項
- 4.5 目錄掛載(容器資料卷操作)
- 4.5.1 匿名掛載
- 4.5.2 具名掛載
- 4.5.3 指定目錄掛載
- 4.5.4 檢視目錄掛載關係
- 4.5.5 只讀/讀寫
- 4.5.6 volumes-from(繼承)
- 4.6 退出容器
- 4.7 重啟容器
- 4.8 啟動容器
- 4.9 停止容器
- 4.10 強制停止容器
- 4.11 刪除已停止的容器
- 4.12 進入容器
- 4.12.1 attach
- 4.12.2
exec
(官方推薦使用) - 4.12.3 nsenter
- 4.12.4 ssh
- 4.12.5 建立並進入容器
- 4.12.6 守護式方式建立容器
- 4.12.7 登入守護式容器方式
- 4.12.8 退出當前容器
- 4.13 停止與啟動容器
- 4.14 複製檔案
- 4.14.1 從容器內複製檔案到宿主主機
- 4.14.2 從宿主機複製檔案到容器
- 4.15 刪除容器
- 4.16 檢視容器IP地址
- 4.1
一、幫助命令
docker version
: 檢視Docker版本資訊docker info
: 檢視Docker資訊docker --help
: 檢視幫助資訊
二、執行第一個容器:hello-world
2.1 執行命令
在命令列中輸入以下命令並執行:
docker run hello-world
透過執行 hello-world
映象來驗證 Docker Engine
是否已正確安裝。
2.2 命令執行流程圖
docker run hello-world
命令執行流程圖如下。
三、映象相關命令及其基本操作
官方文件:https://docs.docker.com/reference/
3.1 登入私有映象倉庫
- 命令格式:
docker login [選項] [映象倉庫URL]
以下以阿里雲舉例:
sudo docker login --username=你的阿里雲使用者名稱 registry.cn-hangzhou.aliyuncs.com/stupid_kid/stupid_kid
3.2 拉取映象
-
格式:docker pull
[映象倉庫URL]/[名稱空間名稱]/[倉庫名稱]:[映象版本號]
-
示例 :
docker pull docker.io/library/busybox:latest
-
欄位說明
URL 名稱空間 倉庫名稱 版本號 docker.io library busybox latest
# docker pull docker.io/library/busybox:latest
latest: Pulling from library/busybox
ea97eb0eb3ec: Pull complete
Digest: sha256:bde48e1751173b709090c2539fdf12d6ba64e88ec7a4301591227ce925f3c678
Status: Downloaded newer image for busybox:latest
docker.io/library/busybox:latest
- 簡化:
docker pull busybox:latest
(不指定則預設倉庫)
-
可以直接使用
docker run
,如果本地沒有映象會自動去倉庫拉取。[root@localhost ~ ]# docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 0e03bdcc26d7: Pull complete Digest: sha256:e7c70bb24b462baa86c102610182e3efcb12a04854e8c582838d92970a09f323 Status: Downloaded newer image for hello-world:latest ...
下載的時候,我們可以看到有若干層組成,像 0e03bdcc26d7 這樣的字串是層的唯一 ID(實際上,完整的 ID 包括 256 位元, 64 個十六進位制字元組成)。使用 docker pull 命令下載中會獲取並輸出映象的各層資訊。當不同的映象包括相同的層的時候,本地僅存一份內容,減小儲存空間。
3.3 檢視映象基本資訊
3.3.1 docker images 命令檢視映象基本資訊
使用docker images
或 docker images ls
命令可以列舉本地主機上已有映象的基本資訊。
- 基本用法:
docker images [選項]
/docker images ls [選項]
[root@Stupidkid ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 219ee5171f80 2 days ago 1.23MB
hello-world latest bf756fb1ae65 11 months ago 13.3kB
這些映象都是儲存在 Docker 宿主機的 /var/lib/docker 目錄下。
- 欄位說明
REPOSITORY | TAG | IMAGE ID | CREATED | SIZE |
---|---|---|---|---|
倉庫名稱 | 版本號(又稱映象標籤)(latest:表示最新版本) | 映象ID | 映象建立時間到現在 | 映象檔案的體積 |
同一倉庫源可以有多個"TAG",代表這個倉庫源的不同個版本,我們使用" REPOSITORY:TAG" 來定義不同的映象
如果你不指定一個映象的版本標籤,例如你只使用"ubuntu","docker"將預設使用"ubuntu:latest"映象
其中映象的 ID 資訊十分重要,它唯一標識了映象。在使用映象 ID 的時候,一般可以使用該 ID 的前若干個字元組成的可區分串來替代完整的 ID。
TAG 資訊用於標記來自同一個倉庫的不同映象。TAG 在同一個倉庫中是唯一的。
映象大小資訊只是表示了該映象的邏輯體積大小,實際上由於相同的映象層本地只會儲存一份,物理上佔用 的儲存空間會小於各映象邏輯體積之和。
(一)、docker images
命令常用選項
-a
: 顯示所有的映象(包括臨時映象檔案)
[root@Stupidkid ~]# docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 219ee5171f80 2 days ago 1.23MB
hello-world latest bf756fb1ae65 11 months ago 13.3kB
-q : 只顯示映象ID
[root@Stupidkid ~]# docker images -q
219ee5171f80
bc9a0695f571
bf756fb1ae65
--digests
: 顯示映象再要資訊
[root@Stupidkid ~]# docker images --digests
REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
busybox latest sha256:bde48e1751173b709090c2539fdf12d6ba64e88ec7a4301591227ce925f3c678 219ee5171f80 2 days ago 1.23MB
nginx latest sha256:6b1daa9462046581ac15be20277a7c75476283f969cb3a61c8725ec38d3b01c3 bc9a0695f571 11 days ago 133MB
hello-world latest sha256:e7c70bb24b462baa86c102610182e3efcb12a04854e8c582838d92970a09f323 bf756fb1ae65 11 months ago 13.3kB
--digests=true | false:列出映象的數字摘要值
[root@Stupidkid ~]# docker images --digests=true
REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
busybox latest sha256:bde48e1751173b709090c2539fdf12d6ba64e88ec7a4301591227ce925f3c678 219ee5171f80 2 days ago 1.23MB
nginx latest sha256:6b1daa9462046581ac15be20277a7c75476283f969cb3a61c8725ec38d3b01c3 bc9a0695f571 11 days ago 133MB
hello-world latest sha256:e7c70bb24b462baa86c102610182e3efcb12a04854e8c582838d92970a09f323 bf756fb1ae65 11 months ago 13.3kB
[root@Stupidkid ~]# docker images --digests=false
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 219ee5171f80 2 days ago 1.23MB
nginx latest bc9a0695f571 11 days ago 133MB
hello-world latest bf756fb1ae65 11 months ago 13.3kB
--no-trunc
: 顯示完整的映象資訊
[root@Stupidkid ~]# docker images --no-trunc
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest sha256:219ee5171f8006d1462fa76c12b9b01ab672dbc8b283f186841bf2c3ca8e3c93 2 days ago 1.23MB
nginx latest sha256:bc9a0695f5712dcaaa09a5adc415a3936ccba13fc2587dfd76b1b8aeea3f221c 11 days ago 133MB
hello-world latest sha256:bf756fb1ae65adf866bd8c456593cd24beb6a0a061dedf42b26a993176745f6b 11 months ago 13.3kB
3.4 檢視映象詳細資訊
3.4.1 使用 docker inspect
命令獲取映象的詳細資訊
使用 docker inspect
命令獲取映象的詳細資訊,包括 PID、作者、架構等等。
-
基本格式:
docker inspect [映象ID] / [映象名稱:版本號]
-
示例:
nginx:latest none [root@Stupidkid ~]# docker inspect nginx:latest [ { "Id": "sha256:bc9a0695f5712dcaaa09a5adc415a3936ccba13fc2587dfd76b1b8aeea3f221c", "RepoTags": [ "nginx:latest" ], "RepoDigests": [ "nginx@sha256:6b1daa9462046581ac15be20277a7c75476283f969cb3a61c8725ec38d3b01c3" ], "Parent": "", "Comment": "", "Created": "2020-11-25T00:30:19.011398516Z", "Container": "279e6916c4aaaf5d61e468508abd96933f4e48194bd979dc692e0196cde2d59d", ...
3.4.2 docker inspect
命令選項
-f : 可以使用golang的語言模板語法獲取所需資訊。
[root@Stupidkid ~]# docker inspect -f '{{.Id}}' nginx
sha256:bc9a0695f5712dcaaa09a5adc415a3936ccba13fc2587dfd76b1b8aeea3f221c
3.5 為映象新增tag
為了方便後續工作中使用特定的映象,還可以使用 docker tag 命令來為本地的映象新增標籤、修改映象名稱和版本號。
-
格式 :
docker tag [原映象倉庫url]/[原映象名稱空間]/[原映象倉庫名稱]:[版本號] [新映象倉庫url]/[新映象名稱空間]/[新映象倉庫名稱]:[版本號]
或者如下:
docker tag [原映象倉庫url]/[原映象名稱空間]/[原映象倉庫名稱]:[版本號] \ [新映象倉庫url]/[新映象名稱空間]/[新映象倉庫名稱]:[版本號]
-
示例
[root@Stupidkid ~]# docker tag nginx:latest registry-vpc.cn-hangzhou.aliyuncs.com/stupid_kid/stupid_kid/nginx:v1 # 修改映象名與TAG [root@Stupidkid ~]# docker tag nginx:latest nginx_1:v1 [root@Stupidkid ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE busybox latest 219ee5171f80 2 days ago 1.23MB registry.cn-shanghai.aliyuncs.com/python16-shawn/busybox v1 219ee5171f80 2 days ago 1.23MB nginx latest bc9a0695f571 11 days ago 133MB nginx_1 v1 bc9a0695f571 11 days ago 133MB registry-vpc.cn-hangzhou.aliyuncs.com/stupid_kid/stupid_kid/nginx v1 bc9a0695f571 11 days ago 133MB hello-world latest bf756fb1ae65 11 months ago 13.3kB
修改tag後,源映象還會存在,ID則為同一個,在刪除映象時若指定的是ID則會刪除所有匹配到ID的映象,若指定的是映象名稱:版本
則僅刪除指定名稱的單個映象。
3.6 檢視映象構建歷史
-
格式 :
docker history [映象名字:映象版本號] / [映象ID]
-
示例:
[root@Stupidkid ~]# docker history nginx:latest IMAGE CREATED CREATED BY SIZE COMMENT bc9a0695f571 11 days ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B <missing> 11 days ago /bin/sh -c #(nop) STOPSIGNAL SIGQUIT 0B <missing> 11 days ago /bin/sh -c #(nop) EXPOSE 80 0B <missing> 11 days ago /bin/sh -c #(nop) ENTRYPOINT ["/docker-entr… 0B <missing> 11 days ago /bin/sh -c #(nop) COPY file:0fd5fca330dcd6a7… 1.04kB <missing> 11 days ago /bin/sh -c #(nop) COPY file:08ae525f517706a5… 1.95kB <missing> 11 days ago /bin/sh -c #(nop) COPY file:e7e183879c35719c… 1.2kB <missing> 11 days ago /bin/sh -c set -x && addgroup --system -… 63.6MB <missing> 11 days ago /bin/sh -c #(nop) ENV PKG_RELEASE=1~buster 0B <missing> 11 days ago /bin/sh -c #(nop) ENV NJS_VERSION=0.4.4 0B <missing> 11 days ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.19.5 0B <missing> 2 weeks ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B <missing> 2 weeks ago /bin/sh -c #(nop) CMD ["bash"] 0B <missing> 2 weeks ago /bin/sh -c #(nop) ADD file:d2abb0e4e7ac17737… 69.2MB
3.7 搜尋映象
3.7.1 docker search 搜尋映象
在 docker 中搜尋映象主要使用 Search 子命令,預設只搜尋 Docker Hub 官方映象倉庫中的映象。
-
格式 :
docker search [所搜尋的映象名稱] [選項]
-
示例:
[root@Stupidkid ~]# docker search python NAME DESCRIPTION STARS OFFICIAL AUTOMATED python Python is an interpreted, interactive, objec… 5661 [OK] django Django is a free web application framework, … 1024 [OK] pypy PyPy is a fast, compliant alternative implem… 256 [OK] nikolaik/python-nodejs Python with Node.js 55 [OK] joyzoursky/python-chromedriver Python with Chromedriver, for running automa… 54 [OK] arm32v7/python Python is an interpreted, interactive, objec… 53 circleci/python Python is an interpreted, interactive, objec… 41 centos/python-35-centos7 Platform for building and running Python 3.5… 38 centos/python-36-centos7 Platform for building and running Python 3.6… 30 hylang Hy is a Lisp dialect that translates express… 28 [OK] arm64v8/python Python is an interpreted, interactive, objec… 24 centos/python-27-centos7 Platform for building and running Python 2.7… 17 bitnami/python Bitnami Python Docker Image 10 [OK] publicisworldwide/python-conda Basic Python environments with Conda. 6 [OK] dockershelf/python Repository for docker images of Python. Test… 5 [OK] clearlinux/python Python programming interpreted language with… 4 d3fk/python_in_bottle Simple python:alpine completed by Bottle+Req… 4 [OK] i386/python Python is an interpreted, interactive, objec… 3 centos/python-34-centos7 Platform for building and running Python 3.4… 2 ppc64le/python Python is an interpreted, interactive, objec… 2 amd64/python Python is an interpreted, interactive, objec… 1 saagie/python Repo for python jobs 0 s390x/python Python is an interpreted, interactive, objec… 0 ccitest/python CircleCI test images for Python 0 [OK] openshift/python-33-centos7 DEPRECATED: A Centos7 based Python v3.3 imag… 0
-
欄位說明:
NAME
:映象名稱DESCRIPTION
:映象描述STARS
:使用者評價,反映一個映象的受歡迎程度(收藏個數)OFFICIAL
:是否為官方構建AUTOMATED
:自動構建,表示該映象由 Docker Hub 自動構建流程建立的。
3.7.2 docker search
命令常用選項
-f :過濾
# 搜尋被收藏超過 300 個的並且關鍵詞包括 Python 的映象
docker search -f stars=300 python
# 搜尋官方提供的帶有 Redis 關鍵字的映象
docker search -f is-official=true redis
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
redis Redis is an open source key-value store that… 8792 [OK]
-s
:列出蒐藏不小於指定值的映象
- 示例:
docker search python -s 300
--automated
: 只列出 automated build 型別的映象
- 示例:
docker search python --automated
--limit
: 限制輸出結果
--no-trunc: 不截斷輸出結果
3.8 刪除映象
3.8.1 使用docker rmi命令刪除映象
使用docker rmi
命令,相當於docker image rm
命令。
- 格式 :
docker rmi [映象名稱:版本號] / [映象ID]
示例:
[root@Stupidkid ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 219ee5171f80 2 days ago 1.23MB
registry.cn-shanghai.aliyuncs.com/python16-shawn/busybox v1 219ee5171f80 2 days ago 1.23MB
nginx latest bc9a0695f571 11 days ago 133MB
nginx_1 v1 bc9a0695f571 11 days ago 133MB
registry-vpc.cn-hangzhou.aliyuncs.com/stupid_kid/stupid_kid/nginx v1 bc9a0695f571 11 days ago 133MB
hello-world latest bf756fb1ae65 11 months ago 13.3kB
[root@Stupidkid ~]# docker rmi nginx:v1
Error: No such image: nginx:v1
[root@Stupidkid ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 219ee5171f80 2 days ago 1.23MB
registry.cn-shanghai.aliyuncs.com/python16-shawn/busybox v1 219ee5171f80 2 days ago 1.23MB
nginx latest bc9a0695f571 11 days ago 133MB
nginx_1 v1 bc9a0695f571 11 days ago 133MB
registry-vpc.cn-hangzhou.aliyuncs.com/stupid_kid/stupid_kid/nginx v1 bc9a0695f571 11 days ago 133MB
hello-world latest bf756fb1ae65 11 months ago 13.3kB
(一)、docker rmi命令選項
-f : 強制刪除。映象已經執行為容器則無法刪除,可以使用-f強制刪除。
示例:刪除單個
[root@localhost ~ ]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9bf5ef44a314 nginx "/docker-entrypoint.…" 51 minutes ago Up 51 minutes 0.0.0.0:32770->80/tcp funny_northcutt
[root@localhost ~ ]# docker rmi nginx:latest
Error response from daemon: conflict: unable to remove repository reference "nginx:latest" (must force) - container b1bc639c450e is using its referenced image bc9a0695f571
[root@localhost ~ ]# docker rmi -f nginx:latest
Untagged: nginx:latest
[root@localhost ~ ]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx_2 v1 2c45f814f15b 38 minutes ago 131MB
<none> <none> bc9a0695f571 7 days ago 133MB
刪除多個:
docker rmi -f [映象名1:TAG] [映象名2:TAG]...
刪除全部:
docker rmi -f $(docker images -qa)
3.9 清理映象
使用一段時間之後,docker 會產生很多臨時映象檔案,以及一些沒有被使用的映象, 我們可以透過 docker image prune 命令來進行清理。
- 格式:docker image prune [選項]
docker image prune
命令選項
- -a:清理所有沒有當前使用的映象,不僅是臨時映象。
- -f: 強制刪除。等同於rmi刪除。
3.10 推送映象
push將本地映象推送到網上的個人的私有倉庫中,例如阿里雲的私有倉庫。
-
格式 :
docker push [映象倉庫URL]/[名稱空間名稱]/[倉庫名稱]:[版本號]
-
示例:
-
先登入私有倉庫。
docker login --username=“登入名,最好純英文” 倉庫URL [root@Stupidkid ~]# docker login --username="興欣工作室" registry.cn-hangzhou.aliyuncs.com/stupid_kid/stupid_kid Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded
-
將映象改名
# 私有倉庫名最好設定為映象名,在私有倉庫內只能檢視版本,而沒有映象名。 docker tag 本地映象名 [映象倉庫URL]/[名稱空間名稱]/[倉庫名稱]:[版本號]
-
推送映象,push一次只能推送一個映象。
[root@Centos7 docker]# docker push registry.cn-hangzhou.aliyuncs.com/alvinos/py15-nginx:1.19.2 The push refers to repository [registry.cn-hangzhou.aliyuncs.com/alvinos/py15-nginx] 908cf8238301: Pushed eabfa4cd2d12: Pushed 60c688e8765e: Pushed f431d0917d41: Pushed 07cab4339852: Pushed 1.19.2: digest: sha256:794275d96b4ab96eeb954728a7bf11156570e8372ecd5ed0cbc7280313a27d19 size: 1362
-
3.11 構建映象
構建映象一般有三種情況,基於容器匯入、基於本地模板匯入、基於 Dockerfile 建立,本節主講基於容器儲存映象和本地儲存映象檔案匯入。
1、儲存容器為映象
- 格式:
docker commit [選項] [容器ID] / [容器名稱:版本號]
docker commit
命令選項
- -a : 指定作者。
- -m : 簡介。
- -p : 儲存映象時,容器暫停執行。
示例:
[root@localhost ~ ]# docker commit -a 'chirou' -m 'nginx_demo' -p 50cf6c577510
sha256:94738e2585944aa455e0c3e1bb174fba02dc18ea17135811d1b874ea0beaab7e
[root@localhost ~ ]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 94738e258594 4 seconds ago 133MB
# 使用inspect檢視詳細資訊。
[root@localhost ~ ]# docker inspect 94738e258594 | grep chirou
"Author": "chirou",
[root@localhost ~ ]# docker inspect 94738e258594 | grep nginx_demo
"Comment": "nginx_demo",
2、匯入與匯出容器
某些時候,需要將容器或映象儲存成檔案從一個系統遷移到另外一個系統,此時可以使用 Docker 的匯入和匯出功能,這也是Docker 自身提供的一個重要特性。匯出的檔案是一個tar包,可以透過壓縮命令進行壓縮,然後進行傳輸。
export
和import
比較
export
export將容器匯出到標準輸出,可以使用輸出重定向或-o選項至檔案中。
-
格式:
docker export [容器名或ID] > [檔名稱]
-
示例:將nginx容器匯出
docker export nginx > export_nginx.tar
import
import 是將export匯出的檔案匯入為映象,可以自定義匯入的映象名稱和版本號。
import雖然可以匯入save儲存的檔案但是匯入後無法執行。
-
格式:
docker import [檔名稱] [自定義映象名稱]:[版本號]
-
示例:將上面匯出的檔案匯入
[root@localhost ~ ]# docker import export_nginx.tar import_nginx:v1 87b71baffd0c8e5b2b98884caee97a9d3abcee444e9bad10c865db0daaafa024 [root@localhost ~ ]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE import_nginx v1 87b71baffd0c 44 seconds ago 131MB nginx latest bc9a0695f571 10 days ago 133MB # 透過export匯出的檔案,使用import匯入後無法直接執行。 [root@localhost mnt ]# docker run -d import_nginx:v1 docker: Error response from daemon: No command specified.
可以看到,透過export匯出的容器檔案,再使用import匯入後,SIZE是要比源映象小的。這是因為export匯出的是容器,並沒有源映象的全部內容,比如會丟失構建歷史記錄和後設資料資訊等檔案,相當於僅儲存容器當時的快照狀態,這會導致export匯出的檔案無法直接透過run命令執行,解決方法:
執行時透過-it選項,給容器分配一個偽終端。
docker run -dit import_nginx:v1 sh
推薦使用commit來儲存容器,然後再使用save儲存,能避免上述問題。
3、匯入和匯出映象
save和load
save能將映象完整的儲存下來,包括映象ID和構建歷史。一樣可用輸出重定向或-o選項儲存至tar包中,並且save支援將多個映象儲存至一個tar包中。
格式:
docker save [映象名或ID ...] > [壓縮包名稱]
docker save -o [壓縮包名稱] [映象名稱或ID ...]
例項:
# 不指定版本號則預設為latest,表示最新版。
[root@localhost ~ ]# docker save busybox nginx > box_nginx.tar
[root@localhost ~ ]# ll
-rw-r--r-- 1 root root 138553344 12月 5 19:30 box_nginx.tar
load是將save儲存的映象檔案載入為映象。save儲存時若使用映象ID儲存映象,匯入時則沒有映象名稱,load在匯入時也不能自定義映象名稱,可以在匯入後使用docker tag命令修改。
格式:
docker load < [壓縮包名稱]
<相當於-i選項,指定匯入的檔案,預設是STDIN。
例項:
[root@localhost ~ ]# docker save dc3bacd8b5ea bc9a0695f571 > box_nginx.tar
# 將原映象刪除
[root@localhost ~ ]# docker rmi bc9a0695f571 dc3bacd8b5ea
# 載入映象
[root@localhost ~ ]# docker load < box_nginx.tar
Loaded image ID: sha256:bc9a0695f5712dcaaa09a5adc415a3936ccba13fc2587dfd76b1b8aeea3f221c
Loaded image ID: sha256:dc3bacd8b5ea796cea5d6070c8f145df9076f26a6bc1c8981fd5b176d37de843
# 此時ID還是原來的,但tag資訊都為none
[root@localhost ~ ]# docker images
<none> <none> bc9a0695f571 10 days ago 133MB
<none> <none> dc3bacd8b5ea 11 days ago 1.23MB
四、容器常用命令及基本操作
4.1 docker ps
檢視容器
ps:該子命令能檢視當前正在執行的容器
示例:
[root@localhost ~ ]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b1a13dfe7105 nginx "/docker-entrypoint.…" 3 seconds ago Up 2 seconds 0.0.0.0:32774->80/tcp reverent_maxwell
欄位說明:
CONTAINER ID | IMAGE | COMMAND | CREATED | STATUS | PORTS | NAMES |
---|---|---|---|---|---|---|
容器 ID | 所屬映象 | 命令 | 建立時間 | 狀態 | 埠 | 容器名稱 |
4.1.1 docker ps
常用選項
-a: 檢視所有容器(包括執行和停止)
docker ps -a
-f:檢視停止的容器
docker ps -f status=exited
-q:靜默模式,僅顯示ID資訊
[root@localhost ~ ]# docker ps -aq
b1a13dfe7105
-n:列出最近建立的 n 個容器。
docker ps -n 5
-l : 檢視最後一次執行的容器
docker ps -l
inspect
該命令能夠檢視該容器詳細資訊
[root@localhost ~ ]# docker inspect b1a13dfe7105
[
{
"Id": "b1a13dfe71056d8c02fb90e52a503bbedc60301f62e9c49604fa86c2258fd310",
"Created": "2020-12-05T12:18:17.241753416Z",
"Path": "/docker-entrypoint.sh",
"Args": [
"nginx",
"-g",
"daemon off;"
。。。省略行。。。
同樣支援 -f 選項過濾指定資訊。
[root@localhost ~ ]# docker inspect -f '{{.Id}}' b1a13dfe7105
b1a13dfe71056d8c02fb90e52a503bbedc60301f62e9c49604fa86c2258fd310
4.2 檢視容器日誌
4.2.1 docker logs
檢視容器日誌
- 格式:
docker logs [option] [容器名稱或ID]
4.2.2 docker logs
命令選項
- -f:跟蹤日誌輸出。類似tail -f命令。
- --since:顯示某個開始時間的所有日誌。
- -t:顯示時間戳。
- --tail N:僅列出最新N條容器日誌。
示例:
[root@localhost ~ ]# docker logs b1a13dfe7105
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
顯示時間戳:
[root@localhost ~ ]# docker logs -t b1a13dfe7105
2020-12-05T12:18:17.500960288Z /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
2020-12-05T12:18:17.500995723Z /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
。。。省略行。。。
僅顯示三條日誌:
# 僅檢視3條日誌。
[root@localhost ~ ]# docker logs --tail 3 b1a13dfe7105
192.168.112.1 - - [05/Dec/2020:13:46:53 +0000] "GET /favicon.ico HTTP/1.1" 404 153 "http://192.168.112.129:32775/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0" "-"
192.168.112.1 - - [05/Dec/2020:13:46:54 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0" "-"
192.168.112.1 - - [05/Dec/2020:13:46:55 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0" "-"
檢視2020年12月5日之後的日誌:
# 日期格式不能錯誤。
[root@localhost ~ ]# docker logs --since="2020-12-04" b1a13dfe7105
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
。。。省略行。。。
4.3 執行容器
4.3.1 docker run 執行容器
docker run
能將一個映象執行為容器。容器當中至少有一個程序執行在前臺。
- 格式:
docker run [選項] [映象名稱|映象ID] [容器啟動後內部執行的命令]
4.3.2 docker run
命令常用選項
-d : 以守護程序的方式執行(在 run 後面加上 -d 引數,則會建立一個守護式容器在後臺執行(這樣建立容器後不會自動登入容器,如果只加 -i -t 兩個引數,建立容器後就會自動進容器裡))
-p : 指定埠對映前者是宿主機埠,後者是容器內的對映埠。可以使用多個 -p 做多個埠對映。
# 格式
docker run -p 宿主主機埠:容器向外暴露的埠 [映象名稱:tag | 映象ID]
docker run -d -p 8899:80 nginx:1.19.2
-P : 隨機埠對映,隨機使用宿主機的可用埠與容器內暴露的埠對映。
docker run -d -P nginx:1.19.2
--name: 指定容器的名稱(為建立的容器命名),同一臺宿主主機上的docker名稱不能重複。
docker run -d --name 自定義容器名 -P nginx:1.19.2
--rm:當一個容器停止後,就立即刪除。
docker run -d --rm nginx:1.19.2
-i : 表示執行容器
-t : 表示容器啟動後會進入其命令列。加入這兩個引數後,容器建立就能登入進去。即分配一個偽終端;通常和-i連用
# 執行容器後執行bash命令。
docker run -ditP nginx bash
-e : 在容器內設定一個環境變數。
docker run -d -e NGINX_NAME=nginx nginx:1.19.2
--network 指定網路模式,下篇再講docker網路。
--link:連結到另一個容器。
-h:指定容器內的主機名。
-v: 對映儲存卷,可以對映檔案及資料夾。表示目錄對映關係(前者是宿主機目錄,後者是對映到宿主機上的目錄),可以使用多個 -v 做多個目錄或檔案對映。注意:最好做目錄對映,在宿主機上做修改,然後共享到容器上;對映後在宿主機檔案內的修改都會對映到容器內的檔案中。
docker run -d -v 宿主機檔案路徑:容器內檔案路徑 nginx:1.19.2
4.5 目錄掛載(容器資料卷操作)
我們可以在建立容器的時候,將宿主機的目錄與容器內的目錄進行對映,這樣我們就可以透過修改宿主機某個目錄的檔案從而去影響容器,而且這個操作是雙向繫結的,也就是說容器內的操作也會影響到宿主機,實現備份功能。
但是容器被刪除的時候,宿主機的內容並不會被刪除。如果多個容器掛載同一個目錄,其中一個容器被刪除,其他容器的內容也不會受到影響。
容器與宿主機之間的資料卷屬於引用的關係,資料卷是從外界掛載到容器內部中的,所以可以脫離容器的生命週期而獨立存在,正是由於資料卷的生命週期並不等同於容器的生命週期,在容器退出或者刪除以後,資料卷仍然不會受到影響,資料卷的生命週期會一直持續到沒有容器使用它為止。
建立容器新增 -v
引數,格式為宿主機目錄:容器目錄
,例如:
docker run -di -v /mydata/docker_centos/data:/usr/local/data --name centos7-01 centos:7
# 多目錄掛載
docker run -di -v /宿主機目錄:/容器目錄 -v /宿主機目錄2:/容器目錄2 映象名
目錄掛載操作可能會出現許可權不足的提示。這是因為 CentOS7 中的安全模組 SELinux 把許可權禁掉了,在 docker run 時透過
--privileged=true
給該容器加許可權來解決掛載的目錄沒有許可權的問題。
4.5.1 匿名掛載
匿名掛載只需要寫容器目錄即可,容器外對應的目錄會在 /var/lib/docker/volume
中生成。
# 匿名掛載
docker run -di -v /usr/local/data --name centos7-02 centos:7
# 檢視 volume 資料卷資訊
docker volume ls
4.5.2 具名掛載
具名掛載就是給資料捲起了個名字,容器外對應的目錄會在 /var/lib/docker/volume
中生成。
# 匿名掛載
docker run -di -v docker_centos_data:/usr/local/data --name centos7-03 centos:7
# 檢視 volume 資料卷資訊
docker volume ls
4.5.3 指定目錄掛載
一開始給大家講解的方式就屬於指定目錄掛載,這種方式的掛載不會在 /var/lib/docker/volume
目錄生成內容。
docker run -di -v /mydata/docker_centos/data:/usr/local/data --name centos7-01 centos:7
# 多目錄掛載
docker run -di -v /宿主機目錄:/容器目錄 -v /宿主機目錄2:/容器目錄2 映象名
4.5.4 檢視目錄掛載關係
透過 docker volume inspect 資料卷名稱
可以檢視該資料卷對應宿主機的目錄地址。
[root@localhost ~]# docker volume inspect docker_centos_data
[
{
"CreatedAt": "2020-08-13T20:19:51+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/docker_centos_data/_data",
"Name": "docker_centos_data",
"Options": null,
"Scope": "local"
}
]
透過 docker inspect 容器ID或名稱
,在返回的 JSON 節點中找到 Mounts
,可以檢視詳細的資料掛載資訊。
4.5.5 只讀/讀寫
# 只讀。只能透過修改宿主機內容實現對容器的資料管理。
docker run -it -v /宿主機目錄:/容器目錄:ro 映象名
# 讀寫,預設。宿主機和容器可以雙向運算元據。
docker run -it -v /宿主機目錄:/容器目錄:rw 映象名
4.5.6 volumes-from(繼承)
# 容器 centos7-01 指定目錄掛載
docker run -di -v /mydata/docker_centos/data:/usr/local/data --name centos7-01 centos:7
# 容器 centos7-04 和 centos7-05 相當於繼承 centos7-01 容器的掛載目錄
docker run -di --volumes-from centos7-01:ro --name centos7-04 centos:7
docker run -di --volumes-from centos7-01:rw --name centos7-05 centos:7
4.6 退出容器
exit
: 容器停止退出Ctrl+P+Q
: 容器不停止退出
4.7 重啟容器
當修改了容器內某些配置檔案後,可以使用此命令使配置生效
- 格式:
docker restart [容器名稱 | 容器ID]
4.8 啟動容器
docker start [容器ID / 容器名]
4.9 停止容器
docker stop [容器ID / 容器名]
docker stop -f $(docker ps -qa)
(所有)
4.10 強制停止容器
docker kill [容器ID / 容器名]
4.11 刪除已停止的容器
docker rm [容器ID]
docker rm -f $(docker ps -qa)
4.12 進入容器
在使用容器的過程中,我們難免需要進入容器進行排查問題。下面來介紹進入容器的四種方式。
4.12.1 attach
透過管道,連線容器內PID=1的程序,容器至少有一個程序執行前臺。attach 是最早 docker 官方推出的進入容器的命令了,不過使用該命令有一個問題。當多個視窗同時使用該命令進入該容器時,所有的視窗都會同步顯示。如果有一個視窗阻塞了,那麼其他視窗也無法再進行操作,當所有視窗退出時,容器結束。
- 格式 :
docker attach [容器名或ID]
4.12.2 exec
(官方推薦使用)
繼attach 之後,exec 是官方推出的有一個新的進入容器的命令,這也是目前推薦使用的進入容器的方式。這個命令相當於在容器中執行一個命令。
- 格式 :
docker exec [引數] [容器名或ID] [命令]
示例:
[root@localhost ~ ]# docker exec -it reverent_maxwell sh
用這種方式相當於進入該容器,並且在退出時不會將容器也停止。
4.12.3 nsenter
進入容器中,但不進入容器內的程序。Nsenter 是 Linux 提供的命令。需要配合 docker inspect 來使用(早期沒有 exec 命令時,企業當中最長用的方式之一),Docker 是用 golang 語言開發,所以它也支援 go 語言的模板語法。
- 配合
docker inspect
來使用 - 格式示例:nsenter --target $( docker inspect -f {{.State.Pid}} nginxv1 ) --mount --uts --ipc --net --pid
4.12.4 ssh
在映象(或容器) 中安裝 SSH Server,這樣就能保證多人進入容器且相互之間不受干擾了,相信大家在當前的生產環境中(沒有使用 Docker 的情況)也是這樣做的。但是使用了 Docker 容器之後不建議使用 ssh 進入到 Docker 容器內。
- 在容器裡面安裝一個 sshd 服務
4.12.5 建立並進入容器
下面這行命令的意思就是透過映象 AA 建立一個容器 BB,執行容器並進入容器的 /bin/bash
docker run -it --name 容器名稱 映象名稱:標籤 /bin/bash
注意:Docker 容器執行必須有一個前臺程序, 如果沒有前臺程序執行,容器認為是空閒狀態,就會自動退出。
4.12.6 守護式方式建立容器
docker run -di --name 容器名稱 映象名稱:標籤
4.12.7 登入守護式容器方式
docker exec -it 容器名稱|容器ID /bin/bash
4.12.8 退出當前容器
exit
4.13 停止與啟動容器
# 停止容器
docker stop 容器名稱|容器ID
# 啟動容器
docker start 容器名稱|容器ID
4.14 複製檔案
複製命令類似於 Linux 系統中的 scp 命令,是將宿主主機上的內容上傳到容器中,也可能是將容器中的檔案下載到宿主主機中。
4.14.1 從容器內複製檔案到宿主主機
- 格式:
docker cp [容器ID:容器內檔案路徑] 宿主主機路徑
示例
[root@Stupidkid ~]# docker cp d78575358e04:/usr ./
[root@Stupidkid ~]# ll
總用量 919344
-rw-------. 1 root root 1526 11月 13 20:15 anaconda-ks.cfg
-rw-r--r--. 1 root root 0 12月 6 19:47 export_nginx.tar
-rw-r--r--. 1 root root 2340 12月 6 10:05 pic_spider.py
-rw-r--r--. 1 root root 941396992 12月 4 19:40 python3_django.tar
drwxr-xr-x. 10 root root 105 11月 17 08:00 usr
4.14.2 從宿主機複製檔案到容器
-
格式 :
docker cp 宿主主機路徑 [容器ID:容器內檔案路徑]
-
示例:
[root@Stupidkid ~]# docker cp ./export_nginx.tar d78575358e04:/home [root@Stupidkid ~]# docker exec d78575358e04 ls /home export_nginx.tar
4.15 刪除容器
stop命令僅僅是將容器停止,若要刪除容器則使用docker rm命令。
格式:
docker rm [option] [映象名稱或ID]
rm能刪除已停止的容器,對於正在執行的容器可以使用-f選項強制刪除,一般不推薦直接將一個正在執行的容器強制刪除。
例項:
# 檢視正在執行的容器。
[root@localhost ~ ]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1a9b4ae8766b nginx "/docker-entrypoint.…" About an hour ago Up About an hour 0.0.0.0:80->80/tcp pedantic_hopper
# 直接使用rm無法刪除。
[root@localhost ~ ]# docker rm 1a9b4ae8766b
Error response from daemon: You cannot remove a running container 1a9b4ae8766b9266f0e5256df1ac56b9647483815f60b447ae9f15d6c3355dec. Stop the container before attempting removal or force remove
# 使用-f選項可以強制刪除。
[root@localhost ~ ]# docker rm -f 1a9b4ae8766b
1a9b4ae8766b
使用docker ps -a與rm和stop命令配合,可以達到一個批次處理容器的方式:
# 停止所有正在執行的容器
docker stop $(docker ps)
# 刪除所有容器,包括正在執行的容器
docker rm -f $(docker ps -a)
4.16 檢視容器IP地址
我們可以透過以下命令檢視容器的元資訊。
docker inspect 容器名稱|容器ID
也可以直接執行下面的命令直接輸出 IP 地址。
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名稱|容器ID