Why do you need Docker
從先前的架構來看,建置一個網站需要有 Apache
、MySQL
、PHP
等。其中它們都依賴於當前的作業系統或著有些服務因為版本而依賴於不同的函式庫。因此這讓架構會變得有點凌亂導致新進的工程師必須去了解此凌亂的架構才能進行工作,而 Docker
技術能夠幾乎解決這樣的問題。
What can I do
從下圖看出,在作業系統上裝一個 Docker
,並透過 docker run
去建置容器。Docker
能夠將每個運行服務的每一個組件,丟至該服務容器(container)中,讓每個服務依賴於該容器中被定義的 image
。
by docker.com
那這又跟 VM 又有麼差異呢 ? 在資源使用率上會有差異。
What is container
一種隔離環境的技術, 可以擁有自己的 process
、network
、mount
,但是容器會共用 kernel
。在又 Docker
此技術之前,容器的概念先前就有,像是 lkx
、chroot
等。但整合方面的完整性都歸功於 Docker
。
container
應該要說是一種概念,Docker
是一個實作 container
的技術。container
竟然是一種概念,它必定有規範,稱作 Open Container Initiative (OCI)
。藉由此標準可以提升 container
不同解決方案的相容性。
然而,Open Container Initiative (OCI)
定義兩大的標準
對於 Docker
來說,image
相關的操作 images/pull/push
等甚至是藉由 Dockerfile
來建立自己的工作環境,這些都牽扯到了 image
。Image Specification
就是來規範 Image
。
相對的 Runtime Specification
是控制 container
的生命週期 create/delete/start/stop
或是運行 container
時透過 exec/attach
與 container
的互動。對於 container
中,隔離會使用 namespace
來完成,namespace
操作會有 pid
、network
、ipc
、mount
等。
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
。