Docker 資源詳解

March 30, 2018

Table of content

Docker image

Dockerfile 是建構 image 的檔案,建構 image 時會讀取 Dockerfile 的指令一層一層的建構。而 container 是由 image 建構出來的實例。

image 特點

分層儲存

當需要修改 image 內的某個檔案時,只會對上方的讀寫層進行改動,不會覆蓋下層既有檔案系統內容。

Copy-on-Write

從分層儲存可以知道,在建立 container 之後我們會在一個可寫層上並進行操作,但是在 image layers 的檔案能否修改 ? 是可以的,會複製該檔案至可寫層。

Dockerfil Arg

by 網管人

CMD vs ENTRYPOINT

Dockerfile 中,只能有一個 ENTRYPOINTCMD 指令,如果有多個 ENTRYPOINTCMD 指令則以最後一個為準。

Example

Nginx Dockerfile
FROM ubuntu:14.04

RUN apt-get update && apt-get install -y nginx
COPY . /var/www/html/
EXPOSE 80
#ENTRYPOINT ["nginx"]
CMD ["nginx", "-g", "daemon off;"]

Build Dockerfile

使用 docker build -t {ImageName}:{tag} . 建構

使用 docker images 查看建構的 image

REPOSITORY                                          TAG                 IMAGE ID            CREATED             SIZE
nginx                                               v0                  55077273116a        20 minutes ago      222MB

Docker Port mapping

當運行一個 Docker 實例時

$ docker run

,此 container(實例) 會在 Docker host 上。假設該 container 為一個 web 應用程式,在 container 中 port 號為 5000,那用戶該如何訪問存取該 web 應用程式,以客戶端來說會輸入 IP 或 Domain,但 container 預設給予的 IP 為私有 IP,因此客戶端無法與私有 IP 連接,可以透過 port 映射方式,將 container 中 web 應用程式的 5000 port 號,映射到外部主機 80 port,

$ docker run -p 80:5000 

所以客戶端瀏覽時透過外部主機連線,外部主機在路由至 port 5000 的 container

Docker Volume mapping

依照上面的描述,當用 container 建立 mysql 時並在 container 生命週期內,其資料儲存都是存在的。不過,只要做了刪除該 mysql 的 container 動作,則該儲存在 mysql 上的資料全都一併消失。因此可藉由 volumebind Mounts 等進行持續的儲存。

volumn 來說會有這些優勢

Linux 系統中 Docker 的數據預設在 /var/lib/docker

Command
docker volume create
docker volume inspect
docker volume ls
docker volume prune
docker volume rm

Docker Networking

Docker 的網路隔離技術,用到了

Docker 會有四種模式

None

Bridge

Host

Container

Command
docker network connect
docker network create
docker network diconnect
docker network inspect
docker network ls
docker network prune
docker network rm

Ref