快收藏!超強圖解Docker常見命令與實戰!

語言: CN / TW / HK

圖片

圖片

映象容器基礎

(一)基本概念

容器 = 映象 + 讀寫層

圖片

(二)映象

圖片

(三)容器

圖片

(四)執行的容器

一個執行態容器(running container)被定義為一個可讀寫的統一檔案系統加上隔離的程序空間和包含其中的程序。下面這張圖片展示了一個執行中的容器

圖片

正是檔案系統隔離技術使得Docker成為了一個前途無量的技術。一個容器中的程序可能會對檔案進行修改、刪除、建立,這些改變都將作用於可讀寫層(read-write layer)。下面這張圖展示了這個行為。

圖片

(五) 映象層(image layer)

圖片

元資料(metadata)就是關於這個層的額外資訊,它不僅能夠讓Docker獲取執行和構建時的資訊,還包括父層的層次資訊。需要注意,只讀層和讀寫層都包含元資料。

圖片

除此之外,每一層都包括了一個指向父層的指標。如果一個層沒有這個指標,說明它處於最底層。

圖片

圖片

常用命令

(一)docker create

圖片

docker create 命令為指定的映象(image)添加了一個可讀寫層,構成了一個新的容器。注意,這個容器並沒有執行

圖片

(二)docker start

圖片

Docker start命令為容器檔案系統建立了一個程序隔離空間。注意,每一個容器只能夠有一個程序隔離空間。

(三) docker run

圖片

docker start 和 docker run命令有什麼區別

圖片

從圖片可以看出,docker run 命令先是利用映象建立了一個容器,然後執行這個容器。這個命令非常的方便,並且隱藏了兩個命令的細節,但從另一方面來看,這容易讓使用者產生誤解。

四)docker ps

圖片

docker ps 命令會列出所有執行中的容器。這隱藏了非執行態容器的存在,如果想要找出這些容器,我們需要使用下面這個命令。

五)docker ps –a

圖片

docker ps –a命令會列出所有的容器,不管是執行的,還是停止的。

(六)docker images

圖片

docker images命令會列出了所有頂層(top-level)映象。實際上,在這裡我們沒有辦法區分一個映象和一個只讀層,所以我們提出了top-level映象。只有建立容器時使用的映象或者是直接pull下來的映象能被稱為頂層(top-level)映象,並且每一個頂層映象下面都隱藏了多個映象層。

(七)docker images –a

圖片

docker images –a命令列出了所有的映象,也可以說是列出了所有的可讀層。如果你想要檢視某一個image-id下的所有層,可以使用docker history來檢視

(八)docker stop

圖片

docker stop命令會向執行中的容器傳送一個SIGTERM的訊號,然後停止所有的程序。

(九)docker kill

圖片

docker kill 命令向所有執行在容器中的程序傳送了一個不友好的SIGKILL訊號。

(十)docker pause

圖片

docker stop和docker kill命令會發送UNIX的訊號給執行中的程序,docker pause命令則不一樣,它利用了cgroups的特性將執行中的程序空間暫停。具體的內部原理你可以在這裡找到:https://www.kernel.org/doc/Doc ... m.txt,但是這種方式的不足之處在於傳送一個SIGTSTP訊號對於程序來說不夠簡單易懂,以至於不能夠讓所有程序暫停。

(十一) docker rm

圖片

docker rm命令會移除構成容器的可讀寫層。注意,這個命令只能對非執行態容器執行。

(十二)docker commit

圖片

docker commit命令將容器的可讀寫層轉換為一個只讀層,這樣就把一個容器轉換成了不可變的映象。

圖片


(十三)docker build

圖片

docker build命令非常有趣,它會反覆的執行多個命令。

圖片

(十四)docker exec

圖片

docker exec 命令會在執行中的容器執行一個新程序。

(十五) docker inspect or

圖片

docker inspect命令會提取出容器或者映象最頂層的元資料。

(十六)docker save

圖片

docker save命令會建立一個映象的壓縮檔案,這個檔案能夠在另外一個主機的Docker上使用。和export命令不同,這個命令為每一個層都儲存了它們的元資料。這個命令只能對映象生效。

(十七)docker export

圖片

docker export命令建立一個tar檔案,並且移除了元資料和不必要的層,將多個層整合成了一個層,只儲存了當前統一視角看到的內容(譯者注:expoxt後的容器再import到Docker中,通過docker images –tree命令只能看到一個映象;而save後的映象則不同,它能夠看到這個映象的歷史映象)。

(十八)docker history

圖片

docker history命令遞迴地輸出指定映象的歷史映象。

(十九)docker prune

prune 命令用來刪除不再使用的 docker 物件。刪除所有未被 tag 標記和未被容器使用的映象:

$ docker image prune WARNING! This will remove all dangling images. Are you sure you want to continue? [y/N] y

```

```

刪除所有未被容器使用的映象:

$ docker image prune -a

. 檔案檔案分層

圖片

docker commit 和 docker create是對應的,上圖可以看到檔案分為多層後最後有一個可讀寫的層 刪除所有未被 tag 標記和未被容器使用的映象:

圖片實戰

(一) Docker遷移與備份

  • 我們可以通過以下命令將容器儲存為映象

  • 我們可以通過以下命令將映象儲存為tar 檔案

  • 首先我們先刪除掉mynginx_img映象 然後執行此命令進行恢復

docker commit mynginx mynginx_i docker save -o mynginx.tar mynginx_i docker load -i mynginx.tar

```

```

(二)從Dockerfile中檢視分層映象

我有一個ordersystem容器,Dockerfile檔案如下:

``` FROM csighub.tencentyun.com/medipedia/medi-saas-go:latest RUN mkdir -p /app/logs/ ADD pop-admin-server /usr/local/services/pop-admin-server/ COPY script/supervisord.ini /etc/supervisord.d/ COPY script/kick_start.sh /etc/kickStart.d/

建立存放匯入檔案的目錄

RUN mkdir -p /usr/local/services/pop-admin-server/importfile RUN mkdir -p /usr/local/services/pop-admin-server/upload

fix a protocol buffer namespace conflict

ENV GOLANG_PROTOBUF_REGISTRATION_CONFLICT warn

修改映象的顯示字符集

ENV LANG en_US.UTF-8 ```

```

```

我們檢視映象

[[email protected] ordersystem]# docker images -a REPOSITORY TAG IMAGE ID CREATED SIZE ordersystem 3.1 e1a9552f4a9a 51 minutes ago 380MB <none> <none> 42959ee6c01b 51 minutes ago 380MB <none> <none> 4b45c5bb3b60 51 minutes ago 380MB <none> <none> 7de0f7950baf 51 minutes ago 380MB <none> <none> 5eccd3fb7501 51 minutes ago 380MB <none> <none> 516957abdce4 51 minutes ago 380MB <none> <none> 4c72f0036ea9 51 minutes ago 380MB

```

```

這裡需要思考一下none是啥呢?

[[email protected] ordersystem]# docker history e1a9552f4a9a IMAGE CREATED CREATED BY SIZE COMMENT e1a9552f4a9a 50 minutes ago /bin/sh -c #(nop) CMD ["/etc/kickStart.d/ki… 0B 7de0f7950baf 50 minutes ago /bin/sh -c #(nop) EXPOSE 8000 0B 42959ee6c01b 50 minutes ago /bin/sh -c #(nop) ENV GO111MODULE=on CGO_EN… 0B 4b45c5bb3b60 50 minutes ago /bin/sh -c chmod +x /etc/kickStart.d/kick_st… 327B 516957abdce4 50 minutes ago /bin/sh -c #(nop) COPY file:063b1bd47099a218… 327B 4c72f0036ea9 50 minutes ago /bin/sh -c #(nop) COPY file:1edd608d8faba17f… 381B 5eccd3fb7501 50 minutes ago /bin/sh -c #(nop) ADD file:446cb8b7dbc762daa… 13.5MB

```

```

圖片

(三) 容器的可讀寫層

容器的可讀寫層就是容器是可以用exec -it 去進入容器,但是映象不行,容器可更改,映象不行

[[email protected] ordersystem]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES67252e999d5d mysql "docker-entrypoint.s…" 9 days ago Up 9 days 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysqlffcb1d91e28f ordersystem:2.2 "/etc/kickStart.d/ki…" 2 weeks ago Up 2 weeks 0.0.0.0:9020->8000/tcp, :::9020->8000/tcp ordersystem853c6e86eee6 nginx "/docker-entrypoint.…" 5 weeks ago Up 2 weeks 0.0.0.0:80->80/tcp, :::80->80/tcp mynginx[[email protected] ordersystem]# docker exec -it ffcb1d91e28f /bin/sh/go # lsbin src supervisord.log supervisord.pid

```

```

(四)編譯映象以及釋出

docker run :執行映象生成容器( d表示執行在後臺,-p表示繫結到指定的主機埠)

docker build -t hellogin -f Dockerfile docker images docker run --name=hellogin -d -p 9020:8000 hellogin

```

```

讓本地和遠端共享檔案

docker run --name=hellogin -d -p 9020:8000 hellogin

參考文件

1.10張圖帶你深入理解Docker容器和映象

2.Docker遷移與備份

3.docker prune 命令

閱讀原文