dockerfile詳解

我們可以把對容器的所有操作命令都記錄到一個文件裏,就像寫腳本程序。

之後用 docker build 命令以此文件爲基礎製作一個鏡像,並會自動提交到本地倉庫。

這樣的話鏡像的構建會變的透明化,對鏡像的維護起來也更加簡單,只修改這個文件即可。

同時分享也更加簡單快捷,因爲只要分享這個文件即可。

Dokcerfile 是一個普通的文本文件,文件名一般叫 Dockerfile

其中包含了一系列的指令(Instruction), 每一條指令都會構建一層,就是描述該層是如何創建的。

一、小試牛刀

1、編輯 Dockerfile 文件

[root@localhost ~]# mkdir centos_dockerfile
[root@localhost ~]# cd centos_dockerfile/
[root@localhost centos_dockerfile]# vi Dockerfile
FROM centos:latest
LABEL maintainer="yangge <[email protected]>"  description="Install tree vim*"
RUN rpm -qa | grep tree || yum  install -y tree vim*

指令介紹:

FORM 定義一個基礎鏡像
LABEL 定義一些元數據信息,比如作者、版本、關於鏡像的描述信息
RUN 執行命令行的命令
2、構建鏡像
docker bulid -t 倉庫名/鏡像名:tag .
eg : [root@localhost centos_dockerfile]# docker build -t centos:1.20 .

二、最佳實踐

一般來說,應該會將 Dockerfile 置於一個空目錄下,或者項目根目錄下。如果該目錄下沒有所需文件,那麼應該把所需文件複製一份過來。如果目錄下有些東西確實不希望構建時傳給 Docker 引擎,那麼可以用 .gitignore 一樣的語法寫一個 .dockerignore,該文件是用於剔除不需要作爲上下文傳遞給 Docker 引擎的

Dockerfile 的文件名並不要求必須爲 Dockerfile,而且並不要求必須位於上下文目錄中,比如可以用 -f …/Dockerfile.qf 參數指定某個文件作爲 Dockerfile。

一般大家習慣性的會使用默認的文件名 Dockerfile,以及會將其置於鏡像構建上下文目錄中。

[root@localhost dockerfile_qf_ignore]# tree .
.
├── Dockerfile.qf
└── test
    ├── a.txt
    ├── b.txt
    └── test.qf
[root@localhost dockerfile_qf_ignore]# cat Dockerfile.qf
FROM alpine
COPY ./test.qf /root/test.qf
[root@localhost dockerfile_qf_ignore]# docker build -f ../Dockerfile.qf -t alpine:test.qf .
[root@localhost dockerfile_qf_ignore]# docker run -it alpine:test.qf /bin/sh

三、詳解

1、FROM 指令
2、LABEL 指令

用於指定一個鏡像的描述信息

3、ENV 指令

用於設置環境變量

4、RUN 指令

在容器內執行 shell 命令,默認會是用 /bin/sh -c 的方式執行

5、CMD 指令

Dockerfile 中只能有一條CMD指令。如果列出多個,CMD 則只有最後一個CMD會生效。
CMD 主要目的是爲運行容器時提供默認值

6、ENTRYPOINT 指令

ENTRYPOINT 的目的和 CMD 一樣,都是在指定容器的啓動程序及參數。

7、WORKDIR 指令

用於聲明當前的工作目錄,以後各層的當前目錄就被改爲指定的目錄。
格式爲 WORKDIR <工作目錄路徑>。
如該目錄不存在,WORKDIR 會幫你建立目錄。

8、COPY 指令

格式:
	COPY <源路徑>... <目標路徑>
	
	COPY ["<源路徑1>",... "<目標路徑>"]

COPY會從構建的上下文目錄中,把源路徑的文件或目錄複製到新的一層的鏡像內的 <目標路徑> 位置

9、ADD 指令

ADD 指令和 COPY 的格式和性質基本一致.
官方推薦使用 COPY 進行文件的複製.

10、USER 指令

USER 則是改變執行 RUN, CMD 以及 ENTRYPOINT 這類命令的身份.

11、ONBILUD 指令

ONBUILD 是一個特殊的指令,它後面跟的是其它指令,比如 RUN, COPY 等,而這些指令,在當前鏡像構建時並不會被執行。
只有當以當前鏡像爲基礎鏡像,去構建下一級鏡像的時候纔會被執行。

Dockerfile 中的其它指令都是爲了定製當前鏡像而準備的,唯有 ONBUILD 是爲了幫助別人定製自己而準備的

四、例子

vim Dockerfile #首字母大寫
# This my first nginx Dockerfile
# Version 1.0
# Base images 基礎鏡像
FROM centos
#MAINTAINER 維護者信息
MAINTAINER luoyinsheng
#ENV 設置環境變量
ENV PATH /usr/local/nginx/sbin:$PATH
#ADD 文件放在當前目錄下,拷過去會自動解壓
ADD nginx-1.16.1.tar.gz /usr/local/ 
#RUN 執行以下命令
RUN yum -y install epel-release.noarch
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean
all
RUN useradd -s /sbin/nologin -M www
#WORKDIR 相當於cd
WORKDIR /usr/local/nginx-1.16.1
RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module
--with-pcre && make && make install
#EXPOSE 映射端口
EXPOSE 80
#CMD 運行以下命令
CMD ["nginx","-g","daemon off;"]
docker build -t nginx:v1 .

五、圖解

在這裏插入圖片描述

發佈了89 篇原創文章 · 獲贊 253 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章