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端口进行测试 ,成功

相关推荐
tuokuac4 小时前
docker中nginx配置报错解决
linux·运维·服务器
Joren的学习记录5 小时前
【Linux运维大神系列】docker详解(四)
linux·运维·docker
Elastic 中国社区官方博客6 小时前
让我们把这个 expense 工具从 n8n 迁移到 Elastic One Workflow
大数据·运维·elasticsearch·搜索引擎·ai·信息可视化·全文检索
( •̀∀•́ )9207 小时前
GitHub Actions SSH 部署密钥
运维·ssh·github
louqle7 小时前
docker基本知识及常用命令汇总
运维·docker·容器
学烹饪的小胡桃8 小时前
【运维学习】实时性能监控工具 WGCLOUD v3.6.2 更新介绍
linux·运维·服务器·学习·工单系统
叫致寒吧8 小时前
Docker
运维·docker·容器
杨浦老苏8 小时前
现代流媒体聚合播放器冬瓜TV MAX
docker·群晖·多媒体
白露与泡影8 小时前
使用systemd,把服务装进 Linux 心脏里~
linux·运维·python
l1t9 小时前
用docker安装oracle 19c
运维·数据库·docker·oracle·容器