Docker | dockerfile 文件編寫
- 2022 年 1 月 5 日
- 筆記
- docker, docker commit, Dockerfile, Nginx
dockerfile 的作用
dockerfile 作用就是製作鏡像,保持開發,測試,生產環境的一致性。
直接將容器製作為鏡像
製作新的鏡像
# 把容器按照自己的需求個性完之後,就可以創建自己的鏡像的
docker commit 容器id 鏡像名稱:版本號
我們就使用在上篇中部署的nginx服務製作一個鏡像Docker | 部署Nginx
docker commit 07388cf54586 frost_nginx:1.0
壓宿鏡像
docker save -o 壓縮文件名稱 鏡像名稱:版本號
只有在容器內做的個性,在壓縮的時候,才會打包到縮壓文件中
解壓鏡像,並運行
docker load -i 壓縮文件名稱
因為在測試環境,所以先刪除這個鏡像,再用壓縮名進行還原
docker load -i frost_nginx.tar
使用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文件放在同一個目錄下
# 執行編譯命令
docker build -t frost_test_nginx:1.0 .
最終生成一個鏡像:
測試這個鏡像
docker run -d -p 80:80 --name=frost_nginx frost_test_nginx:1.0
細節決定成敗!
個人愚見,如有不對,懇請斧正!