以下是閱讀 《每天5分鐘玩轉Docker容器技術》的筆記:
- Dockerfile 中每一個指令都會創建一個鏡像層,上層是依賴於下層的。無論什麼時候,只要某一層發生變化,其上面所有層的緩存都會失效。
-
docker build -t target_image_name .
命令結尾的 . 指明 build context 爲當前目錄。 Docker 默認會從 build context 中查找 Docker 文件。 我們也可以通過-f
參數指定 Dockerfile的位置 - 當容器啓動時,一個新的可寫層被加載到鏡像的頂部。 這一層通常被稱作“容器層”,“容器層”之下的都叫“鏡像層”。所有對容器的改動 - 無論添加、刪除、還是修改文件都只會發生在容器層中。
- Docker 容器就是 Docker 鏡像的運行實例。只有容器層是可寫的,容器層下面的所有鏡像層都是隻讀的。
下面我們深入討論容器層的細節。
鏡像層數量可能會很多,所有鏡像層會聯合在一起組成一個統一的文件系統。如果不同層中有一個相同路徑的文件,比如 /a,上層的 /a 會覆蓋下層的 /a,也就是說用戶只能訪問到上層中的文件 /a。在容器層中,用戶看到的是一個疊加之後的文件系統。
- 添加文件
在容器中創建文件時,新文件被添加到容器層中。 - 讀取文件
在容器中讀取某個文件時,Docker 會從上往下依次在各鏡像層中查找此文件。一旦找到,立即將其複製到容器層,然後打開並讀入內存。 - 修改文件
在容器中修改已存在的文件時,Docker 會從上往下依次在各鏡像層中查找此文件。一旦找到,立即將其複製到容器層,然後修改之。 - 刪除文件
在容器中刪除文件時,Docker 也是從上往下依次在鏡像層中查找此文件。找到後,會在容器層中記錄下此刪除操作。
只有當需要修改時才複製一份數據,這種特性被稱作 Copy-on-Write。可見,容器層保存的是鏡像變化的部分,不會對鏡像本身進行任何修改。
這樣就解釋了我們前面提出的問題:容器層記錄對鏡像的修改,所有鏡像層都是隻讀的,不會被容器修改,所以鏡像可以被多個容器共享。
###############################################################
Docker 容器
Docker 容器就是 Docker 鏡像的運行實例。
用戶可以通過 CLI(docker)或是 API 啓動、停止、移動或刪除容器。可以這麼認爲,對於應用軟件,鏡像是軟件生命週期的構建和打包階段,而容器則是啓動和運行階段。
-
docker run
:創建一個新的容器並運行一個命令.docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
e.g. 實例:使用docker鏡像nginx:latest以後臺模式啓動一個容器,並將容器命名爲mynginx。
docker run --name mynginx -d nginx:latest
使用鏡像nginx:latest以後臺模式啓動一個容器,並將容器的80端口映射到主機隨機端口。
docker run -P -d nginx:latest
使用鏡像 nginx:latest,以後臺模式啓動一個容器,將容器的 80 端口映射到主機的 80 端口,主機的目錄 /data 映射到容器的 /data。
docker run -p 80:80 -v /data:/data -d nginx:latest
綁定容器的 8080 端口,並將其映射到本地主機 127.0.0.1 的 80 端口上。
$ docker run -p 127.0.0.1:80:8080/tcp ubuntu bash
使用鏡像nginx:latest以交互模式啓動一個容器,在容器內執行/bin/bash命令。
runoob@runoob:~$ docker run -it nginx:latest /bin/bash root@b8573233d675:/#
/######################################################
docker run
vs docker exec
vs docker start
:
docker run
:
Description
Run a command in a new container
Usage
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker exec
:
Description
Run a command in a running container
Usage
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
docker start
:
Description
Start one or more stopped containers
Usage
docker start [OPTIONS] CONTAINER [CONTAINER...]