了解DockerFile 镜像制作

DockerFile解析

DockerFile是什么

DockerFile 是用来构建 Docker 镜像的构建文件,是由一系列命令和参数构建的脚本

DockerFile 内容基础知识

每条保留字指令都必须为大写字母且后面要跟随至少一个参数
指令按照从上到下,顺序执行
表示注释
每条指令都会创建一个新的镜像层,并对镜像进行提交

Docker执行DockerFile的大致流程

docker从基础镜像运行一个容器
执行一条指令并对容器作为修改
执行类似docker commit的操作提交一个新的镜像层
docker再基于刚提交的镜像运行一个新容器
执行dockerfile中的下一条指令直到所有指令都执行完成

小总结

从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段
- Dockerfile是软件的原材料
- Docker镜像是软件的交付品
- Docker容器则可以认为是软件的运行态
Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可。

DockerFile体系语法

FROM

指定基础镜像,当前新镜像是基于那个镜像的。构建指令,必须指定且需要在Dockerfile其他指令的前面。后续的指令都依赖于该指令指定的image。FROM指令指定的基础image可以是官方远程仓库中的,也可以位于本地仓库
$ FROM centos:7.2

MAINTSINER

用来指定镜像创建者信息。构建指令,用于将image的制作者相关的信息写入到image中。当我们对该image执行docker inspect命令时,输出中有相应的字段记录该信息。
$ MAINTSINER mail"wyy@***.com"

RUN

容器构建时需要运行的命令。构建指令,RUN可以运行任何被基础image支持的命令。如基础image选择了Centos,那么软件管理部分只能使用Centos
$ RUN cd /tmp && curl -L 'http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.8/bin/apache-tomcat-7.0.8.tar.gz' | tar -xz
$ RUN ["/bin/bash", "-c", "echo hello"]

CMD

设置指令,用于container启动时指定的操作。该操作可以是执行自定义脚本,也可以是执行系统命令。该指令只能在文件中存在一次,如果有多个,则只执行最后一条
$ CMD echo “Hello, World!”

ENTRYPOINT

指定一个容器启动时要运行的命令;它的目的和CMD一样,都是在指定容器启动程序及参数,但 docker run之后的参数会变为追加
$ ENTRYPOINT ls -l 
该指令的使用分为两种情况,一种是独自使用,另一种和CMD指令配合使用。当独自使用时,如果你还使用了CMD命令且CMD是一个完整的可执行的命令,那么CMD指令和ENTRYPOINT会互相覆盖只有最后一个CMD或者ENTRYPOINT有效
CMD指令将不会被执行,只有ENTRYPOINT指令被执行  
$ CMD echo “Hello, World!” 
$ ENTRYPOINT ls -l  
另一种用法和CMD指令配合使用来指定ENTRYPOINT的默认参数,这时CMD指令不是一个完整的可执行命令,仅仅是参数部分;ENTRYPOINT指令只能使用JSON方式指定执行命令,而不能指定参数
$ FROM ubuntu  
$ CMD ["-l"]  
$ ENTRYPOINT ["/usr/bin/ls"]

USER

设置container容器的用户,设置指令,设置启动容器的用户,默认是root用户
$ USER daemon  =  ENTRYPOINT ["memcached", "-u", "daemon"]

EXPOSE

当前容器对外暴露的端口.设置指令,该指令会将容器中的端口映射成宿主机器中的某个端口。当你需要访问容器的时候,可以不是用容器的IP地址而是使用宿主机器的IP地址和映射后的端口。要完成整个操作需要两个步骤,首先在Dockerfile使用EXPOSE设置需要映射的容器端口,然后在运行容器的时候指定-p选项加上EXPOSE设置的端口,这样EXPOSE设置的端口号会被随机映射成宿主机器中的一个端口号。也可以指定需要映射到宿主机器的那个端口,这时要确保宿主机器上的端口号没有被使用。EXPOSE指令可以一次设置多个端口号,相应的运行容器的时候,可以配套的多次使用-p选项。
# 映射一个端口  
	$ EXPOSE 22
	# 相应的运行容器使用的命令  
	$ docker run -p port1 image  
# 映射多个端口  
	$ EXPOSE port1 port2 port3  
	# 相应的运行容器使用的命令  
	$ docker run -p port1 -p port2 -p port3 image  
	# 还可以指定需要映射到宿主机器上的某个端口号  
	$ docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image

EVN

用来在构建过程中设置环境变量
$ ENV JAVA_HOME /path/to/java/dirent

ADD

从src复制文件到container的dest路径,且ADD命令会自动处理URL和解压tar压缩包
$ ADD <src> <dest>  (源)(目标)
	<src> 是相对被构建的源目录的相对路径,可以是文件或目录的路径,也可以是一个远程的文件url;
	<dest> 是container中的绝对路径

COPY

将从构建上下文目录中 <源路径>的文件、目录复制到新的一层的镜像内的 <目标路径> 位置
$ COPY <src> <dest>

VOLUME

容器数据卷,用于数据保存和持久化工作
$ FROM base  
$ VOLUME ["/tmp/data"]

WORKDIR

切换目录,可以多次切换(相当于cd命令)
# 指定在创建容器后,终端默认登陆进来的工作目录
$ WORKDIR /p1 WORKDIR p2 RUN vim a.txt

ONBUILD

ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行.
$ ONBUILD ADD . /app/src
$ ONBUILD RUN /usr/local/bin/python-build --dir /app/src

DockerFile镜像生成命令

$ docker build -t wyy/jdk-tomcat .

镜像的导入、导出

导出:docker save -o  xx.xx.xx  xx.xx.xx.tar
导入:docker load -i xx.xx.xx.tar

利用DockerFile制作镜像

下载镜像

$ docker pull hub.c.163.com/public/centos:6.7-tools
# 下载压缩包
$ wget http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.8/bin/apache-tomcat-7.0.42.tar.gz
$ wget https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html

编写DockerFile文件

$ FROM hub.c.163.com/public/centos:6.7-tools
$ MAINTAINER wyymail@qq.com
$ ADD ./apache-tomcat-7.0.42.tar.gz /root
$ ADD ./jdk-7u25-linux-x64.tar.gz /root
$ ENV JAVA_HOME /root/jdk1.7.0_25
$ ENV PATH $JAVA_HOME/bin:$PATH
$ EXPOSE 8080
$ ENTRYPOINT /root/apache-tomcat-7.0.42/bin/startup.sh && tailf /root/apache-tomcat-7.0.42/logs/catalina.out

生成镜像

$ docker build -t wyylinux/tomcat:v1 .
	-t : # 指定标签(新镜像名)

运行生成的镜像

$ docker run --name tomact -p 80:8080 -d wyylinux/tomcat:v1
# 浏览器查看是否生成tomact页面
	192.168.66.112
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值