DockerFile簡介
DockerFile可以說是一種可以被Docker程序解釋的腳本,DockerFile是由一條條的命令組成的,每條命令對應linux下面的一條命令,Docker程序將這些DockerFile指令再翻譯成真正的linux命令,其有自己的書寫方式和支持的命令,Docker程序讀取DockerFile並根據指令生成Docker鏡像,相比手動制作鏡像的方式,DockerFile更能直觀的展示鏡像是怎么產生的,有了寫好的各種各樣DockerFile文件,當后期某個鏡像有額外的需求時,只要在之前的DockerFile添加或者修改相應的操作即可重新生成新的Docke鏡像,避免了重復手動制作鏡像的麻煩。
https://docs.docker.com/engine/reference/builder/ #dockerfile使用文檔
DockerFile指令介紹
ADD:拷貝,可以自動解壓tar包;
COPY:拷貝;
ENV:設置環境變量;
EXPOSE:暴露容器端口;
FROM:父鏡像;
LABEL:標簽,指定生成鏡像的元數據,如作者及郵箱等;
STOPSIGNAL:指定容器退出的信號值;當容器退出時,執行所指定的信號值,如正常退出信號值;
USER:指定容器執行操作的用戶;即Dockerfile中,USER以下的所有指令,全部都以USER所指定的用戶身份去執行,並且將以指定用戶的身份去進入到容器中;
VOLUME:創建掛載點,用於掛載外部存儲,將容器中的數據保存到外部存儲上。避免數據丟失,一次可以創建多個掛載點;
WORKDIR:在容器中,指定工作目錄;WORKIDR指定一個如/apps/nginx,則WORKDIR后面的操作,如創建刪除,將在/apps/nginx目錄下執行;如果指定多個WORKDIR,如一個指定了/apps/nginx/,一個指定了linux,則最終的工作目錄是/apps/nginx/linux;
RUN:在容器中執行shell命令;當執行Dockerfile文件中的RUN指令時,會生成一個臨時容器,在臨時容器中執行完RUN所指定的命令后,刪除容器(其實是把容器提交為一個鏡像);LABEL、EXPOSE、ENV、USER、WORKDIR、VOLUME、ENTRYPOINT、CMD都會在創建鏡像時產生一個臨時容器;
ENTRYPOINT:也是鏡像啟動為容器后,所執行的指令,如果ENTRYPOINT后面有CMD,則CMD中的指令將以參數形式傳遞給ENTRYPOINT;如ENTRYPOINT ["nginx"] CMD["-g", "daemon off;"]
CMD:鏡像啟動為容器后,默認執行的命令;
注意:
容器中必須有一個一直運行的進程(任務),否則容器執行完所指定的任務之后,就會退出;即容器如果沒有一個守護進程(一直在前台運行的進程),則容器會直接退出,如果把守護進程kill掉,容器也會直接退出。
DockerFile 制作編譯版 nginx 1.16.1 鏡像
1、root@test:~# mkdir /opt/dockerfile/{web/{nginx/static,php,tomcat},system/{ubuntu,centos}} -pv #創建dockerfile文件存放目錄
2、root@test:~# cd /opt/dockerfile/web/nginx/
3、root@test:/opt/dockerfile/web/nginx# zip static.zip static/* #nginx所需要的數據
4、root@test:/opt/dockerfile/web/nginx# vim Dockerfile #制作dockerfile
#Docker image for nginx #注釋信息
FROM centos:7.7.1908 #指定父鏡像,基於哪個鏡像基礎之上做自定義構建;第一行必須為FROM,如果本地有該鏡像,使用本地,如果本地沒有,則去官方倉庫下載
LABEL maintainer="dongge 903662133@qq.com" #指定維護者信息,郵箱
ENV password 123456 #創建環境變量,將變量傳遞給容器
RUN yum install epel-release -y && yum install vim wget unzip tree lrzsz gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop -y #run是執行shell命令,構建鏡像時,shell命令必須是非交互式的
ADD nginx-1.16.1.tar.gz /usr/local/src #沒生成容器時,是打到鏡像中,生成為容器時,則打到容器的/usr/local/src中;ADD會對tar.gz的包自動解壓,COPY不會,tar是linux自帶命令,unzip不是;如果ADD的是配置文件,則會把容器中指定目錄下同名的文件進行覆蓋
RUN cd /usr/local/src/nginx-1.16.1 && ./configure --prefix=/apps/nginx && make && make install && rm /usr/local/src/nginx-1.16.1 -rf
ADD static.zip /apps/nginx/html
RUN cd /apps/nginx/html && unzip static.zip && rm static.zip -f
EXPOSE 80 443 #暴露容器的80和443端口
CMD ["/apps/nginx/sbin/nginx", "-g", "daemon off;"] #鏡像啟動為容器后,指定默認執行的指令;在容器前台執行nginx進程,使之成為pid為1的守護進程
5、root@test:/opt/dockerfile/web/nginx# docker build -t nginx:make-v1 . #創建鏡像,指定鏡像的倉庫名及tag號,指定Dockerfile文件所在路徑為當前目錄下
6、oot@test:/opt/dockerfile/web/nginx# docker run -it -p 8686:80 nginx:make-v1 #創建容器
注意事項:
dockerfile如果前面執行過,並且前面的內容沒有發生過變化,則前面內容不會再執行;如果是中間某步驟發生了變化,則發聲變化之后的所有步驟都需要重新執行。