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

关键字:
FROM 指定基础镜像#指定的基础镜像可以是本地的 可以是远程仓库的 本地没有的话就会去远程仓库下载(阿里)#example FROM centos:7.6MAINTALNER 用来指定创建人的信息一般是姓名加邮箱# example MAINTALNER dengshuai<1922991788@qq.com>RUN 运行命令#RUN 可以运行任何被基础镜像支持的命令#example RUN["/bin/bash" , "-c ", "echo heloword"]CMD 设置镜像启动时执行的操作#该操作可以是执行自定义脚本 也可以是系统命令 该指令只能在文件中使用一次如果有多个只执行最后一个命令CMD 会被docker run 之后的参数替换#example CMD echo "hello word "ENTRYPOINT 设置镜像启动时执行的操作#docker run 之后的参数会被当作参数 传递给 ENTRYPOINT 之后形成新的组合命令#可以多次设置但是只有最后一个生效 和CMD的区别见下边#example ENTRYPOINT ls -lUSER 设置启动容器的用户#默认是root 用户#example USER daemon= ENTRYPOINT [ "memcached", "-u" , "daemon"]EXPOSE 指定容器需要映射到宿主机的端口#设置指令,该指令会将容器中的端口映射成宿主机器中的某个端口。当你需要访问容器的时候,可以不是用容器的P地址而是使用宿主机器的IP地址和映射后的端口。要完成整个操作需要两个少骤,目LT Li驾的端口,这样EXPOSE设置的端的容器端口,然后在运行容器的时候指定-p选项加上EXPOSE设置的端口 这样 EXPOSE 设置的端口号会被随机映射成宿主机器中的一个端口号。也可以指定需要映射到宿主机器的那个端口,这时要确保宿主机器上的端口号没有被使用。EXPOSE 指令可以一次设置多个端口号,相应的运行容器的时候,可以配套的多次使用-p选项。#example:映射一个端口EXPOST port相应的容器运行的命令docker run -p port1 image映射多个端口EXPORT port1 port2 port3相应的的容器运行的命令docker run -p port1 -p port2 -p port3 image还可以指定需要映射到宿主机器上的某个端口号docker run -p host_port1:portl -p host _port2:port2 -p host _port3:port3 imageENV 用于设置环境变量#设置了后,后续的RUN命令都可以使用,container启动后,可以通过docker inspect查看这个环#境变量,也可以通过在docker run --env key=value时设置或修改环境变量。假如你安装二楼JAVA程序,需要设置JAVA_HOME,#那么可以在Dockerfile中这样写:#example ENV JAVA_HOME/path/to/java/direntADD 从src复制文件到镜像的dest路径 你如果上传压缩包的话他会自己帮你解压#example ADD <src> <dest><src>是相对被构建的源目录的相对路径可以是文件或者目录的路径 也可以是远程的一个文件 url<dest> 是镜像中的绝对路径COPY 从src复制文件到镜像的dest路径#example COPY <src><dest>VOLUME 指定挂载点#容器使用的是AUFS 这种文件系统不能持久化 当容器关闭后 所有的更改都会丢失 我们可以在dockerfile中使用这个指令#exampleFROM centosVOLUME [ "/tmp/data" ]WORKDIR 设置家目录 默认的家目录是/#相当于cd 命令#example WORKDIR /etc 把容器家目录设置为root 目录ONBULILD 在子镜像中执行#example:ONBUILD ADD . /app/srcONBUILD 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 
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.运行
4.列出镜像的变更历史
docker history 镜像ID| 镜像名
实战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 可以用来借鉴
还有这文件 可以多学习学习
