快收藏!超強圖解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的特性將運行中的進程空間暫停。具體的內部原理你可以在這裏找到:http://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 ```

```

```

我們查看鏡像

[root@VM-0-14-centos 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是啥呢?

[root@VM-0-14-centos 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 去進入容器,但是鏡像不行,容器可更改,鏡像不行

[root@VM-0-14-centos 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[root@VM-0-14-centos 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 命令

閲讀原文