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

相关推荐
鱼饼6号8 分钟前
Prometheus 上手指南
linux·运维·centos·prometheus
m0_609000422 小时前
向日葵好用吗?4款稳定的远程控制软件推荐。
运维·服务器·网络·人工智能·远程工作
小安运维日记3 小时前
Linux云计算 |【第四阶段】NOSQL-DAY1
linux·运维·redis·sql·云计算·nosql
m0_741768856 小时前
使用docker的小例子
运维·docker·容器
学习3人组7 小时前
CentOS 中配置 OpenJDK以及多版本管理
linux·运维·centos
厨 神7 小时前
vmware中的ubuntu系统扩容分区
linux·运维·ubuntu
Karoku0667 小时前
【网站架构部署与优化】web服务与http协议
linux·运维·服务器·数据库·http·架构
geek_Chen017 小时前
虚拟机共享文件夹开启后mnt/hgfs/下无sharefiles? --已解决
linux·运维·服务器
(⊙o⊙)~哦8 小时前
linux 解压缩
linux·运维·服务器
最新小梦9 小时前
Docker日志管理
运维·docker·容器