Dockerfile
DOCKER镜像的组成
Docker 镜像的构建和使用是基于 UnionFS(联合文件系统)的原理。UnionFS 允许将多个目录挂载到一个虚拟文件系统下,并且可以对这些目录进行修改,这些修改会以一次提交的形式叠加在已有的文件系统层上。在 Docker 中,镜像的每一层都是一个 UnionFS 的文件系统层,它们通过这种方式叠加在一起,形成了一个完整的镜像文件系统。
Docker 的镜像由以下几部分组成:
- bootfs(引导文件系统):这是镜像的最底层,包含 bootloader 和内核。当 Docker 容器启动时,会加载 bootfs 文件系统,引导内核启动。
- 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指令
- 基础镜像指令(FROM):指定构建镜像的基础镜像。
FROM ubuntu:latest
- 维护者指令(LABEL或老版本MAINTAINER):添加元数据,如维护者信息。
LABEL maintainer="your_name@example.com"
- 镜像操作指令:
- RUN:在容器中执行命令,如安装软件包。
RUN apt-get update && apt-get install -y nginx
- COPY:将宿主机的文件复制到容器中。
COPY . /usr/src/app
- ADD:将文件添加到容器,可以从 URL 下载文件。
ADD . /usr/src/app
- RUN:在容器中执行命令,如安装软件包。
- 环境变量指令(ENV):设置环境变量。
ENV NODE_ENV production
- 暴露端口指令(EXPOSE):暴露端口,供外部访问。
EXPOSE 3000
- 容器启动指令:
- CMD:设置容器启动时的默认命令和参数。
CMD ["npm", "start"]
- ENTRYPOINT:设置容器启动时执行的命令。
- CMD:设置容器启动时的默认命令和参数。
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端口进行测试 ,成功