前言
Docker并不是一個新的技術,容器化也不是,早在2006年就陸續出現了LXC, OpenVZ,Jail等容器虛擬化技術,但是為什么Docker卻能異軍突起呢?Docker的核心是基于 Linux的CGroup、Namespace和LayeredFS技術,通過資源的控制、隔離和對鏡像的分層處理,是Docker容器能夠將應用程序和運行環境打包到一起,這樣就可以Build, Ship And Run anywhere。與其說是Docker火,不如說是其天生的輕量級屬性,正好迎合了云計算大行其道的今天。因此,筆者認為Docker改變整個云計算和互聯網的格局是遲早的事,但是Docker在使用中,需要注意哪些事項呢?
一、掛載 volumes
docker run
的時候,如果需要掛載宿主機的某個目錄,可以這樣
1
|
docker run -it - v <host-path>:<container-path> <image> |
這里要注意以下幾個地方:
1、 <host-path>
和 <container-path>
都必須是目錄
2、 <container-path>
必須是容器中的絕對路徑
3、 <host-path>
路徑如果不存在,執行完成之后,docker 會給宿主機創建該目錄; <host-path>
可以使用相對路徑,但是相對的并不是當前的工作目錄,而是 /var/lib/docker/volumes/
4、如果只有一個路徑,比如 docker run -it -v <path> <image>
,這種情況叫做匿名掛載, <image>
表示的是 container 中的位置,宿主機會在 /var/lib/docker/volumes/ 下隨機創建一個目錄與 container 中的 <path>
對應
5、不管以何種方式 mount
,容器銷毀之后,由 -v
在宿主機上創建的目錄不會銷毀
6、在 container 中可以修改掛載目錄下文件的屬性,并且在宿主機上查看時一樣會生效。但是需要注意一點,如果在 container 中修改了文件的 owner 為 John,在宿主機上產看的時候,該文件的 owner 不一定還是 John。但該文件的 uid 是一樣的,至于顯示的名稱不一樣,是因為 container 和 host 的 /etc/passwd 文件內容不同
以上結果都可以通過 docker inspect <container>
結果中的 Mounts
查看。
二、dockerfile 中的 ENTRYPOINT 和 CMD
看似一樣,都是實現 container 啟動命令,但是需要注意:
1、都有兩種方式,數組方式,以及 shell 方式
1
2
|
[ "sh" , "-c" , "echo hello" ] sh -c 'echo hello' |
2、ENTRYPOINT 除了指定 container 入口之外,更重要的作用是: 通過它可以讓一個 container 像一個 executable 一樣。比如
1
|
ENTRYPOINT ["/bin/sh"] |
之后 build 出來的鏡像就像一個 sh 程序文件一樣,運行該 image,就像運行 sh 程序。
3、如果 ENTRYPOINT 指定了,并且采用了數組方式,即 ["exectable", "para1", "para2"]
,那么 CMD 指定的內容會被視為 ENTRYPOINT 數組中最后的一個參數
4、如果 ENTRYPOINT 使用 shell 方式,那么它會覆蓋所有的 CMD 以及 docker run
后面指定的 command
5、docker run
后面指定的 command 會取代 CMD 的內容
總結
以上就是為大家總結的一些個人在使用Docker時曾掉過的坑,希望分享出來讓大家在使用Docker的時候能避免這些問題,以上就是這篇文章的全部內容,希望對大家能有所幫助。