介绍
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 Dockerfile
FROM centos:7
MAINTAINER kpsmile<kpsmile95@gamil.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
COPY README $MYPATH
ADD jdk-8u341-linux-x64.tar.gz $MYPATH
ADD apache-tomcat-8.5.81.tar.gz $MYPATH
RUN ln -s jdk1.8.0_341 jdk_default
RUN ln -s apache-tomcat-8.5.81 tomcat8_default
ENV JAVA_HOME /usr/local/jdk_default
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/tomcat8_default
ENV CATALINA_BASH /ust/local/tomcat8_default
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD $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 images
REPOSITORY TAG IMAGE ID CREATED SIZE
mytomcat 0.1 1cb67202f9d5 7 seconds ago 589MB
centos 7 eeb6ee3f44bd 10 months ago 204MB
kpsmile@kpsmile-machine:~/package$ docker run -it -p 8080:8080 --name tomcat02 1cb67202f9d5
Using CATALINA_BASE: /usr/local/tomcat8_default
Using CATALINA_HOME: /usr/local/tomcat8_default
Using CATALINA_TMPDIR: /usr/local/tomcat8_default/temp
Using JRE_HOME: /usr/local/jdk_default
Using CLASSPATH: /usr/local/tomcat8_default/bin/bootstrap.jar:/usr/local/tomcat8_default/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
tail: cannot open '/log/catelina.out' for reading: No such file or directory
tail: no files remaining
构建springboot服务
kpsmile@kpsmile-machine:~/jar$ cat Dockerfile
FROM mytomcat:0.1
MAINTAINER kpsmile<kpsmile95@gamil.com>
ENV JAR_DIR /usr/local/jar/
WORKDIR $JAR_DIR
ADD docker_demo-0.0.1-SNAPSHOT.jar $JAR_DIR/docker-demo.jar
ENTRYPOINT ["java","-jar","docker-demo.jar"]
kpsmile@kpsmile-machine:~/jar$ docker build -t boot-jar:0.1 .
Sending build context to Docker daemon 17.63MB
Step 1/6 : FROM mytomcat:0.1
---> 1cb67202f9d5
Step 2/6 : MAINTAINER kpsmile<kpsmile95@gamil.com>
---> Running in 896fb225d19a
Removing intermediate container 896fb225d19a
---> 7ac2fd421892
Step 3/6 : ENV JAR_DIR /usr/local/jar/
---> Running in 21f3883d4313
Removing intermediate container 21f3883d4313
---> 35b49e5403ce
Step 4/6 : WORKDIR $JAR_DIR
---> Running in 1cce8e09708f
Removing intermediate container 1cce8e09708f
---> 187fafe16079
Step 5/6 : ADD docker_demo-0.0.1-SNAPSHOT.jar $JAR_DIR/docker-demo.jar
---> db0e89d4be5e
Step 6/6 : ENTRYPOINT ["java","-jar","docker-demo.jar"]
---> Running in 2aee83c7ebef
Removing intermediate container 2aee83c7ebef
---> 885434d46011
Successfully built 885434d46011
Successfully tagged boot-jar:0.1
kpsmile@kpsmile-machine:~/jar$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
016a97ac8f4f 1cb67202f9d5 "bash" About an hour ago Up About an hour 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp tomcat03
432679cae712 nginx "/docker-entrypoint.…" 2 hours ago Up 2 hours 0.0.0.0:80->80/tcp, :::80->80/tcp nginx00
36f85e59fbe0 redis "docker-entrypoint.s…" 2 hours ago Up 2 hours 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp redis00
2eca34a18260 cedcd3e1ddad "/bin/sh -c /bin/bash" 3 hours ago Up 3 hours 80/tcp strange_pike
kpsmile@kpsmile-machine:~/jar$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
boot-jar 0.1 885434d46011 11 seconds ago 606MB
mytomcat 0.1 1cb67202f9d5 About an hour ago 589MB
centoswithnettool 0.1 cedcd3e1ddad 3 hours ago 613MB
wm/ubuntu-ifconfig 1.0 9e8154d445c3 26 hours ago 111MB
192.168.1.29:5000/wm/ubuntu 1.1 c0cad9d8bfb3 2 days ago 111MB
nginx latest 605c77e624dd 7 months ago 141MB
redis latest 7614ae9453d1 7 months ago 113MB
mysql 5.7 c20987f18b13 7 months ago 448MB
mysql latest 3218b38490ce 7 months ago 516MB
registry latest b8604a3fe854 9 months ago 26.2MB
ubuntu latest ba6acccedd29 9 months ago 72.8MB
hello-world latest feb5d9fea6a5 10 months ago 13.3kB
centos 7 eeb6ee3f44bd 10 months ago 204MB
kpsmile@kpsmile-machine:~/jar$ docker run -d -p 8888:8888 --name jar01 boot-jar:0.1
ccc7425d9a198e767866a3e335044cc6bb768c3d3fa202fb31f8edde08537c83
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 |