Dockerfile入门

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,中括号中的参数或命令必须由双引号引住

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值