二、Dockerfile指令Dockerfile是用来构建docker镜像的文件,是命令参数脚本。
构建步骤
1、编写一个Dockerfile文件。
2、docker build 构建成为一个镜像。文件名字任意 ,-f 指定文件,如果未使用-f 指定文件名字,会默认去找名字为Dockerfile的文件。推荐使用Dockerfile命名,这样便可以不用指定文件名。
3、docker run 运行镜像
4、docker push 发布镜像(发布到DockerHub、阿里云镜像仓库等)
docker hub官网,每个镜像都可点进去查看dockerfile源码
基础知识1、每个命令都是大写字母
2、dockerfile执行从上向下依次执行
3、#代表注释
4、每行指令都会创建一个新的镜像层,并提交
注:从百度图片搜索图片可以更好的理解知识点。 很好的学习方法。
dockerfile镜像逐渐成为企业的交付标准,必须掌握。
Dockerfile:构建镜像的命令脚本
dockerImages:通过dockerfile构建生成的镜像。可通过命令,让启动容器后,自动运行指定程序
docker容器:容器就是镜像运行起来提供服务的。
Dockerfile指令CMD和ENTRYPOINT区别MAINTAINER:镜像的作者,一般是姓名+邮箱
ONBUILD:当构建一个被继的 DockerFile 时就会运行onBUILD 的指令。是一个触发指令。
CMD:指定这个容器启动时要运行的命令,只有最后一个生效,可被docker run 容器启动时的命令 替代。【如果Dockerfile文件有多个CMD,构建时都会执行,但是镜像构建好,以后启动容器时,只有最后一个CMD会执行】
WORKDIR:镜像的工作目录。进入容器后,直接进入此目录。不指定默认根目录 /
RUN和CMD区别? RUN是镜像编译时运行命令,CMD是容器启动时运行命令。
CMD和ENTRYPOINT区别?启动容器的命令,如果指定了容器启动后运行的指令【docker run -it 镜像名 命令。此处的命令就是容器启动后执行的命令】,那么CMD指定的指令会被容器运行时指定的指令覆盖,而ENTRYPOINT指定的指令+容器运行时指定的指令 会作为最终指令在容器启动后运行。
COPY和ADD区别?ADD会解压文件并导入,COPY不会解压,仅是导入。
测试CMD命令实战测试(1)编写Dockerfile文件
[root@fang2 docker_lesson]# cat dockerfile_cmd_test FROM centos:centos7 CMD ["ls","-a"](2)构建镜像
[root@fang2 docker_lesson]# docker build -f dockerfile_cmd_test -t cmdtest . Sending build context to Docker daemon 4.096kB Step 1/2 : FROM centos:centos7 ... Successfully tagged cmdtest:latest(3)从镜像启动容器
[root@fang2 docker_lesson]# docker run cmdtest .dockerenv ... var(4)想追加一个 -l参数。即 ls -a -l
[root@fang2 docker_lesson]# docker run cmdtest -l docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.CMD情况下,-l替换了CMD ["ls","-a"]命令,而-l不是命令,所以报错。
测试ENTRYPONT(1)编写Dockerfile
[root@fang2 docker_lesson]# cat dockerfile_entrypoint_test FROM centos:centos7 ENTRYPOINT ["ls","-a"](2)构建镜像和上面相同。 此处省略。直接从镜像启动容器
-l直接追加到了ENTRYPOINT ["ls","-a"]命令,即ls -a -l。
[root@fang2 docker_lesson]# docker run entry -l total 12 drwxr-xr-x 1 root root 6 Mar 12 20:37 . 。。。 drwxr-xr-x 18 root root 238 Nov 13 2020 var
Docker Hub 中99%镜像都是从这个基础镜像过来的 FROM scratch, 然后配置需要的软件和配置来构建自己的镜像。scratch类似于引导加载。
构建centosdocker hub上的centos进具备基础功能,vim、ipconfig等功能不具备。有时镜像需要这些命令,故构建。
(1)编写Dockerfile
文件名字任意 -f 指定文件,如果未使用-f 指定文件名字,会默认去找名字为Dockerfile的文件。推荐使用Dockerfile命名。
FROM centos:centos7 MAINTAINER fang<1542755282@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注:
如果镜像yum安装失败,是因为镜像里面基于的基础镜像Centos有问题,而不是宿主机有问题。不要使用FROM centos,此时会默认下载centos最新版本centos8,centos8 yum安装软件时会遇见问题。
(2)build
0.1是版本号,不指定会默认latest
docker build -f mydockerfile-centos -t fang/centos:0.1 .(3)运行镜像
官网镜像是没有vim、ifconfig功能的。新建镜像都有了。
docker run -it fang/centos:0.1 命令 。命令可以覆盖CMD指定的命令。命令是容器启动后执行的命令。上面的镜像CMD /bin/bash,因此容器启动后自动进入bash。
docker run -it fang/centos:0.1(4)docker history 查看镜像构建历史
可以查看官网镜像的构建历史
构建tomcat(1)准备镜像文件需要的Tomcat压缩包,jdk的压缩包。官网下载。tomcat和jdk解压后的文件路径需要知道,用来设置环境变量。
(2)编写dockerfile文件,官方命名Dockerfile, build命令会自动寻找Dockerfile文件,就不需要 -f 指定了
易错:jdk解压后的文件名字
FROM centos:centos7 MAINTAINER Fang<1542755282@qq.com> COPY ./reademe.txt /user/local/readme.txt ADD ./apache-tomcat-8.5.76.tar.gz /usr/local/ ADD ./jdk-8u311-linux-x64.tar.gz /usr/local/ RUN yum -y install vim ENV MYPATH /usr/local WORKDIR $MYPATH ENV JAVA_HOME /usr/local/jdk1.8.0_311 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.76 ENV CATALINA_BASH /usr/local/apache-tomcat-8.5.76 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin EXPOSE 8080 CMD /usr/local/apache-tomcat-8.5.76/bin/startup.sh && tail -F /url/local/apache-tomcat-8.5.76/bin/logs/catalina.out(3)构建镜像
docker build docker build -t mytomcat .(4)运行镜像容器
docker run -d -p 8088:8080 -v /opt/docker_lesson/tomcat/webapps:/usr/local/apache-tomcat-8.5.76/webapps/ -v /opt/docker_lesson/tomcat/logs:/usr/local/apache-tomcat-8.5.76/logs mytomcat(5)测试端口是否可访问 localhost:8088
(6)发布项目到容器
宿主机的webapps会自动同步到容器内部的webapps下。因此以后向容器tomcat发布项目可以直接放在宿主机webapps目录下即可。下面示例向宿主机放了test项目。
test文件夹包含WEB_INF文件夹,WEB_INF文件夹里面包含web.xml 和 index.jsp.为web项目最简单形式。
[root@fang2 WEB_INF]# cat index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>菜鸟教程(runoob.com) Hello world[root@fang2 WEB_INF]# cat web.xml[root@a8b151536342 WEB_INF]# cat web.xml (7)测试项目是否成功
目前一直失败 不知道什么原因



