1. 程式人生 > >【Docker自定制鏡像之Dockerfile】

【Docker自定制鏡像之Dockerfile】

文本 腳本 瀏覽器 vol rfi docker 分享圖片 信息 exe

鏡像的定制,就是定制每一層所添加的配置、文件,如果可以把每一層修改、安裝、構建、操作的命令都寫入到一個腳本中,用腳本來構建、定制鏡像,這個腳本就是Dockerfile

Dockerfile是一個文本文件,其內包含了一條條的指令(Instruction),每一條指令構建一層,因此每一條指令的內容就是沒每一層應當如何構建的.

Dockerfile ---------??


FROM
指定基於哪個鏡像文件來構建新的鏡像,盡量使用官方的bash image
示例:
FROM 鏡像名/鏡像ID[:tag]


LABEL
容器元消息,幫助信息,Metadata,類似於代碼註釋
示例:
LABEL version="1.0"

版本標示
LABEL maintainer="name @163.com" 聲明制作人


RUN
創建鏡像時執行的命令


WORKDIR
切換工作目錄


COPY
把本機的文件添加到容器中
示例:
COPY flask_web.py /app/ 把本機的flask_web.py文件復制到容器中的/app目錄下,會自動創建/app目錄


ADD
除了COPY的功能外還有解壓功能,應優先使用COPY命令


ENV
設置環境變量,盡可能的使用ENV來設置環境變量,以增加可維護性
示例:
ENV MYSQL_VERSION 5.6 設置一個MySQL常量
RUN yum install -y mysql-server="${MYSQL_VERSION}"
調用MySQL常量


CMD
設置容器啟動後默認執行的命令和參數
??如果定義多個CMD,則只有最後一個會執行
??如果 docker run 時指定了其它命令(例如:/bin/bash、python flask_web.py),則CMD命令會被忽略



EXPOSE
網絡設置
示例:
EXPOST 8080 暴露容器的8080端口


VOLUME
存儲設置


ENTRYPOINT
設置容器啟動時運行的命令
讓容器以應用程序或服務的形式運行,不會被忽略,一定會執行

關於Shell格式和Exec格式


對於相對的命令,Shell格式與Exec格式的對比如下.


Shell格式

RUN yum -y install vim
CMD echo "Hello Docker"
ENTRYPOINT echo "Hello Docker"


Exec格式

RUN ["apt-get", "install", "-y", "vim"]
CMD ["/bin/echo", "Hello Docker"]
ENTRYPOINT["/bin/echo","Hello Docker"]

需要註意的是:
通過Shell格式運行的命令可以讀取設置的變量,而Exec格式則不可以讀取,Exec格式僅僅是執行一個命令.

下面將使用Dockerfile來制作一個Flask Web服務


首先,準備一個用於調用Flask web服務的腳本:

"""flask_web.py文件代碼如下"""
from flask import Flask
app=Flask(__name__)
@app.route(‘/‘)
def run():
    return ‘is ok‘
if __name__ == ‘__main__‘:
    app.run(host=‘0.0.0.0‘, port=8080)  # 我們這裏使用的是8080端口


然後,開始寫Dockerfile:

# 指定基於哪個基礎鏡像來構建
FROM python:2.7

# 制作人
LABEL maintainer=‘zyk [email protected]‘

# 安裝flask第三方庫
RUN easy_install flask

# 將本機的flask_web.py文件復制到容器的/app目錄下,會自動生成/app目錄
COPY flask_web.py /app/

# 進入/app目錄
WORKDIR /app

# 暴露容器的8080端口
EXPOSE 8080

# 設置容器啟動後默認執行的命令和參數,以Exec格式執行,註意:要用雙引號
CMD ["python", "flask_web.py"]


最後,制作鏡像:

# ?? Dockerfile與flask_web.py文件在同級目錄
[root@fedora docker]# ls
Dockerfile  flask_web.py

# 開始制作鏡像
[root@fedora docker]# docker build -t zyk/flask .


制作完成後,查看鏡像並啟動:

# 查一下鏡像ID
[root@fedora docker]# docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
zyk/flask                   latest              c4e156f3222a        50 seconds ago      911 MB

# 啟動鏡像
[root@fedora docker]# docker run -d -p 9000:8080 c4e156f3222a


好了,打開瀏覽器訪問測試:
技術分享圖片

【Docker自定制鏡像之Dockerfile】