Docker微服务之Dockerfile创建镜像及虚悬镜像的基本操作(保姆级教程)

一、Dockerfile基本知识(一定要看懂不然案例不好懂)

  1. Dockerfile是用来构建docker镜像的文本文件是有一系列的指令和参数构成的
  2. 如下docker原理图Dockerfile是通过独立一次性构建镜像的:ab02f59ef4184144b87a2e1470ce69a3.png
  3. dockerfile内容之保留字指令及基础知识:
  4. ---保留字指令必须大写(来源于docker官网)且后面必须至少跟随一个参数

    ---指令会按照从上到下依次执行

    ---#表示注释

    ---每一条指令都会创建一个新的镜像层并且提交

  5. docker执行dockerfile流程(了解)81792c2e40184ad58889ad26551d2a5e.png
  6. *Dockerfile相当于是软件的原材料

    *Docker镜像相当于是软件的交付产品

    *Docker容器相当于是软件的运行状态即镜像运行为容器7fa35017b2964a52a3303a917956b662.png

  7. Dockerfile需要定义一个dockerfile,dockerfile定义了一个软件运行进程的所有需要的东西,比如执行的代码,环境变量,依赖包,运行时的环境,链接库操作系统的等等

    Docker镜像,使用dockerfile定义了一个文件之后,一旦docker build就会产生一个你的docker镜像,运行docker镜像就会开启一个docker容器,镜像反解析就是dockerfile

    Docker容器,直接提供服务的。

  8. dockerfile常用的保留字指令:
  9. 官方提供信息来源:https://github.com/docker-library/tomcat

    ---FROM:基础镜像,当前的新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,dockerfile第一条必须是FROM

    ---MAINTAINER:镜像的维护者姓名和邮箱

    ---RUN:容器构建时需要运行的指令,有shell和exec两种格式,再docker build时运行;比如shell 格式:RUN yum -y install vim。Exec格式:RUN [“./test.php”,”dev”,”offline”]就类似于:RUN ./test.php dev offline

    ---EXPOSE:当前容器对外暴露的端口

    ---WORKDIR:指定再创建容器后,终端默认登录进来的工作目录,一个落脚点;比如:登录到乌班图:                      c57555e5a911451dbb0d483eda06d301.png

    落脚点是“/”

    而登录到tomcat落脚点是/usr/local/tomcat:883aa02348db41708963ebc14b8869b2.png

    为什么落脚点不同就是因为配置的WORKDIR不同!

    ---USER:指定运行该镜像的是什么样的用户,如果不指定就是root,一般不指定

    ---ENV:用于在构建镜像时指定设置环境变量,这个环境变量可以在限免在任何一个RUN或和其他指令中使用比如:ENV MY_PATH /usr/mytest设置环境变量之后在WORKDIR $MY_PATH

    ---ADD:将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包

    ---COPY:类似于ADD将从构建上下文目录中<源路径>文件/复制到新的镜像的<目标路径>位置比如:COPY src dest或者---->COPY [“src”,”dest”]:------>src是源路径,dest就是指定路径,可以不事先创建dest

    ---VOLUME:容器卷用于数据保存和持久化

    ---CMD:容器启动后要做的事,两种格式:shell格式和exec格式,dockerfile可以有多个CMD指令但是只有最后一个CMD指令生效,并且CMD可以被docker run 后面的参数代替

    为什么或被代替呢?举例说明比如:启动tomcat:12bfe92b69a94acfb868305fb4de8c73.png在指令:docker run -it -p 8080:8080 “id”之后没有加参数正常启动了,可以访问;但是当加了参数:docker run -it -p 8080:8080 “id”/bin/bash这样原来的参数就会被代替,再次访问就不能正常访问了!021198b881e14fba8cffb28205333cfc.png也就是说:原来的是:                   20db9070d868441bbb20983379483a68.png                                                    后来成了紫色部分就替代了原来的 :                                    174b8e2c1553494d97aed744a3b0c1de.png

    ---ENTRYPOINT:也是用来指定一个容器启动时要运行的命令,类似于CMD但是不会被docker run后面的参数覆盖并且如果和CMD一块使用那么CMD就相当于给ENTRYPOINT传参,也就是说当出现ENTRYPOINT和CMD时CMD的含义就会发生变化,不再是运行时执行它而是传递参数给ENTRYPOINT指令。

    有如下案例(CMD就会被docker run后面的参数替换):aef83dada2f649e59c1dc8b46345f029.png

  10. 二、案例实战(Dockerfile)

    自定义镜像mycentos-vim-ifconfig-Java8,要求具备vim ,ifconfig,java8功能:

    编写Dockerfile(最好是D大写和官网一致):

         (1)新建一个myfile目录在/下:mkdir myfile

        (2)在里面要放置好以及下载好的jdk: jdk-8u411-linux-x64.tar.gz和新建一个文件                          Dockerfile在里面添加代码:

FROM centos:7.6.1810
MAINTAINER alibaixiu<alibaixiubs@126.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

#安装vim编辑器
RUN yum -y install vim
#安装ifconfig
RUN yum -y install net-tools
#安装java8
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD把jdk添加到容器中安装包必须和Dockerfile文件在同一目录下
ADD jdk-8u411-linux-x64.tar.gz /usr/local/java/
#配置Java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_411
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

这段代码的意思是:

这 Dockerfile 的目的是创建一个基于 CentOS 7.6.1810 镜像的 Docker 镜像,其中包含了一些软件的安装和环境变量的配置。具体来说:

1. 指定了镜像基础为 CentOS 7.6.1810 并设置了维护者信息alibaixiu<alibaixiubs@126.com>。

2. 设定了环境变量 MYPATH 为 /usr/local,并将工作目录切换至 $MYPATH。

3. 安装了 vim 编辑器和 net-tools 包。

4. 安装了 glibc 的 32 位版本。

5. 在 /usr/local 目录下创建了 java 目录,并将 jdk-8u411-linux-x64.tar.gz 添加到该目录中。

6. 配置了 JAVA_HOME、JRE_HOME、CLASSPATH 和 PATH 等 Java 相关环境变量。

7. 暴露了容器的 80 端口。

8. 最后设置了三个 CMD 指令,分别输出 $MYPATH 的值,打印 "success.......ok",以及启动一个交互式的 bash shell。

请注意,Dockerfile 中的指令将会按照顺序执行,以构建一个包含指定软件和环境配置的 Docker 镜像。


需要强调的是:一定要把Dockerfile和jdk-8u411-linux-x64.tar.gz添加在同一个位置!!!

然后需要执行指令:  docker build -t centosjava8:1.5 .    注意最后面是一个点前面有一个空格。

7d7eaf9a1881487fb770bd801f157007.png

再查看镜像(就发现多出了一个镜像centosjava8):363e6f8a06d24eb49042ea14a9f0a7b1.png

接下来运行镜像:docker run -it 4986c9629047 /bin/bash看到进入的路径恰好是配置的!

b82308dcf5a943609822483d10cbc7fa.png

并且创建的镜像带有我们所需的几个工具(vim,ifconfig,java8):

365b90f0228c4f28a28567ec355ed476.png


三、虚悬镜像:

测试一下:写一个虚悬镜像:

我们在myfile文件下创建一个测试目录,再创建一个Dockerfile里面就添加一些:

FROM ubuntu

CMD echo ‘action is success......’

0848d0fb220447cbab4f3d5d374dfb95.png

这样一旦我们构建docker build .就会出现一个虚悬镜像:

1c285de1cc404919b0789ab85266b252.png

查看:a5d7a6f8b4984788bb1e214237c666d0.png

也可以使用:docker image ls -f dangling=true单独查看虚悬镜像并且使用:docker image prune删除虚悬镜像:c0aef26776b4405fb8601835f8021cf0.png

查看(发现已经没有虚悬镜像了):

224fbb9140164dd783bea9b29ec6a63b.png

虚悬镜像只会占用空间,一定要删除!!!


马上就会发布分布式dockerfile实战!关注更新!!!有什么问题欢迎在下方评论区留言!!!

42fdd7bccd8f417cb3cf80f5741806df.png

  • 13
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值