1. 程式人生 > >docker-6.使用Dockerfile定制鏡像

docker-6.使用Dockerfile定制鏡像

created chm 執行 tool work copy 前臺 命令 release

一般情況下,Dockerfile分為四部分:基礎鏡像信息、維護者、鏡像操作指令和容器啟動時執行的指令

例:

#This Dockerfile uses the centos image

#This is a nginx web server

#version 0.1

#time 2017年10月27日13:00:01

#指定基礎鏡像,可同時指定多個鏡像

FROM centos

#維護者

MAINTAINER blog.rootr.cn [email protected]

#指定運行容器時的用戶名或UID,RUN也會使用指定用戶,獲取臨時管理員權限推薦使用gosu

#USER root

#為後續的RUN、CMD、ENTRYPOINT指令配置工作目錄

WORKDIR /root

#鏡像操作指令

RUN yum update -y

RUN yum install -y epel-release

#指定環境變量,供後面的RUN指令使用

ENV web_server_name nginx

RUN yum install -y $web_server_name

#復制指定的<src>到容器中的<dest>。<src>可以是Dockerfile所在目錄的相對路徑(文件或目錄);也可以是URL(默認權限600)或tar文件(自動解壓為目錄)

RUN mkdir /usr/share/nginx/html/a

ADD http://192.168.200.1/index.html /usr/share/nginx/html/a/

RUN chmod 777 /usr/share/nginx/html/a/index.html

#復制本地主機的<src>到容器中的<dest>。<src>可以是Dockerfile所在目錄的相對路徑(文件或目錄)。目標路徑不存在自動創建

COPY index.html /usr/share/nginx/html/

#創建本地主機或其他容器的掛載點

VOLUME /data/backup

#聲明容器需要暴露的端口號

EXPOSE 80 443

#配置容器啟動後執行的命令,不會被用戶啟動容器指定的參數覆蓋(每個Dockerfile只能有一條ENTRYPOINT指令)

#ENTRYPOINT command --parameter

#檢查容器健康狀況(每個Dockerfile只能有一條HEALTHCHECK指令) --interval:兩次健康檢查間隔 --timeout:超時時間 --retries:連續失敗指定次數後,容器狀態將更改為unhealthy

#命令的返回值決定了該次健康檢查的成功與否: 0:成功; 1:失敗; 2:保留,不要使用這個值。

HEALTHCHECK --interval=15s --timeout=5s --retries=3 \

CMD curl -fs http://127.0.0.1/ || exit 1

#容器啟動時執行的指令(每個Dockerfile只能有一條CMD指令。如果用戶啟動容器時指定了參數,則不會被執行)

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

CMD、RUN、ENTRYPOINT的格式

*shell 格式: CMD <命令>

*exec 格式: CMD ["可執行文件", "參數1", "參數2"...]

shell 格式:實際的命令會被包裝為 sh -c 的參數的形式進行執行。比如:

CMD echo $HOME在實際執行中,會將其變更為:

CMD [ "sh", "-c", "echo $HOME" ]

exec 格式:

Docker 不是虛擬機,容器中的應用都應該以前臺執行,沒有後臺服務的概念。

而使用 service nginx start 命令,則是以後臺守護進程形式啟動nginx服務

CMD service nginx start 會被理解為 CMD ["sh", "-c", "service nginx start"] ,因此主進程實際上是 sh 。那麽當service nginx start 命令結束後, sh也就結束了, sh 作為主進程退出了,自然就會令容器退出。

正確的做法是直接執行 nginx 可執行文件,並且要求以前臺形式運行

創建鏡像

docker build -t web:0.1 /root/docker/

docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

web 0.1 b370d7fc0bac 17 minutes ago 438 MB

docker run --name nginx -d -P web:0.1

docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

49f07ad6a13e web:0.1 "nginx -g ‘daemon off" 2 minutes ago Up 2 minutes (healthy) 0.0.0.0:32799->80/tcp, 0.0.0.0:32798->443/tcp nginx

curl 127.0.0.1:32799

test

curl 127.0.0.1:32799/a/

AAA

查看健康檢查日誌

docker inspect --format ‘{{json .State.Health}}‘ nginx | python -m json.tool

{

"FailingStreak": 0,

"Log": [

{

"End": "2017-10-30T14:20:07.95075839+08:00",

"ExitCode": 0,

"Output": "test\n",

"Start": "2017-10-30T14:20:07.902212787+08:00"

......

docker-6.使用Dockerfile定制鏡像