Dockerfile创建Docker镜像

本文详细解释了Docker镜像的组成,包括bootfs和rootfs,以及Dockerfile的构建过程,涉及基础镜像、镜像层、缓存策略和Dockerfile中的各种指令。还提供了使用Dockerfile创建Tomcat镜像的实际案例。
摘要由CSDN通过智能技术生成

Dockerfile

DOCKER镜像的组成

Docker 镜像的构建和使用是基于 UnionFS(联合文件系统)的原理。UnionFS 允许将多个目录挂载到一个虚拟文件系统下,并且可以对这些目录进行修改,这些修改会以一次提交的形式叠加在已有的文件系统层上。在 Docker 中,镜像的每一层都是一个 UnionFS 的文件系统层,它们通过这种方式叠加在一起,形成了一个完整的镜像文件系统。
Docker 的镜像由以下几部分组成:

  1. bootfs(引导文件系统):这是镜像的最底层,包含 bootloader 和内核。当 Docker 容器启动时,会加载 bootfs 文件系统,引导内核启动。
  2. rootfs(根文件系统):这是在 bootfs 之上的文件系统,包含操作系统的基础文件和目录,如 /bin、/etc、/proc 等。不同的操作系统发行版会有不同的 rootfs。
    Docker 镜像的构建过程如下:
  • 基础镜像:创建一个新的镜像时,需要指定一个基础镜像。这个基础镜像通常是某个操作系统的基础镜像,如 Ubuntu、CentOS 等。
  • 构建层:Dockerfile 中的每个指令都会创建一个新的镜像层。这些指令可以是 RUN、COPY、ADD 等,它们会添加或修改镜像的内容。
  • 缓存和复用:Docker 在构建镜像时会尝试复用已有的镜像层,这样可以加快构建速度。如果 Dockerfile 的指令没有改变,或者复制的文件没有变化,相应的镜像层缓存就会生效。
  • 镜像层缓存失效:如果 Dockerfile 的指令发生了变化,或者复制的文件发生了变化,相应的镜像层缓存就会失效。如果某一层镜像缓存失效,它之后的镜像层缓存也会失效。
  • 不可变的镜像层:一旦镜像层被创建,它就不可再更改。如果在某一层中添加了一个文件,然后在下一层中删除了它,这个文件依然会存在于镜像中,但在 Docker 容器中是不可见的。
    Dockerfile 是一个文本文件,其中包含了构建镜像的指令。这些指令可以分为以下几类:
  • 基础镜像指令:FROM,指定基础镜像。
  • 维护者指令:LABEL,添加元数据,如维护者信息。
  • 镜像操作指令:RUN、COPY、ADD、EXPOSE、WORKDIR、CMD、ENTRYPOINT 等,用于构建镜像。
  • 容器启动指令:CMD 和 ENTRYPOINT,用于设置容器启动时的命令和参数。
    通过编写 Dockerfile,我们可以自动化地构建镜像,从而提高构建效率和一致性。

Dockerfile的编写

Dockerfile 是一个文本文件,用于定义如何构建 Docker 镜像。它包含了构建镜像所需的指令和配置,每个指令都会创建一个新的镜像层。

Dockerfile指令

  1. 基础镜像指令(FROM):指定构建镜像的基础镜像。
    FROM ubuntu:latest
    
  2. 维护者指令(LABEL或老版本MAINTAINER):添加元数据,如维护者信息。
    LABEL maintainer="your_name@example.com"
    
  3. 镜像操作指令
    • RUN:在容器中执行命令,如安装软件包。
      RUN apt-get update && apt-get install -y nginx
      
    • COPY:将宿主机的文件复制到容器中。
      COPY . /usr/src/app
      
    • ADD:将文件添加到容器,可以从 URL 下载文件。
      ADD . /usr/src/app
      
  4. 环境变量指令(ENV):设置环境变量。
    ENV NODE_ENV production
    
  5. 暴露端口指令(EXPOSE):暴露端口,供外部访问。
    EXPOSE 3000
    
  6. 容器启动指令
    • CMD:设置容器启动时的默认命令和参数。
      CMD ["npm", "start"]
      
    • ENTRYPOINT:设置容器启动时执行的命令。
 ENTRYPOINT ["pm2-runtime"]

Dockerfile编写与使用案例

在宿主机上创建一个文件夹 ,如我要编写一个Tomcat的镜像
在这里插入图片描述
本地拥有了centos7的镜像

mkdir /dockerfile
cd  /dockerfile
mkdir Tomcat
cd Tomcat/
vim Dockerfile

Dockerfile文件内容如下

#指定基底镜像
FROM centos:7
#添加镜像说明
MAINTAINER this is tomcat image
#将压缩包传入镜像
ADD jdk-8u411-linux-x64.tar.gz  /usr/local/
#切换工作目录至/usr/local/
WORKDIR /usr/local/
RUN mv jdk1.8.0_411 /usr/local/java
#设置环境变量
ENV JAVA_HOME /usr/local/java
ENV JRE_HOME ${JAVA_HOME}/jre
ENV CLASSPATH .:${JAVA_HOME}/lib:${JRE_HOME}/lib
ENV PATH $JAVA_HOME/bin:$PATH
#传入Tomcat二进制安装包
ADD apache-tomcat-9.0.85.tar.gz /usr/local/
WORKDIR /usr/local/
RUN mv apache-tomcat-9.0.85 /usr/local/tomcat
#开放8080端口
EXPOSE 8080
ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]
CMD ["/usr/local/tomcat/bin/startup.sh","start"]

放入所需文件
在这里插入图片描述
生成镜像

docker build -t tomcat:centos .

在这里插入图片描述
镜像生成完毕
测试

docker run -itd --name tomcat -p 8080:8080 tomcat:centos

访问主机8080端口进行测试 ,成功
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值