介绍
Dockerfile是用来构建docker镜像的文件,命令参数脚本
构建步骤:
构建一个dockerfile文件docker build 构建成为一个镜像docker run 运行镜像docker push 发布镜像(DockerHub、阿里云镜像仓库)


DockerFile构建过程
基础知识:
构建命令:
docker build [-f dockerfileName] -t imageName:tag .
- 当dockerfile名字为Dockerfile时 不需要使用-f进行指定
- 注意不要忘记最后面那个点.
常用指令
FROM #基础镜像,一切从这里开始构建MAINTAINER #镜像是谁写的,姓名+邮箱RUN #镜像构建时需要运行的命令ADD #步骤,tomcat镜像,这个tomcat压缩包;添加内容WORKDIR #镜像工作目录VOLUME #挂载的目录EXPOSE #暴露端口配置CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令ONBUILD #当构建一个被继承DockerFile 这个时候就会运行 ONBUILD 的指令,触发指令COPY #类似ADD,将我们的文件拷贝至镜像中ENV #构建的时候设置环境变量
构建tomcat镜像
kpsmile@kpsmile-machine:~/package$ cat DockerfileFROM centos:7MAINTAINER kpsmile<kpsmile95@gamil.com>ENV MYPATH /usr/localWORKDIR $MYPATHCOPY README $MYPATHADD jdk-8u341-linux-x64.tar.gz $MYPATHADD apache-tomcat-8.5.81.tar.gz $MYPATHRUN ln -s jdk1.8.0_341 jdk_defaultRUN ln -s apache-tomcat-8.5.81 tomcat8_defaultENV JAVA_HOME /usr/local/jdk_defaultENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarENV CATALINA_HOME /usr/local/tomcat8_defaultENV CATALINA_BASH /ust/local/tomcat8_defaultENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/binEXPOSE 8080CMD $CATALINA_HOME/bin/startup.sh && tail -f $CATELINE_HOME/log/catelina.out# <<<注意最后有一个点>>>kpsmile@kpsmile-machine:~/package$ sudo docker build -t mytomcat:0.1 .kpsmile@kpsmile-machine:~/package$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEmytomcat 0.1 1cb67202f9d5 7 seconds ago 589MBcentos 7 eeb6ee3f44bd 10 months ago 204MBkpsmile@kpsmile-machine:~/package$ docker run -it -p 8080:8080 --name tomcat02 1cb67202f9d5Using CATALINA_BASE: /usr/local/tomcat8_defaultUsing CATALINA_HOME: /usr/local/tomcat8_defaultUsing CATALINA_TMPDIR: /usr/local/tomcat8_default/tempUsing JRE_HOME: /usr/local/jdk_defaultUsing CLASSPATH: /usr/local/tomcat8_default/bin/bootstrap.jar:/usr/local/tomcat8_default/bin/tomcat-juli.jarUsing CATALINA_OPTS:Tomcat started.tail: cannot open '/log/catelina.out' for reading: No such file or directorytail: no files remaining
构建springboot服务
kpsmile@kpsmile-machine:~/jar$ cat DockerfileFROM mytomcat:0.1MAINTAINER kpsmile<kpsmile95@gamil.com>ENV JAR_DIR /usr/local/jar/WORKDIR $JAR_DIRADD docker_demo-0.0.1-SNAPSHOT.jar $JAR_DIR/docker-demo.jarENTRYPOINT ["java","-jar","docker-demo.jar"]kpsmile@kpsmile-machine:~/jar$ docker build -t boot-jar:0.1 .Sending build context to Docker daemon 17.63MBStep 1/6 : FROM mytomcat:0.1---> 1cb67202f9d5Step 2/6 : MAINTAINER kpsmile<kpsmile95@gamil.com>---> Running in 896fb225d19aRemoving intermediate container 896fb225d19a---> 7ac2fd421892Step 3/6 : ENV JAR_DIR /usr/local/jar/---> Running in 21f3883d4313Removing intermediate container 21f3883d4313---> 35b49e5403ceStep 4/6 : WORKDIR $JAR_DIR---> Running in 1cce8e09708fRemoving intermediate container 1cce8e09708f---> 187fafe16079Step 5/6 : ADD docker_demo-0.0.1-SNAPSHOT.jar $JAR_DIR/docker-demo.jar---> db0e89d4be5eStep 6/6 : ENTRYPOINT ["java","-jar","docker-demo.jar"]---> Running in 2aee83c7ebefRemoving intermediate container 2aee83c7ebef---> 885434d46011Successfully built 885434d46011Successfully tagged boot-jar:0.1kpsmile@kpsmile-machine:~/jar$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES016a97ac8f4f 1cb67202f9d5 "bash" About an hour ago Up About an hour 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp tomcat03432679cae712 nginx "/docker-entrypoint.…" 2 hours ago Up 2 hours 0.0.0.0:80->80/tcp, :::80->80/tcp nginx0036f85e59fbe0 redis "docker-entrypoint.s…" 2 hours ago Up 2 hours 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp redis002eca34a18260 cedcd3e1ddad "/bin/sh -c /bin/bash" 3 hours ago Up 3 hours 80/tcp strange_pikekpsmile@kpsmile-machine:~/jar$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEboot-jar 0.1 885434d46011 11 seconds ago 606MBmytomcat 0.1 1cb67202f9d5 About an hour ago 589MBcentoswithnettool 0.1 cedcd3e1ddad 3 hours ago 613MBwm/ubuntu-ifconfig 1.0 9e8154d445c3 26 hours ago 111MB192.168.1.29:5000/wm/ubuntu 1.1 c0cad9d8bfb3 2 days ago 111MBnginx latest 605c77e624dd 7 months ago 141MBredis latest 7614ae9453d1 7 months ago 113MBmysql 5.7 c20987f18b13 7 months ago 448MBmysql latest 3218b38490ce 7 months ago 516MBregistry latest b8604a3fe854 9 months ago 26.2MBubuntu latest ba6acccedd29 9 months ago 72.8MBhello-world latest feb5d9fea6a5 10 months ago 13.3kBcentos 7 eeb6ee3f44bd 10 months ago 204MBkpsmile@kpsmile-machine:~/jar$ docker run -d -p 8888:8888 --name jar01 boot-jar:0.1ccc7425d9a198e767866a3e335044cc6bb768c3d3fa202fb31f8edde08537c83

Docker镜像原理

思考:
1. Docker镜像本质是什么?
·是一个分层文件系统
2. Docker中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个G?
·Centos的iso镜像文件包含bootts和rootfs,而docker的centos镜像复用操作系统的bootfs,只有rootfs和其他镜像层
3. Docker中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有70多MB?
由于docker中镜像是分层的,tomcat虽然只有70多MB,但他需要依赖于父镜像和基础镜像,所有整个对外暴露的tomcat镜像大小500多MB
docker关键字
| 关键字 | 作用 | 备注 |
|---|---|---|
| FROM | 指定父镜像 | 指定 dockerfile 基于那个 image 构建 |
| MAINTAINER | 作者信息 | 用来标明这个 dockerfile 谁写的 |
| LABEL | 标签 | 用来标明 dockerfile 的标签可以使用 Label 代替 Maintainer 最终都是在 dockerimage 基本信息中可以查看 |
| RUN | 执行命令 | 执行一段命令默认是/bin/sh 格式:RUNcommand 或者 RUN[“command”,“param1”,“param2”] |
| CMD | 容器启动命令 | 提供启动容器时候的默认命令和 ENTRYPOINT 配合使用.格式 CMDcommandparam1param2 或者 CMD[“command”,“param1”,“param2”] |
| ENTRYPOINT | 入口 | 一般在制作一些执行就关闭的容器中会使用 |
| COPY | 复制文件 | build 的时候复制文件到 image 中 |
| ADD | 添加文件 | build 的时候添加文件到 image 中不仅仅局限于当前 build 上下文可以来源于远程服务 |
| ENV | 环境变量 | 指定 build 时候的环境变量可以在启动的容器的时候通过-e 覆盖格式 ENVname=value |
| ARG | 构建参数 | 构建参数只在构建的时候使用的参数如果有 ENV 那么 ENV 的相同名字的值始终覆盖 arg 的参数 |
| VOLUME | 定义外部可以挂载的数据卷 | 指定 build 的 image 那些目录可以启动的时候挂载到文件系统中启动容器的时候使用-v 绑定格式 VOLUME[“目录”] |
| EXPOSE | 暴露端口 | 定义容器运行的时候监听的端口启动容器的使用-p 来绑定暴露端口格式:EXPOSE8080 或者 EXPOSE8080/udp |
| WORKDIR | 工作目录 | 指定容器内部的工作目录如果没有创建则自动创建如果指定/使用的是绝对地址如果不是/开头那么是在上一条 workdir 的路径的相对路径 |
| USER | 指定执行用户 | 指定 build 或者启动的时候用户在 RUNCMDENTRYPONT 执行的时候的用户 |
| HEALTHCHECK | 健康检查 | 指定监测当前容器的健康监测的命令基本上没用因为很多时候应用本身有健康监测机制 |
| ONBUILD | 触发器 | 当存在 ONBUILD 关键字的镜像作为基础镜像的时候当执行 FROM 完成之后会执行 ONBUILD 的命令但是不影响当前镜像用处也不怎么大 |
| STOPSIGNAL | 发送信号量到宿主机 | 该 STOPSIGNAL 指令设置将发送到容器的系统调用信号以退出。 |
| SHELL | 指定执行脚本的 shell | 指定 RUNCMDENTRYPOINT 执行命令的时候使用的 shell |
