DockerFile
DockerFile介绍
我们写好一个项目以后,以前发布是打包成一个jar,或者是一个war包,但是现在有Docker以后,我们只需要把我们项目,写成一个DockerFile镜像交给别人,或者上传到远程仓库直接使用pull就可以直接运行
构建步骤:
- 编写 DockerFile
- build DockerFile
- 运行
DockerFile的编写
基础知识:
1、每条保留字指令都必须为大写字母且后面要跟随至少一个参数
2、指令按照从上到下,顺序执行
3、# 表示注释
4、每条指令都会创建一个新的镜像层,并对镜像进行提交
流程:
1、docker从基础镜像运行一个容器
2、执行一条指令并对容器做出修改
3、执行类似 docker commit 的操作提交一个新的镜像层
4、Docker再基于刚提交的镜像运行一个新容器
5、执行dockerfile中的下一条指令直到所有指令都执行完成!
说明:
从应用软件的角度来看,DockerFile,docker镜像与docker容器分别代表软件的三个不同阶段。
DockerFile 是软件的原材料 (代码)
Docker 镜像则是软件的交付品 (.apk)
Docker 容器则是软件的运行状态 (客户下载安装执行)
DockerFile 面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可!
DockerFile 关键字

实战:写一个centos
1 2 3 4 5 6 7 8 9 10
| FROM centos7 MAINTAINER saxon<2433027822@qq.com> ENV MYPATH /usr/local WORKDIR $MYPATH RUN yum -y install vim RUN yum -y install net-tools EXPOSE 80 CMD echo $MYPATH CMD echo "----------end--------" CMD /bin/bash
|
这里有一个BUG centos 8的无法联网,无法使用 RUN yum -y insatll vim等命令
1
| docker build -f Dockfile -t saxon_centos:1.0 .
|
我们一定要在最后面加上一个==.==,不然会报错
由于是我们自己写的镜像,所以在运行是我们要带上版本号,这样才会让我们的容器精准找到镜像
运行:
1
| [root@iZwz94khotag1q066igytrZ docker_file_test]# docker run -it saxon_centos:1.0
|
结果:

我们发现,我们一进入就会在我们配置的那个地方
关于CMD和ENTRYPOINT的区别
我们之前说过,两个命令都是指定一个容器启动时要运行的命令
CMD:Dockerfile 中可以有多个CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数
替换!
ENTRYPOINT: docker run 之后的参数会被当做参数传递给 ENTRYPOINT,之后形成新的命令组合!
例如:
1 2 3 4 5
| [root@kuangshen home] [root@kuangshen home] FROM centos CMD [ "ls", "-a" ]
|
1 2 3 4
| # 问题:我们可以看到可执行文件找不到的报错,executable file not found。 # 之前我们说过,跟在镜像名后面的是 command,运行时会替换 CMD 的默认值。 # 因此这里的 -l 替换了原来的 CMD,而不是添加在原来的 ls -a 后面。而 -l 根本不是命令,所以自然找不到。 # 那么如果我们希望加入 -l 这参数,我们就必须重新完整的输入这个命令:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| # 1、构建dockerfile [root@kuangshen home]# vim dockerfile-entrypoint-test [root@kuangshen home]# cat dockerfile-entrypoint-test FROM centos ENTRYPOINT [ "ls", "-a" ] # 2、build 镜像 [root@kuangshen home]# docker build -f dockerfile-entrypoint-test -t entrypointtest . Sending build context to Docker daemon 23.04kB Step 1/2 : FROM centos ---> 470671670cac Step 2/2 : ENTRYPOINT [ "ls", "-a" ] ---> Running in bac4ae055630 Removing intermediate container bac4ae055630 ---> ae07199f9144 Successfully built ae07199f9144 Successfully tagged entrypointtest:latest # 3、执行 [root@kuangshen home]# docker run ae07199f9144 .dockerenv bin dev etc home lib lib64 ...... # 4、测试-l参数,发现可以直接使用,这里就是一种追加,我们可以明显的知道 CMD 和 ENTRYPOINT 的区别了 [root@kuangshen home]# docker run entrypointtest -l
|
如果使用的是我们的ENTRYPOINT那么在我们的使用容器服务的时候吗,我们后面加的命令会自动补充在后面,不会像原来的cmd需要我们自己写全,不然就无法使用;
实战:部署一个tomcat
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| FROM centos:7 MAINTAINER saxon<2433027822@qq.com> ENV MYPATH /usr/local WORKDIR $MYPATH
ADD jdk-9.0.4_linux-x64_bin.tar.gz /usr/local ADD apache-tomcat-9.0.38.tar.gz /usr/local #配置Java ENV JAVA_HOME /usr/local/jdk-9.0.4 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar #配置tomcat
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.38 ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.38 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin #容器运行时监听的端口 EXPOSE 8080 #启动时运行tomcat # ENTRYPOINT ["/usr/local/apache-tomcat-9.0.38/bin/startup.sh" ] # CMD ["/usr/local/apache-tomcat-9.0.38/bin/catalina.sh","run"] CMD /usr/local/apache-tomcat-9.0.38/bin/startup.sh
RUN yum -y install vim
|
使用下面的命令运行我们的镜像:
1
| docker run -it -d -p 3333:8080 saxon_centos:1.0 /bin/bash
|
没有实现挂载,如果你想要实现挂载,你可以加上-v,这样你就可以在宿主机上面定向修改应用代码;这样可以简便开发;

上传自己的镜像到远程服务器
Docker HUB
1 2 3 4
| #第一步,登录 docker login -u username -p password #第二步,上传 ....
|
阿里云
官网上直接有步骤按照那个来就可以了;