一、DockerFile
1.1、概述
dockerfile 是用来构建docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
为什么要有dockerfile呢
在基础篇我们讲过,比如我们下载个 ubuntu镜像里面不包含 vim、ifconfig等组件,这个时候 新增功能后,用 docker commit 命令进行提交。但需要的功能时随时变化的,就需要很多commit。那么可以一次性搞定吗,这个就需要用到 dockerfile,给某个镜像多个list功能清单,dockerfile进行一次提交。
步骤
1、编写dockerFile文件
2、docker build命令构建镜像
3、docker run 运行镜像成容器
1.2、dockerFile 常用的保留字指令
以 tomcat 的dokerFile为例
1、FROM
指定一个已经存在的镜像作为模板,第一条必须是from
2、MAINTAINER
镜像维护者的姓名和邮箱地址
3、RUN:容器构建时需要运行的命令
两种格式:
-
shell格式:
-
exec格式:
4、EXPOSE:当前容器对外暴露的端口
5、WORKDIR :指定创建容器后,终端默认登陆的进来工作目录。
比如创建一个 ubuntu容器,并打开终端 pwd可以看到当前工作目录是根目录:/ 。WORKDIR 就是指定这个工作目录
6、USER:指定该镜像以什么用户去执行,如果不指定,默认 root (一般不指定)
7、ENV:设置dockerFile脚本中的环境变量
如:ENV MY_PATH /user/mytest :设置环境变量
WORKDIR $MY_PATH 使用这个环境变量
8、VOLUME:容器数据卷,用于数据保存和持久化工作
9、ADD:将宿主机的文件 拷贝进镜像 并自动处理 URL和解压 tar压缩包
如 ADD /APP/JDK8.tar 把jdk压缩包copy进镜像
10、COPY:将宿主机文件 copy到 容器指定路径(不存在自动创建)
COPY src dest
11、CMD:指定容器要做的工作
注意: 可以有多个CMD指令,但只有最后一个生效,CMD会被 docker run 之后的参数替换
比如 tomcat 的dockerFile 最后一个是 :CMD [“catalina.sh”, “run”] ,表示 容器启动的 运行服务器
如果 我们在 虚拟机执行 docker run -it - p 8080:8080 tomcat /bin/bash 这个命令(正常时不需要加/bin/bash的),那么就相当于在 dockerFile最后又加了 CMD [“/bin/bash”,“run”] ,那个 CMD [“catalina.sh”, “run”] 就会被覆盖掉,导致 tomcat容器运行 但是服务没起来。
12 、ENTRYPOINT:指定容器运行时的命令
类似于CMD,但不会被run后面的命令覆盖,并且会将 run后面的参数 送给ENTRYPOINT 指令指定的程序
ENTRYPOINT 可以和CMD一起使用,但一般变参才会使用到CMD == 给ENTRYPOINT传参
ENTRYPOINT CMD组合,将CMD的内容作为参数传递给ENTRYPOINT 指令
如:
ENTRYPOINT ["nginx","-c"] #定参 -c 是指定配置文件启动
CMD [“/nginx/nginx.conf”] # 变参 配置文件
- 当在docker中执行命令 :docker run niginx 就 等于 执行 docker run nginx -c /nginx/nginx.conf
将CMD 作为参数传给 ENTRYPOINT 的指定程序:-c - 当在docker中执行命令 :docker run niginx -c /nginx.conf 就 等于 执行 docker run nginx -c /nginx.conf
由于 CMD是会别覆盖的,run命令后 -c 给了参数,就会覆盖 CMD的命令 就会使用 run命令后的配置文件,CMD的参数作废。
1.2.1、CMD和RUN的区别
CMD:是在容器运行时执行
RUN:是在容器构建时运行
1.3、实战
1.3.1、自定义镜像 mycentosjava8
注意:centos 要pull 7 版本,不然会报错。。 :docker pull centos:7,下图是最新版 结果报错了
基础镜像什么都没有,新增java8、vim、ifconfig
先下载 jdk (这样就不用安装docker了):jdk8下载地址选X64 linux - tar.gz这个
1、编程Dockerfile
FROM centos:7
MAINTAINER ls<ls@126.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把jdk-8u171-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u351-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_351
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
EXPOSE 80
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
2、构建镜像
在myfile目录下
docker build -t centosjava8:1.5 .
运行并进入构建的镜像,发现当前目录正是在 Dockerfile中设置的工作目录
该容器也包含了 需要的 vim 、ifconfig、 java8 的环境
1.3.2、虚悬镜像
在构建或者删除镜像时出现错误,导致出现镜像仓库 和 tag为 的情况
一定把它 删除掉!!! : 用这个命令删除
docker image prune