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

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

  1. Dockerfile是用来构建docker镜像的文本文件是有一系列的指令和参数构成的

  2. 如下docker原理图Dockerfile是通过独立一次性构建镜像的:

  3. dockerfile内容之保留字指令及基础知识:

  4. ---保留字指令必须大写(来源于docker官网)且后面必须至少跟随一个参数

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

    ---#表示注释

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

  5. docker执行dockerfile流程(了解)

  6. *Dockerfile相当于是软件的原材料

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

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

  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:指定再创建容器后,终端默认登录进来的工作目录,一个落脚点;比如:登录到乌班图:

    落脚点是"/"

    而登录到tomcat落脚点是/usr/local/tomcat:

    为什么落脚点不同就是因为配置的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:在指令:docker run -it -p 8080:8080 "id"之后没有加参数正常启动了,可以访问;但是当加了参数:docker run -it -p 8080:8080 "id"/bin/bash这样原来的参数就会被代替,再次访问就不能正常访问了!也就是说:原来的是: 后来成了紫色部分就替代了原来的 :

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

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

## 二、案例实战(Dockerfile)

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

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

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

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

bash 复制代码
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 . 注意最后面是一个点前面有一个空格。

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

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

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


三、虚悬镜像:

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

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

FROM ubuntu

CMD echo 'action is success......'

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

查看:

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

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

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


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

相关推荐
_.Switch1 小时前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j
雪域迷影1 小时前
PostgreSQL Docker Error – 5432: 地址已被占用
数据库·docker·postgresql
福大大架构师每日一题2 小时前
22.1 k8s不同role级别的服务发现
容器·kubernetes·服务发现
韩楚风2 小时前
【linux 多进程并发】linux进程状态与生命周期各阶段转换,进程状态查看分析,助力高性能优化
linux·服务器·性能优化·架构·gnu
莹雨潇潇2 小时前
Docker 快速入门(Ubuntu版)
java·前端·docker·容器
陈苏同学2 小时前
4. 将pycharm本地项目同步到(Linux)服务器上——深度学习·科研实践·从0到1
linux·服务器·ide·人工智能·python·深度学习·pycharm
Ambition_LAO2 小时前
解决:进入 WSL(Windows Subsystem for Linux)以及将 PyCharm 2024 连接到 WSL
linux·pycharm
Pythonliu72 小时前
茴香豆 + Qwen-7B-Chat-Int8
linux·运维·服务器
你疯了抱抱我2 小时前
【RockyLinux 9.4】安装 NVIDIA 驱动,改变分辨率,避坑版本。(CentOS 系列也能用)
linux·运维·centos
追风赶月、2 小时前
【Linux】进程地址空间(初步了解)
linux