docker-6.使用Dockerfile定制鏡像
一般情況下,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定制鏡像