dockerFile 语法 在所有知识点总结的word 里(尚硅谷的)
docker history 镜像id | 镜像名
dockerFile

构建步骤

1.编写dockerfile 文件
2.docker build 构建镜像
3.docker run 运行
看官方是怎么构建的
地址 Explore (docker.com)
image.jpeg
这就是 dockerfile
image.jpeg

Docker Hub 中99% 的镜像都是通过在base镜像(Scratch)中安装和配置需要的软件构建出来的
image.jpeg
dockerFile 构建过程
基础知识
1.指令从上到下 顺序执行
2. 每条指令都为大写字母 且 后边要至少跟随一个参数
3.每条指令都会创建一个新的镜像层,并对镜像进行提交
说明
image.jpeg
DockerFile :需要定义一个DockerFile,DockerFile定义了进程需要的一切东西。DockerFile涉及的内容 包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进 程和内核进程(当引用进行需要和系统服务和内核进程打交道,这时需要考虑如何设计 namespace的权限控制)等等。
Docker镜像: 在DockerFile 定义了一个文件之后,Docker build 时会产生一个Docker镜像,当运行Docker 镜像时,会真正开始提供服务;
Docker容器: 容器是直接提供服务的。
dockerfile指令
image.jpeg
image.jpeg
关键字:

  1. FROM 指定基础镜像
  2. #指定的基础镜像可以是本地的 可以是远程仓库的 本地没有的话就会去远程仓库下载(阿里)
  3. #example FROM centos:7.6
  4. MAINTALNER 用来指定创建人的信息一般是姓名加邮箱
  5. # example MAINTALNER dengshuai<1922991788@qq.com>
  6. RUN 运行命令
  7. #RUN 可以运行任何被基础镜像支持的命令 
  8. #example  RUN["/bin/bash" , "-c ", "echo heloword"]
  9. CMD 设置镜像启动时执行的操作
  10. #该操作可以是执行自定义脚本 也可以是系统命令 该指令只能在文件中使用一次如果有多个只执行最后一个命令
  11. CMD 会被docker run 之后的参数替换
  12. #example CMD echo "hello word "
  13. ENTRYPOINT 设置镜像启动时执行的操作
  14. #docker run 之后的参数会被当作参数 传递给 ENTRYPOINT 之后形成新的组合命令
  15. #可以多次设置但是只有最后一个生效 和CMD的区别见下边
  16. #example ENTRYPOINT ls -l
  17. USER 设置启动容器的用户
  18. #默认是root 用户
  19. #example USER daemon= ENTRYPOINT [ "memcached", "-u" , "daemon"]
  20. EXPOSE 指定容器需要映射到宿主机的端口
  21. #设置指令,该指令会将容器中的端口映射成宿主机器中的某个端口。当你需要访问容器的时候,可以不是用容器的P地址而是使用宿主机器的IP
  22. 地址和映射后的端口。要完成整个操作需要两个少骤,目LT Li驾的端口,这样EXPOSE设置的端的容器端口,然后在运行容器的时候指定-p选项加上EXPOSE
  23. 设置的端口 这样 EXPOSE 设置的端口号会被随机映射成宿主机器中的一个端口号。也可以指定需要映射到宿主机器的那个端口,
  24. 这时要确保宿主机器上的端口号没有被使用。EXPOSE 指令可以一次设置多个端口号,相应的运行容器的时候,可以配套的多次使用-p选项。
  25. #example:
  26. 映射一个端口
  27. EXPOST port
  28. 相应的容器运行的命令
  29. docker run -p port1 image
  30. 映射多个端口
  31. EXPORT port1 port2 port3
  32. 相应的的容器运行的命令
  33. docker run -p port1 -p port2 -p port3 image
  34. 还可以指定需要映射到宿主机器上的某个端口号
  35. docker run -p host_port1:portl -p host _port2:port2 -p host _port3:port3 image
  36. ENV 用于设置环境变量
  37. #设置了后,后续的RUN命令都可以使用,container启动后,可以通过docker inspect查看这个环
  38. #境变量,也可以通过在docker run --env key=value时设置或修改环境变量。假如你安装二楼JAVA程序,需要设置JAVA_HOME,
  39. #那么可以在Dockerfile中这样写:
  40. #example ENV JAVA_HOME/path/to/java/dirent
  41. ADD src复制文件到镜像的dest路径  你如果上传压缩包的话他会自己帮你解压
  42. #example ADD <src> <dest>
  43. <src>是相对被构建的源目录的相对路径可以是文件或者目录的路径 也可以是远程的一个文件 url
  44. <dest> 是镜像中的绝对路径
  45. COPY src复制文件到镜像的dest路径
  46. #example COPY <src><dest>
  47. VOLUME 指定挂载点
  48. #容器使用的是AUFS 这种文件系统不能持久化 当容器关闭后 所有的更改都会丢失 我们可以在dockerfile
  49. 中使用这个指令
  50. #example
  51. FROM centos
  52. VOLUME [ "/tmp/data" ]
  53. WORKDIR 设置家目录 默认的家目录是/
  54. #相当于cd 命令
  55. #example WORKDIR /etc 把容器家目录设置为root 目录
  56. ONBULILD 在子镜像中执行
  57. #example:
  58. ONBUILD ADD . /app/src
  59. ONBUILD RUN /usr/local/bin/python-build --dir /app/src

CMD ** ENTRYPOINT **的区别

CMD  设置镜像启动时执行的操作
    #该操作可以是执行自定义脚本 也可以是系统命令 该指令只能在文件中使用一次如果有多个只执行最后一个命令 
    CMD 会被docker run 之后的参数替换
    #example   CMD echo "hello word "   
ENTRYPOINT   设置镜像启动时执行的操作
    #docker run  之后的参数会被当作参数 传递给 ENTRYPOINT  之后形成新的组合命令
    #可以多次设置但是只有最后一个生效    和CMD的区别见下边  
    #example  ENTRYPOINT  ls -l


测试
CMD
1.构建dockerfile 

[root@localhost ~]# vim DockFile
[root@localhost ~]# cat DockFile 
FROM centos:7
CMD  [ "ls","-a" ]

2.生成镜像
\

[root@localhost ~]#  docker build -f DockFile  -t cmdtest .
Sending build context to Docker daemon  22.53kB
Step 1/2 : FROM centos:7
 ---> 8652b9f0cb4c
Step 2/2 : CMD  [ "ls","-a" ]
 ---> Running in 016f31079614
Removing intermediate container 016f31079614
 ---> df8f04ee3027
Successfully built df8f04ee3027
Successfully tagged cmdtest:latest

3.执行

[root@localhost ~]# docker run  df8
.dockerenv
anaconda-post.log
bin
dev
etc
home
lib
lib64
.......

4.对比

tips :
    我们的docker run  之后时可以跟命令 或者参数的
[root@localhost ~]# docker run nginx ls -l
total 12
drwxr-xr-x   2 root root 4096 Apr  8 00:00 bin
drwxr-xr-x   2 root root    6 Mar 19 23:44 boot
drwxr-xr-x   5 root root  340 May  6 16:38 dev
drwxr-xr-x   1 root root   41 Apr 13 19:20 docker-entrypoint.d
-rwxrwxr-x   1 root root 1202 Apr 13 19:20 docker-entrypoint.sh
drwxr-xr-x   1 root root   66 May  6 16:38 etc
drwxr-xr-x   2 root root    6 Mar 19 23:44 home
drwxr-xr-x   1 root root   56 Apr 13 19:20 lib


#    我们想要使用-l 这个选项 来展示信息  但是却出现了鲍报错
[root@localhost ~]# docker run  df8   -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:367: starting container process caused: exec: "-l"
: executable file not found in $PATH: unknown.

  #executable file not found  我们这里为什么显示找不到文件的报错呢
   这就是CMD的特殊之处     我们上边说过 CMD只会执行一次    
   我们的 -l  会把 CMD 中的 ls -a 给替换掉     而不是 在 ls -a 后加入-l 这个参数 
   又因为 -l 不是命令   所以他就会报找不到文件的错误 

   #如果 我们想要展示信息的话后边要写上  完整的名命令
 [root@localhost ~]# docker run  df8(容器ID)   ls -l
     total 12
     -rw-r--r--   1 root root 12114 Nov 13 01:55 anaconda-post.log
     lrwxrwxrwx   1 root root     7 Nov 13 01:53 bin -> usr/bin
     drwxr-xr-x   5 root root   340 May  6 16:32 dev
....

ENTRYPOINT
  1.dockerfile

root@localhost ~]# vim DockFile
[root@localhost ~]# cat DockFile 
FROM centos:7
ENTRYPOINT  [ "ls","-a" ]

2.创建镜像

docker build -f DockFile  -t cmdtest .  (注意这个点)

3.执行

[root@localhost ~]# docker run  df8
.dockerenv
anaconda-post.log
bin
dev
etc

4.对比

#我们可以直接在后边加上  -l 选项就可以得到结果
[root@localhost ~]# docker run  df8  -l  
.total 12
     -rw-r--r--   1 root root 12114 Nov 13 01:55 anaconda-post.log
     lrwxrwxrwx   1 root root     7 Nov 13 01:53 bin -> usr/bin
     drwxr-xr-x   5 root root   340 May  6 16:32 dev
....

#这就是 CMD 和 ENTRYPOINT 的区别 

实战
实战1: 以centos7为基础镜像 构建一个自己的centos
image.jpeg
1.编写dockerfile 文件

[root@localhost ~]# vim  DockerFile
FROM centos:7
MAINTAINER  dengshuai<1922991788@qq.com>
ENV MYPATH  /root
WORKDIR  $MYPATH             #设置家目录 默认的家目录是/

RUN  yum -y install net-tools
RUN  yum -y install vim

EXPOSE 521                  #暴露端口 
CMD  echo $MYPATH        
CMD  echo"--------end---------"
CMD  /bin/bash

2.构建镜像
docker build -f dockerfile地址 -t 新镜像名字:TAG .
注意后边有一个点 代表的是当前目录 更多用法 请使用 docker build —help

[root@localhost ~]# docker build   -f DockerFile  -t ds-centos7:0.1  .
..........
#出现一下两句话就是创建成功
Successfully built 715b8f4e7e0a
Successfully tagged ds-centos7:0.1

3.运行
image.jpeg
4.列出镜像的变更历史
docker history 镜像ID| 镜像名
image.jpeg
实战2.构建自己的tomcat镜像
dockerfile 文件

1 # vim Dockerfile
2
3 FROM centos
4 MAINTAINER kuangshen[24736743@qq.com](mailto:24736743@qq.com)
5 #把宿主机当前上下文的read.txt拷贝到容器/usr/local/路径下
6 COPY read.txt /usr/local/cincontainer.txt
7 #把java与tomcat添加到容器中
8 ADD jdk-8u11-linux-x64.tar.gz /usr/local/
9 ADD apache-tomcat-9.0.22.tar.gz /usr/local/
10 #安装vim编辑器
11 RUN yum -y install vim
12 #设置工作访问时候的WORKDIR路径,登录落脚点
13 ENV MYPATH /usr/local
14 WORKDIR $MYPATH
15 #配置java与tomcat环境变量
16 ENV JAVA_HOME /usr/local/jdk1.8.0_11
17 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
18 ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22
19 ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.22
20 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
21 #容器运行时监听的端口
22 EXPOSE 8080
23 #启动时运行tomcat
24 # ENTRYPOINT [“/usr/local/apache-tomcat-9.0.22/bin/startup.sh” ]
25 # CMD [“/usr/local/apache-tomcat-9.0.22/bin/catalina.sh”,”run”]
26 CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F
/usr/local/apache-tomcat-9.0.22/bin/logs/catalina.out
 自己看着配置 就行 这个dockerfile 可以用来借鉴 

还有这文件  可以多学习学习