Docker 最常用的映象命令和容器命令

贾维斯Echo發表於2024-03-18

目錄
  • 一、幫助命令
  • 二、執行第一個容器: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.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.9 清理映象
        • docker image prune命令選項
    • 3.10 推送映象
    • 3.11 構建映象
      • 1、儲存容器為映象
        • docker commit命令選項
      • 2、匯入與匯出容器
        • exportimport 比較
          • export
          • import
      • 3、匯入和匯出映象
  • 四、容器常用命令及基本操作
    • 4.1 docker ps檢視容器
      • 4.1.1 docker ps常用選項
    • 4.2 檢視容器日誌
      • 4.2.1 docker logs檢視容器日誌
      • 4.2.2 docker logs命令選項
    • 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地址

一、幫助命令

  • 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 (不指定則預設倉庫)

image-20201206103920171

  • 可以直接使用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]/[名稱空間名稱]/[倉庫名稱]:[版本號]

  • 示例:

    1. 先登入私有倉庫。

      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
      
      
    2. 將映象改名

      # 私有倉庫名最好設定為映象名,在私有倉庫內只能檢視版本,而沒有映象名。
      docker tag 本地映象名 [映象倉庫URL]/[名稱空間名稱]/[倉庫名稱]:[版本號]
      
    3. 推送映象,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包,可以透過壓縮命令進行壓縮,然後進行傳輸。

exportimport 比較
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

/resources/articles/docker/image-20200813201808718.png

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

/resources/articles/docker/image-20200813202118346.png

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,可以檢視詳細的資料掛載資訊。

/resources/articles/docker/image-20200813203856160.png

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

相關文章