Docker镜像是分层的,依据其特性可分为多层。比如tomcat镜像会依赖jdk(需要Java运行环境),那么tomcat镜像会包含jdk
Dockerfile是用来构建Docker镜像的构建文件
执行Dockerfile流程
- docker从基础镜像运行容器
- 执行一条指令并对容器做出修改
- 提交一个新的镜像层
- docker基于一个新的镜像运行一个容器
- 执行下一执行,直到所有的指令执行完成
Dockerfile的常用语法
- FROM 基础镜像,当前镜像是基于哪个镜像
- MAINTAINER 镜像维护者的姓名和邮箱地址
- RUN 镜像构建时需要运行的命令
- WORKDIR 容器创建后,默认在哪个目录
- EXPOSE 当前容器对外暴露的端口
- ENV 用来在构建镜像时设置的环境变量
- ADD 将宿主机的目录下的文件copy进镜像且ADD命令会自动解压压缩包
- COPY
- VOLUME 容器数据卷 用于保存和持久化
- CMD 指定容器启动过程中需要运行的命令 注意:多条CMD命令,只有最后一条生效,CMD命令会被docker run之后的参数替换
- ENTRYPOINT 指定容器启动过程中需要运行的命令 注意:ENTRYPOINT会把docker run命令的参数追加到后面
- ONBUILD
编译Dockerfile文件
docker build -f Dockerfile名称 -t 待生成的镜像名称 .[这个.指目录,可以是当前目录 也可以替换为其他目录]
FROM centos
MAINTAINER wojiushiwo
WORKDIR /usr/local/
ADD jdk-7u51-linux-x64.tar.gz /usr/local/
ENV JAVA_HOME /usr/local/jdk1.7.0_51
ENV PATH=$JAVA_HOME/bin:$PATH
COPY a.txt /usr/local/
## 执行安装vim的命令
RUN yum -y install vim
基于centos 创建一个jdk的镜像
docker build -t myjdk -f Dockerfile .
设置了工作目录是/usr/local,因此一进到容器里 就直接到这个目录下了
CMD命令案例
- 多条CMD命令,只有最后一条生效
FROM centos
MAINTAINER wojiushiwo
ADD startup /opt
RUN chmod a+x /opt/startup
## 是一个sh脚本
CMD ["/opt/startup"]
CMD ["/bin/bash","-c","echo hello"]
##编译Dockerfile
docker build -t test -f Dockerfile .
## 运行这个
docker run -it --name test ba68e4cf0b75
##输出
hello
- CMD命令会被docker run之后的参数替换
FROM centos
MAINTAINER wojiushiwo
ADD startup /opt
RUN chmod a+x /opt/startup
## 是一个sh脚本
CMD ["/opt/startup"]
CMD ["/bin/bash","-c","echo hello"]
##编译Dockerfile
docker build -t test -f Dockerfile .
## 运行这个
docker run -it --name test ba68e4cf0b75 /bin/bash -c "echo this is docker run"
##输出
this is docker run
ENTRYPOINT命令案例
- CMD指令可以为ENTRYPOINT指令设置默认参数
FROM centos
MAINTAINER wojiushiwo
ADD startup /opt
RUN chmod a+x /opt/startup
ENTRYPOINT ["/opt/startup","param1"]
CMD ["params2"]
编译过程:
docker build -t myjdk -f Dockerfile .
Sending build context to Docker daemon 138.2MB
Step 1/6 : FROM centos
---> 1e1148e4cc2c
Step 2/6 : MAINTAINER wojiushiwo
---> Running in 3594e02da95c
Removing intermediate container 3594e02da95c
---> b7ab8ffa88d9
Step 3/6 : ADD startup /opt
---> 47a1428deb5c
Step 4/6 : RUN chmod a+x /opt/startup
---> Running in ec733be5c88a
Removing intermediate container ec733be5c88a
---> b53cdb510979
Step 5/6 : ENTRYPOINT ["/opt/startup","param1"]
---> Running in 1571eeb1b026
doRemoving intermediate container 1571eeb1b026
---> 7f9b587642bd
Step 6/6 : CMD ["params2"]
---> Running in 7110167ab976
cRemoving intermediate container 7110167ab976
---> 979baf53c338
kSuccessfully built 979baf53c338
Successfully tagged myjdk:latest
docker run -it --name myjdk 979baf53c338
## 输出in startup, args: param1 params2
-
CMD指令可以为ENTRYPOINT指令设置默认参数,而且可以被docker run指定的参数覆盖
FROM centos MAINTAINER wojiushiwo ADD startup /opt RUN chmod a+x /opt/startup ENTRYPOINT ["/opt/startup","param1"] CMD ["params2"]
编译过程:
docker build -t myjdk -f Dockerfile .
Sending build context to Docker daemon 138.2MB
Step 1/6 : FROM centos
---> 1e1148e4cc2c
Step 2/6 : MAINTAINER wojiushiwo
---> Running in 3594e02da95c
Removing intermediate container 3594e02da95c
---> b7ab8ffa88d9
Step 3/6 : ADD startup /opt
---> 47a1428deb5c
Step 4/6 : RUN chmod a+x /opt/startup
---> Running in ec733be5c88a
Removing intermediate container ec733be5c88a
---> b53cdb510979
Step 5/6 : ENTRYPOINT ["/opt/startup","param1"]
---> Running in 1571eeb1b026
doRemoving intermediate container 1571eeb1b026
---> 7f9b587642bd
Step 6/6 : CMD ["params2"]
---> Running in 7110167ab976
cRemoving intermediate container 7110167ab976
---> 979baf53c338
kSuccessfully built 979baf53c338
Successfully tagged myjdk:latest
docker run -it --name myjdk 979baf53c338 /bin/bash -c "echo this is docker run"
##输出
in startup, args: param1 /bin/bash -c echo this is docker run
需要注意的是不论你是CMD还是ENTRYPOINT,中括号中的参数或命令必须由双引号引住