Docker | dockerfile 文件編寫

dockerfile 的作用

dockerfile 作用就是製作鏡像,保持開發,測試,生產環境的一致性。

直接將容器製作為鏡像

製作新的鏡像

	# 把容器按照自己的需求個性完之後,就可以創建自己的鏡像的
	docker commit 容器id 鏡像名稱:版本號

我們就使用在上篇中部署的nginx服務製作一個鏡像Docker | 部署Nginx

image-20220105011245344

	docker commit 07388cf54586 frost_nginx:1.0

image-20220105011428123

壓宿鏡像

	docker save -o 壓縮文件名稱 鏡像名稱:版本號

image-20220105011712676

只有在容器內做的個性,在壓縮的時候,才會打包到縮壓文件中

解壓鏡像,並運行

	docker load -i 壓縮文件名稱

因為在測試環境,所以先刪除這個鏡像,再用壓縮名進行還原

	docker load -i frost_nginx.tar

image-20220105011944848

使用dockerfile生成鏡像

dockerfile 命令

關鍵字 作用 備註
FROM 指定父鏡像 指定dockerfile基於那個image構建
MAINTAINER 作者信息 用來標明這個dockerfile誰寫的
LABEL 標籤 用來標明dockerfile的標籤 可以使用Label代替Maintainer 最終都是在docker image基本信息中可以查看
RUN 執行命令 執行一段命令 默認是/bin/sh 格式: RUN command 或者 RUN [“command” , “param1″,”param2”]
CMD 容器啟動命令 提供啟動容器時候的默認命令 和ENTRYPOINT配合使用.格式 CMD command param1 param2 或者 CMD [“command” , “param1″,”param2”]
ENTRYPOINT 入口 一般在製作一些執行就關閉的容器中會使用
COPY 複製文件 build的時候複製文件到image中
ADD 添加文件 build的時候添加文件到image中 不僅僅局限於當前build上下文 可以來源於遠程服務
ENV 環境變量 指定build時候的環境變量 可以在啟動的容器的時候 通過-e覆蓋 格式ENV name=value
ARG 構建參數 構建參數 只在構建的時候使用的參數 如果有ENV 那麼ENV的相同名字的值始終覆蓋arg的參數
VOLUME 定義外部可以掛載的數據卷 指定build的image那些目錄可以啟動的時候掛載到文件系統中 啟動容器的時候使用 -v 綁定 格式 VOLUME [“目錄”]
EXPOSE 暴露端口 定義容器運行的時候監聽的端口 啟動容器的使用-p來綁定暴露端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udp
WORKDIR 工作目錄 指定容器內部的工作目錄 如果沒有創建則自動創建 如果指定/ 使用的是絕對地址 如果不是/開頭那麼是在上一條workdir的路徑的相對路徑
USER 指定執行用戶 指定build或者啟動的時候 用戶 在RUN CMD ENTRYPONT執行的時候的用戶
HEALTHCHECK 健康檢查 指定監測當前容器的健康監測的命令 基本上沒用 因為很多時候 應用本身有健康監測機制
ONBUILD 觸發器 當存在ONBUILD關鍵字的鏡像作為基礎鏡像的時候 當執行FROM完成之後 會執行 ONBUILD的命令 但是不影響當前鏡像 用處也不怎麼大
STOPSIGNAL 發送信號量到宿主機 該STOPSIGNAL指令設置將發送到容器的系統調用信號以退出。
SHELL 指定執行腳本的shell 指定RUN CMD ENTRYPOINT 執行命令的時候 使用的shell

簡單的dockerfile書寫

	# 下載nginx安裝包
	wget -c //nginx.org/download/nginx-1.12.2.tar.gz 

書寫dockerfile文件:

# base image
FROM centos:7

# MAINTAINER
MAINTAINER frost <[email protected]>

# put nginx-1.12.2.tar.gz into /usr/local/src and unpack nginx
ADD nginx-1.12.2.tar.gz /usr/local/src

# running required command
RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel 
RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
RUN useradd -M -s /sbin/nologin nginx

# change dir to /usr/local/src/nginx-1.12.2
WORKDIR /usr/local/src/nginx-1.12.2

# execute command to compile nginx
RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio  --with-http_ssl_module  --with-http_realip_module    --with-http_addition_module    --with-http_xslt_module   --with-http_image_filter_module    --with-http_geoip_module  --with-http_sub_module  --with-http_dav_module --with-http_flv_module    --with-http_mp4_module --with-http_gunzip_module  --with-http_gzip_static_module  --with-http_auth_request_module  --with-http_random_index_module   --with-http_secure_link_module   --with-http_degradation_module   --with-http_stub_status_module && make && make install

ENV PATH /usr/local/nginx/sbin:$PATH

EXPOSE 80

ENTRYPOINT ["nginx"]

CMD ["-g","daemon off;"]

把安裝包和dockerfile文件放在同一個目錄下

image-20220105024453831

	# 執行編譯命令
	docker build -t frost_test_nginx:1.0 .

image-20220105023938211

最終生成一個鏡像:

image-20220105024233511

測試這個鏡像

	docker run -d -p 80:80 --name=frost_nginx frost_test_nginx:1.0

image-20220105024356779


細節決定成敗!
個人愚見,如有不對,懇請斧正!