Docker--------Dockerfile实战
1. 背景
Dockerfile是为快速构建docker image[镜像]而设计的,当你使用docker build 命令的时候,docker 会读取当前目录下的命名为Dockerfile(首字母大小写均可)的纯文本文件并执行里面的指令构建出一个docker image。这比SaltStack的配置管理要简单的多,不过还是要掌握一些简单的指令。
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,如需转载请自行联系原作者