Dockerfile创建Docker镜像

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) :指定构建镜像的基础镜像。

    Dockerfile 复制代码
    FROM ubuntu:latest
  2. 维护者指令(LABEL或老版本MAINTAINER) :添加元数据,如维护者信息。

    Dockerfile 复制代码
    LABEL maintainer="your_name@example.com"
  3. 镜像操作指令

    • RUN :在容器中执行命令,如安装软件包。

      Dockerfile 复制代码
      RUN apt-get update && apt-get install -y nginx
    • COPY :将宿主机的文件复制到容器中。

      Dockerfile 复制代码
      COPY . /usr/src/app
    • ADD :将文件添加到容器,可以从 URL 下载文件。

      Dockerfile 复制代码
      ADD . /usr/src/app
  4. 环境变量指令(ENV) :设置环境变量。

    Dockerfile 复制代码
    ENV NODE_ENV production
  5. 暴露端口指令(EXPOSE) :暴露端口,供外部访问。

    Dockerfile 复制代码
    EXPOSE 3000
  6. 容器启动指令

    • CMD :设置容器启动时的默认命令和参数。

      Dockerfile 复制代码
      CMD ["npm", "start"]
    • ENTRYPOINT:设置容器启动时执行的命令。

docker 复制代码
 ENTRYPOINT ["pm2-runtime"]

Dockerfile编写与使用案例

在宿主机上创建一个文件夹 ,如我要编写一个Tomcat的镜像

本地拥有了centos7的镜像

bash 复制代码
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"]

放入所需文件

生成镜像

bash 复制代码
docker build -t tomcat:centos .

镜像生成完毕

测试

bash 复制代码
docker run -itd --name tomcat -p 8080:8080 tomcat:centos

访问主机8080端口进行测试 ,成功

相关推荐
一位赵9 分钟前
小练2 选择题
linux·运维·windows
qq_3129201113 分钟前
Nginx+Keepalived双主架构:消除单点故障的最佳实践
运维·nginx·架构
LucDelton1 小时前
Java 读取无限量文件读取的思路
java·运维·网络
Lw老王要学习1 小时前
CentOS 7.9达梦数据库安装全流程解析
linux·运维·数据库·centos·达梦
蓝队云计算1 小时前
蓝队云部署OpenClaw深度指南:避坑、优化与安全配置,从能用做到好用
运维·安全·云计算
Kaede62 小时前
提示dns服务器未响应,需要做哪些事?
运维·服务器
CRUD酱2 小时前
CentOS的yum仓库失效问题解决(换镜像源)
linux·运维·服务器·centos
zly35002 小时前
VMware vCenter Converter Standalone 转换Linux系统,出现两个磁盘的处理
linux·运维·服务器
珠海西格2 小时前
1MW光伏项目“四可”装置改造:逆变器兼容性评估方法详解
大数据·运维·服务器·云计算·能源
H Journey2 小时前
Docker Swarm集群管理
docker·集群管理·swarm