Docker | dockerfile 檔案編寫

一點浩然氣~發表於2022-01-05

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 https://nginx.org/download/nginx-1.12.2.tar.gz 

書寫dockerfile檔案:

# base image
FROM centos:7

# MAINTAINER
MAINTAINER frost <ycr1997@163.com>

# 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



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

相關文章