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 中,只能有一個 ENTRYPOINT 或 CMD 指令,如果有多個 ENTRYPOINT 或 CMD 指令則以最後一個為準。

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 上的資料全都一併消失。因此可藉由 volume 或 bind 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