Docker--------Dockerfile实战

1. 背景

   Dockerfile是为快速构建docker image[镜像]而设计的,当你使用docker build 命令的时候,docker 会读取当前目录下的命名为Dockerfile(首字母大小写均可)的纯文本文件并执行里面的指令构建出一个docker image。这比SaltStack的配置管理要简单的多,不过还是要掌握一些简单的指令。

    Dockerfile 由一行行命令语句组成,并且支持以#开头的注释行。指令是不区分大小写的,但是通常我们都大写。

Docker--------Dockerfile实战


2. Dockerfile内容结构

    * 基础镜像信息

    * 维护者信息

    * 镜像操作指令

    * 容器启动时执行指令


    

3. 常用指令

   *. FROM   指定基础镜像

   格式:FROM<image>或FROM<image>:<tag>

     FROM是Dockerfile里的第一条指令(必须是),后面跟有效的镜像名(如果该镜像你的本地仓库没有则会从远程仓库Pull取)。然后后面的其它指令FROM的镜像中执行。

1
2
# Base image
FROM centos


   *. MAINTAINER  维护者信息

     格式:MAINTAINER <name>

1
2
# Maintainer
MAINTAINER lisea [email protected]


   *. RUN 指定运行命令  [可以指定多条]

     格式:RUN <command>或 RUN[“executable”, “param1”, “param2”]。

1
2
3
4
# Commands
RUN rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
RUN yum install nginx -y
RUN echo "daemon off;" >> /etc/nginx/nginx.conf


     *.  EXPOSE 设置容器内部暴露的端口号

1
EXPOSE 80


     *.  CMD 指定容器启动是执行的命令,可被启动容器参数覆盖

   格式: 

    CMD [“executable”,”param1″,”param2″]  使用exec 执行,推荐方式

    CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用

            CMD [“param1″,”param2”] 提供给ENTRYPOINT的默认参数

     CMD指定容器启动是执行的命令,每个Dockerfile只能有一条CMD命令,如果指定了多条,只有最后一条会被执行。

     如果你在启动容器的时候也指定的命令,那么会覆盖Dockerfile构建的镜像里面的CMD命令。

1
CMD ["nginx"]


     *.  ENTRYPOINT 指定容器启动是执行的命令,不可被启动容器参数覆盖

  格式:  

   ENTRYPOINT [“executable”, “param1″,”param2”]

   ENTRYPOINT command param1 param2(shell中执行)

1
ENTRYPOINT ["nginx"]


     *.  ADD  添加文件至容器内部,如果文件是可识别的压缩包会自动解压

   格式:        

   ADD <src>… <dest>

   ADD [“<src>”,… “<dest>”]

1
ADD index.html /usr/share/nginx/html/index.html


     *.  USER 指定容器运行用户名和UID

   格式: USER root

1
USER root


4. 实战

   * 构件nginx镜像,基础镜像为centos, 容器内部暴露端口为80, 添加文件index.html主页文件至nginx html目录下.

   创建index.html文件

1
[[email protected] nginx]# echo "http://lisea.blog.51cto.com" > index.html

   编写 dockerfile 文件  vim dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Nginx
# 1.0.1
# Author lisea
 
# Base image
FROM centos
 
# Maintainer
MAINTAINER lisea [email protected]
 
# Commands
RUN rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
RUN yum install nginx -y
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
 
# Add files
ADD index.html /usr/share/nginx/html/index.html
 
EXPOSE 80
CMD ["nginx"]

   构建镜像,名称为lisea/nginx tag为1.0.1

1
[[email protected] nginx]# docker build -t lisea/nginx:v1.0.1 .

      查看本地镜像

1
2
3
4
[[email protected] nginx]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
lisea/nginx         v1.0.1              010fff3a1451        6 seconds ago       387.2 MB
docker.io/centos    latest              3bee3060bfc8        9 days ago          192.5 MB

    

5. 总结



以需求驱动技术,技术本身没有优略之分,只有业务之分。

      本文转自asd1123509133 51CTO博客,原文链接:http://blog.51cto.com/lisea/1937013,如需转载请自行联系原作者