Docker深入淺出(一)

前言:

docker透過指令能快速建立相同執行環境並比起VM減少電腦資源消耗.

依照上面優點這就是為什麼docker可以在短時間內快速串紅.

上圖來源《Docker —— 從入門到實踐­》正體中文版

我在網路上找到很棒一個Docker操作流程圖,概括Docker操作時會用到的指令和動作關係.

因為外面有很多blog有對於Docker指令介紹本篇不著重在介紹指令,想要跟大家分享Docker其他細節.

關於Window中的Docker

如果我們需要在Prod運行一個系統可能需要許多不同的程式架構和語言才能完成(甚至有OS限制),在傳統我們選擇使用VM來幫建立不同環境來承載不同程式架構,但VM會模擬OS導致非常肥大,安裝使用資源較大,而Container的Image可以依照我們需求來客製我們需要核心並且Container可以宿主核心達到效能較佳的利用

在Window10 我們可以利用HyperV來跑Docker,原因是HyperV類似一個虛擬機幫我們模擬Linux並且運行Docker Daemon來控管docker container.

Docker需要在Linux中執行,Docker Daemon幫助Client透過命令來操作Docker,如果沒有Docker Daemon我們就無法執行Docker搂.

Image && Container

Image有點類似程式語言中的類別,Docker透過Image建立Container物件

Container類似程式語言中物件,透過Image(類別)建立出許多不同物件.

可以透過docker inspect {Container Id or name}查看Container資訊

  • -f:此參數可以透過go template查看設定值
  • –link:此參數會在/etc/hosts 下加入網路資訊

UnionFS

Docker有一個UnionFS概念共享Host Linux核心資源,不在建立新的OS層,docker會使用到bootfs和rootfs

  • bootfs:包含了bootloader和Linux core。使用者是不能對這層作任何修改。
  • rootfs:包含了一般系统上的常見目錄結構,類似/dev, /proc, /bin等等以及一些基本的文件和命令。

Image就像一個雞蛋核心是蛋黃,蛋白包覆蛋黃,最外層是蛋殼,雖然我們docker pull redis,但這個redis Image可能包含其他Image資訊(因為這樣才可以正常運行)

UnionFS設計可以很好的讓我們來重複利用不同Image往上搭建出我們想要的環境.

上圖來自網路上

scratch Image

scratch是所有Image的Base(有點像是C# object class),所有Image基於scratch往上搭建.

scratch Image只會包含最基本資訊可以跑起Container

Dockerfile

Dockerfile用來建置描述,我們要建立Image資訊

下面是Dockerfile我認為比較重要幾個關鍵字.

  • FROM:此Image是基於哪個Image
  • MAINTANER:維護作者
  • RUN:Container執行要跑的命令
  • EXPOSE:暴露port.
  • WORKDIR:Docker跑起來時,預設使用目錄
  • ENV:建立環境變數(環境變數可以當作後續命令參數使用)
  • ADD:Host主機目錄下複製檔案進Image且自動處理解壓tar壓縮包.
  • COPY:複製檔案從Host主機目錄到Image中.
  • VOLUME:保存Container數據資料持久化
  • CMD:指定容器Run時要使用的命令(只有最後一個CMD命令才會被執行,會被run最後執行命令覆蓋)
  • ENTRYPOINT:指定容器Run時要使用命令(不會被docker run覆蓋命令,他會追加執行命令)

    如果 Dockerfile 中如果存在多個ENTRYPOINT,只有最後一個才會生效

這裡有一點要注意Dockerfile使用關鍵字必須是大寫.

另外Dockerfile指令每執行一次都會在docker上新建一層。所以多過無意義層數,會造成Image膨脹過大。

Dockerfile Demo

這是我的一個SqlServer Demo Image

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#this image create from mssql-server-linux:latest
FROM microsoft/mssql-server-linux:latest
#who maintance this file.
MAINTANER dog830228@gmail.com
#execute command in Linux
RUN apt-get update \
&& apt-get install -y curl \
apt-transport-https
#set environment variable.
ENV BakDir="/var/opt/mssql/backup"
ENV PATH="/opt/mssql-tools/bin:${PATH}"

RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \
&& curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > /etc/apt/sources.list.d/mssql-release.list

RUN apt-get install -y locales \
&& echo "en_US.UTF-8 UTF-8" > /etc/locale.gen \
&& locale-gen \
&& apt-get -y install vim

## copy host file ./script/ to image /var/opt/mssql/backup
COPY ./script/ $BakDir
## set default path /var/opt/mssql/backup when client into container
WORKDIR $BakDir

## downland bak file from internet.
RUN mkdir -p $BakDir \
&& curl -L -o AdventureWorksDW2017.bak https://github.com/Microsoft/sql-server-samples/releases/download/adventureworks/AdventureWorksDW2017.bak

## execute command after running.
CMD /bin/bash "$BakDir/EntryPoint.sh"

Dockerfile寫下註解,我們能了解到Dockerfile就一個描述Image的檔案.

此文作者:Daniel Shih(石頭)
此文地址https://isdaniel.github.io/docker-deepknow-1/
版權聲明:本博客所有文章除特別聲明外,均採用 CC BY-NC-SA 3.0 TW 許可協議。轉載請註明出處!


如果本文對您幫助很大,可街口支付斗內鼓勵石頭^^