圖表君聊docker-Dockerfile

圖表君聊docker-Dockerfile

前邊幾篇文章給你們介紹了docker的三大基本概念。可能你們以爲概念的東西比較生澀,有沒有更多實戰的例子呢?好了,從這篇文章開始,我會給你們介紹更多實際的例子來幫助你們,那麼就從dockerfile開始吧。html

在介紹docker image的時候,我給你們介紹了build image的兩種方法,可是留了一個坑,就是DockerFile,那今天圖表君就來把這個坑填了。前端

什麼是Dockerfile

Dockerfile其實是由一行行命令組成的,讓用戶能夠方便的建立自定義鏡像。下邊就是一個Dockerfile的例子node

FROM python:2.7
MAINTAINER Aaron Chen "mail@aaronchen.cn"
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
EXPOSE 5000
ENTRYPOINT ["python"]
CMD ["app.py"]

這個例子是啓動一個python flask app的Dockerfile(flask是python的一個輕量的web框架)。下邊我就來介紹下dockerfile裏的指令。python

一般來講,Dockerfile的指令分爲四類,基礎鏡像信息,維護者信息,鏡像操做指令以及容器啓動時執行的指令。經常使用的指令有以下:webpack

FROM

用於指定基礎的imagesgit

格式爲 FROM <image> or FORM <image>:<tag>github

一個Dockerfile裏的第一條指令必須爲FORM指令。web

MAINTAINER

格式爲 MAINTAINER <name> 用於指定維護者信息。docker

RUN

格式爲 RUN <command>
RUN命令將在基礎鏡像上執行相應的指令,並提交爲新的鏡像。npm

CMD

啓動Docker時運行的命令,一個dockerfile只有一個CMD起效,可是當用戶在docker run 時提供了運行的命令時,CMD命令就會被覆蓋。

推薦的格式爲爲 CMD["executable","param1","param2"]

另一種格式爲 CMD["param1","param2"],配合ENTRYPOINT同時使用,其中的兩個參數會提供給ENTRYPOINT。

ENTRYPOINT

配置容器啓動後執行的命令,而且不可被 docker run 提供的參數覆蓋。每一個 Dockerfile 中只能有一個 ENTRYPOINT ,當指定多個時,只有最後一個起 效。

COPY

複製本地主機的<src>(Dockerfile所在目錄的相對路徑)到容器裏<dest>

WORKDIR

爲後續的 RUN 、 CMD 、 ENTRYPOINT 指令配置工做目錄。
格式爲 WORKDIR /workdirPath

上邊就是一些基礎的命令,還有其餘一些命令,圖表君就不一一介紹了,你們有興趣了能夠去docker官網上本身查詢。
咱們再來看上邊的Dockerfile的例子,如今應該能看懂了把。它定義就是:

  1. 從dockerhub上pull下python 2.7的基礎鏡像。

  2. 維護者的信息是圖表君

  3. copy當前目錄到容器中的 /app目錄下

  4. 指定工做路徑爲/app

  5. 安裝依賴

  6. 暴露5000端口

  7. 啓動app

建立鏡像

編寫好Dockerfile後,就可使用docker build來build images了。其格式爲:
docker build 選項 [路徑],一般咱們可使用.dockerignore來定義docker build images的時候忽略的文件,一般項目的依賴咱們通常會忽略(例如 npm install後的 node_modules)。咱們可使用 docker build . -t pythonflasksample來build image. 而後咱們就可使用docker run 來運行容器。

又一個栗子

上邊是一個python app的栗子,咱們再來看一個前端的栗子。

├── .dockerignore
├── .gitignore
├── Dockerfile
├── README.md
├── app
│   ├── directives
│   ├── index.html
│   └── index.js
├── dist
│   ├── bundle.js
│   └── index.html
├── node_modules
├── karma.conf.js
├── package.jsonimage
└── webpack.config.js

這是一個Angular的前端project的項目目錄。咱們用npm來管理和安裝依賴的包,用webpack來構建項目。下來用Dockerfile來定義一個docker image,將其容器化。

FROM node:4.6
     MAINTAINER Aaron Chen<mail@aaronchen.cn>
 
     RUN mkdir /app
     WORKDIR /app
     COPY . /app
 
     RUN npm install
     
     EXPOSE 8080

這裏Dockerfile的定義,很簡單,下載基礎鏡像node 4.6,安裝依賴,暴露接口。

下來咱們用docker build . -t webpackdemo來build這個image,當image構建好後,簡單的執行docker run -it -p 3456:8080 webapackdemo2 npm run start,好了一個前端的project就啓動起來了。至關的輕鬆,讓你訪問http://localhost:3456/的時候就能夠訪問了。

這裏是這個project的github repo,你們能夠來一看究竟。
dockerSample

解決了什麼問題呢?

若是你是個前端開發人員,看到這裏的時候必定會以爲,這到底解決了什麼問題呢?我本地啓動也沒有什麼問題啊。的確圖表君剛開始也有這樣的疑問,但通過思考,我認爲解決了這幾個問題:

  1. 讓開發的環境能更簡單的搭建了。常常會有這樣的場景,在別人機器上正常的開發環境,在本身的機器上爲何就是不行呢?研究了半天,發現人家用的是node 6.5,本身用的是node 0.11。在使用了docker之後就解決了這樣的問題,只要pull下image就OK了,全部的版本和依賴都固定下來了。

  2. 如今業績最流行的構架方式當屬於微服務了,一個系統的正常啓動依賴於多個服務,有可能對於其中的某些服務咱們並不熟悉,那麼若是將服務容器化了之後,就能有效的解決這樣的問題了。另外對於團隊裏的其餘非技術人員使得他們也能容易的在本地搭建起環境來。

其實,上邊這個前端項目中的dockerfile有一個很大的問題,圖表君給你們留個問題。若是你們看出來了,歡迎給我留言

好了,Dockerfile就介紹這麼多,咱們下期再見。


歡迎訂閱個人公衆號,第一時間獲取圖表君的新文章。

圖片描述

相關文章
相關標籤/搜索