当前位置: 首页 > news >正文

docker 高级篇

一、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:容器构建时需要运行的命令
两种格式:

  1. shell格式:
    在这里插入图片描述

  2. 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”] # 变参 配置文件
  1. 当在docker中执行命令 :docker run niginx 就 等于 执行 docker run nginx -c /nginx/nginx.conf
    将CMD 作为参数传给 ENTRYPOINT 的指定程序:-c
  2. 当在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

相关文章:

  • 【进击的算法】动态规划——01背包
  • 实验8-动态规划与背包问题
  • docker安装mongdb
  • 23.1.29 make menuconfig执行过程
  • 实现简单的栈与队列
  • 数据存储:MySQL之多表连接方式
  • 20篇高质量程序人生文章分享,做开发不仅仅只有代码
  • 连续函数的运算与初等函数的连续性——“高等数学”
  • 沁恒CH32V307单片机入门(01):基础说明与流程体验
  • React源码:diff算法
  • Java 开发环境配置 “JDK”(超详细整理,适合新手入门)
  • Android 实现隐私政策提示弹窗(完整版)
  • 【选择IT培训机构时,我们应该注意的点有哪些?】
  • Java集合使用注意事项
  • windows下zookeeper搭建
  • 【云原生之Docker实战】在Docker环境下部署kanboard项目管理工具
  • 开启前端CSS学习之路-css003
  • 智能驾驶 车牌检测和识别(一)《CCPD车牌数据集》
  • 量能指标套装
  • 自动驾驶感知——图像数据处理数学方法