Docker 基礎介紹

October 5, 2019

Why do you need Docker

從先前的架構來看,建置一個網站需要有 ApacheMySQLPHP 等。其中它們都依賴於當前的作業系統或著有些服務因為版本而依賴於不同的函式庫。因此這讓架構會變得有點凌亂導致新進的工程師必須去了解此凌亂的架構才能進行工作,而 Docker 技術能夠幾乎解決這樣的問題。

What can I do

從下圖看出,在作業系統上裝一個 Docker,並透過 docker run 去建置容器。Docker 能夠將每個運行服務的每一個組件,丟至該服務容器(container)中,讓每個服務依賴於該容器中被定義的 image

by docker.com

那這又跟 VM 又有麼差異呢 ? 在資源使用率上會有差異

What is container

一種隔離環境的技術, 可以擁有自己的 processnetworkmount,但是容器會共用 kernel。在又 Docker 此技術之前,容器的概念先前就有,像是 lkxchroot 等。但整合方面的完整性都歸功於 Dockercontainer 應該要說是一種概念,Docker 是一個實作 container 的技術。container 竟然是一種概念,它必定有規範,稱作 Open Container Initiative (OCI)。藉由此標準可以提升 container 不同解決方案的相容性。 然而,Open Container Initiative (OCI) 定義兩大的標準

對於 Docker 來說,image 相關的操作 images/pull/push 等甚至是藉由 Dockerfile 來建立自己的工作環境,這些都牽扯到了 imageImage Specification 就是來規範 Image。 相對的 Runtime Specification 是控制 container 的生命週期 create/delete/start/stop 或是運行 container 時透過 exec/attachcontainer 的互動。對於 container 中,隔離會使用 namespace 來完成,namespace 操作會有 pidnetworkipcmount 等。

Run container

Dockerfile 是建構 image 的檔案,而 container 就是運行 image 的結果。

by geekflare.com

Example

/test$ tree
.
└── Dockerfile
Define 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

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

使用 docker images 查看建構的 image

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

image 原則上應該越小越好

FROM ubuntu:14.04

RUN apt-get update && apt-get install -y nginx \
        && rm -rf /var/lib/apt/lists/*

COPY . /var/www/html/

EXPOSE 80

#ENTRYPOINT ["nginx"]
CMD ["nginx", "-g", "daemon off;"]

REPOSITORY                                          TAG                 IMAGE ID            CREATED             SIZE
nginx                                               v0.1                d17658937ea9        2 minutes ago       209MB

上面就成功運行了一個 container

ref