《Docker技術入門與實踐》Docker入門4-使用Dockerfile創建鏡像

Dockerfile基礎

Dockerfile分四部分組成: 基礎鏡像、維護者信息、鏡像操作指令、啓動時命令
ps: 我的本地鏡像已經有centos,若沒有請使用docker pull centos

入門例子

創建Dockerfile文件

cd temp && vim Dockerfile

#若本地鏡像沒有centos請先使用`docker pull centos`
FROM centos

MAINTAINER thewindkee [email protected]

RUN  echo hi

在當前目錄下執行docker build .
效果:構建了一個centos鏡像,並且輸出了hi

   Sending build context to Docker daemon 2.048 kB
   Step 1/3 : FROM centos
    ---> 1e1148e4cc2c
   Step 2/3 : MAINTAINER thewindkee [email protected]
    ---> Running in aa0fbd3c9882
    ---> fdeb2afefe47
   Removing intermediate container aa0fbd3c9882
   Step 3/3 : RUN echo hi
    ---> Running in f15e63f49e17
    
    hi
     ---> b96f2a0acf5d
    Removing intermediate container f15e63f49e17
    Successfully built b96f2a0acf5d

在這裏插入圖片描述

★含有nginx的例子

實際不需要這麼麻煩,直接使用docker pull nginx即可,這裏只是作爲練習

FROM centos

MAINTAINER thewindkee [email protected]

RUN yum install wget -y
# or ADD nginx.tar ~
RUN  wget http://nginx.org/download/nginx-1.14.2.tar.gz
RUN tar -xvf nginx-1.14.2.tar.gz 
WORKDIR nginx-1.14.2
RUN ls

RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel
RUN yum install -y libxml2 libxml2-dev libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
RUN useradd -M -s /sbin/nologin 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
#防止啓動後退出,因此daemon off;
CMD ["/bin/bash", "-c", "nginx -g 'daemon off;'"]

docker build

docker build .  #利用Dockerfile 創建一個鏡像

打包效果:
build中

使用docker tag 鏡像ID 新倉庫名:TAG 爲其添加版本號
在這裏插入圖片描述
啓動
在這裏插入圖片描述

使用docker commit 創建一個新鏡像

docker commit 容器名 之後的鏡像名:版本號
docker commit 可以在一個容器的基礎上創建一個新的鏡像。
這裏爲了方便看出效果,我們先改變一下原鏡像的內容,再commit成新鏡像

啓動剛纔Dockerfiel使用exec 進入容器,改變index.html的title

在這裏插入圖片描述

commit後啓動 新鏡像
可以發現新鏡像是改變後的內容。
ps:run每次開啓一個新容器,start 啓動已存在的容器.run = create+start

在這裏插入圖片描述

參考:
Dockerfile 語法

FROM
基礎鏡像可以爲任意鏡像。如果基礎鏡像沒有被發現,Docker將試圖從Docker image index來查找該鏡像。FROM命令必須是Dockerfile的首個命令。如果同一個DockerFile創建多個鏡像時,可使用多個FROM指令(每個鏡像一次)
# Usage: FROM [image name]
FROM ubuntu
MAINTAINER
指定維護者的信息,並應該放在FROM的後面。
# Usage: MAINTAINER [name]
MAINTAINER authors_name
RUN
RUN命令是Dockerfile執行命令的核心部分。它接受命令作爲參數並用於創建鏡像。不像CMD命令,RUN命令用於創建鏡像(在之前commit的層之上形成新的層)。
格式爲Run 或者Run [“executable” ,”Param1”, “param2”]
前者在shell終端上運行,即/bin/sh -C,後者使用exec運行。例如:RUN [“/bin/bash”, “-c”,”echo hello”]
每條run指令在當前基礎鏡像執行,並且提交新鏡像。當命令比較長時,可以使用“/”換行。
# Usage: RUN [command]
RUN apt-get update
USER
格式爲 USER daemon 。
指定運行容器時的用戶名或UID,後續的 RUN 也會使用指定用戶。
當服務不需要管理員權限時,可以通過該命令指定運行用戶。並且可以在之前創建所需要的用戶,例如: RUN groupadd -r postgres && useradd -r -g postgres postgres 。要臨時獲取管理員權限可以使用 gosu ,而不推薦 sudo 。
# Usage: USER [UID]
USER 751
VOLUME
VOLUME命令用於讓你的容器訪問宿主機上的目錄。
格式爲 VOLUME [“/data”] 。
創建一個可以從本地主機或其他容器掛載的掛載點,一般用來存放數據庫和需要保持的數據等。
# Usage: VOLUME ["/dir_1", “/dir_2” …]
VOLUME ["/my_files", “/app_files”]
WORKDIR
WORKDIR命令用於設置CMD指明的命令的運行目錄。
格式爲 WORKDIR /path/to/workdir 。
爲後續的 RUN 、 CMD 、 ENTRYPOINT 指令配置工作目錄。
可以使用多個 WORKDIR 指令,後續命令如果參數是相對路徑,則會基於之前命令指定的路徑。例如:
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
# 最終路徑爲 /a/b/c 。
CMD
支持三種格式:
CMD [“executable” ,”Param1”, “param2”]使用exec執行,推薦
CMD command param1 param2,在/bin/sh上執行
CMD [“Param1”, “param2”] 提供給ENTRYPOINT做默認參數。
每個容器只能執行一條CMD命令,多個CMD命令時,只最後一條被執行。
# Usage 1: CMD application “argument”, “argument”, …
CMD “echo” “Hello docker!”
ENV
格式爲 ENV 。 指定一個環境變量,會被後續 RUN 指令使用,並在容器運行時保持。
ENV TZ “Asia/Shanghai”
ENV LANG en_US.UTF-8
ENV LC_ALL en_US.UTF-8
ADD
ADD命令有兩個參數,源和目標。它的基本作用是從源系統的文件系統上覆制文件到目標容器的文件系統。如果源是一個URL,那該URL的內容將被下載並複製到容器中。如果文件是可識別的壓縮格式,則docker會幫忙解壓縮。
# Usage: ADD [source directory or URL] [destination directory]
ADD /my_app_folder /my_app_folder
COPY(基本於ADD沒有區別)
COPY 將文件從路徑 <src複製添加到容器內部路徑 。
COPY
EXPOSE
指定在docker允許時指定的端口進行轉發
EXPOSE […]
ENTRYPOINT
兩種格式:
ENTRYPOINT [“executable”, “param1”, “param2”]
ENTRYPOINT command param1 param2(shell中執行)。
配置容器啓動後執行的命令,並且不可被 docker run 提供的參數覆蓋。
每個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個時,只有最後一個起效。
ONBUILD
ONBUILD 指定的命令在構建鏡像時並不執行,而是在它的子鏡像中執行

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章