【docker專題(6)】Dockerfile

Dockerfile介紹

Dockerfile是docker構建鏡像的基礎,也是docker區別於其他容器的重要特徵,正是有了Dockerfile,docker的自動化和可移植性才成爲可能。

不論是開發還是運維,學會編寫Dockerfile幾乎是必備的,這有助於你理解整個容器的運行。

FROM , 從一個基礎鏡像構建新的鏡像
FROM ubuntu

MAINTAINER , 維護者信息
MAINTAINER William <[email protected]>

ENV , 設置環境變量
ENV TEST 1

RUN , 非交互式運行shell命令
RUN apt-get -y update
RUN apt-get -y install nginx

ADD , 將外部文件拷貝到鏡像裏,src可以爲url
ADD   http://nicescale.com/  /data/nicescale.tgz
# 將index.php複製到容器內的/var/www目錄下
# 會自動解壓tar包
ADD  index.php /var/www/

# 用copy而不用add,因爲ADD指令會自動解壓tar文件
COPY redis.tgz /home/redis.tgz

# 設置工作目錄,exec進入容器就直接進入到這個目錄中
WORKDIR /path/to/workdir
WORKDIR /var/www

USER , 設置用戶ID
USER nginx

# 設置volume, 聲明一個數據卷, 可用於掛載, []裏面是路徑
# 出於可移植和分享的考慮,用於-v主機目錄:容器目錄這種方法不能夠直接在DockerFile中實現
# 可自行創建軟鏈接實現特定目錄掛載
VULUME <#dir>
VOLUME ['/data']

EXPOSE , 暴露哪些端口
EXPOSE 80 443

ENTRYPOINT ["executable", "param1","param2"]執行命令
ENTRYPOINT ["/usr/sbin/nginx"]

# 一般只用cmd就可以了
CMD ["param1","param2"]
CMD ["start"]
docker創建、啓動container時執行的命令
# 如果設置了ENTRYPOINT,則CMD將作爲參數
# 如果沒有設置ENTRYPOINT, 則直接命令參數傳入

[info] - 儘量將一些常用不變的指令放到前面

  • CMD和ENTRYPOINT儘量使用json數組方式

通過Dockerfile構建image

# 構建
docker build -t allovince/php-helloworld:v1 .

# 運行並綁定端口8080
docker run -d -p 8080:8080 allovince/php-helloworld

Dockerfile示例

#使用的基礎鏡像
FROM centos
#作者信息
MAINTAINER by caiwen ([email protected])

WORKDIR /usr/local/src
#安裝wget
RUN yum install -y  wget
#下載並解壓源碼包
RUN wget http://nginx.org/download/nginx-1.8.0.tar.gz
RUN tar -zxvf nginx-1.8.0.tar.gz
WORKDIR nginx-1.8.0
#編譯安裝nginx
RUN yum install -y gcc make pcre-devel zlib-devel
RUN ./configure   --prefix=/usr/local/nginx   --with-pcre
RUN make
RUN make install

#修改Nginx配置文件,以非daemon方式啓動
RUN echo "daemon off;">>/usr/local/nginx/conf/nginx.conf

#開放22、80、443端口
EXPOSE 22
EXPOSE 80
EXPOSE 443

#設置生成容器時需要執行的腳本
CMD ["/usr/local/nginx/sbin/nginx","start"]

構建鏡像

docker build -t nginx:v1 .
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章