其中镜像在构建完成后,用户只能对镜像进行读操作,而不能进行写操作,只有镜像启动后变为容器,才能进行读写操作。镜像整体结构,可以观看下图:
该图中展示了镜像的基本组成,但是图中这一个个中间层是什么呢?要想了解这些层具体是什么,那得知道如何构建 Docker 镜像了。平时我们构建 Docker 镜像时候,都是编写 Dockerfile 脚本,然后使用 Docker 镜像构建命令,按照脚本一行行执行构建。
如下就是一个 Dockerfile 脚本,脚本内容就构建 Java 项目镜像常用的 Dockerfile 命令:
FROM openjdk:8u275
VOLUME /tmp
ADD target/*.jar app.jar
ENV TZ=“Asia/Shanghai”
ENV JAVA_OPTS=“”
ENV JVM_OPTS=“-XX:MaxRAMPercentage=80.0”
ENTRYPOINT [“sh”,“-c”,“java J V M O P T S JVM_OPTS JVMOPTS JAVA_OPTS -jar /app.jar”]
有了 Dockerfile 脚本,我们需要执行 Docker 的构建镜像命令对执行 Dockerfile 脚本构建镜像,其中构建镜像的过程如下:
## 构建镜像的命令
$ docker build -t java-test:latest .
## 命令执行的过程
Step 1/7 : FROM openjdk:8u275
—> 82f24ce79de6
Step 2/7 : VOLUME /tmp
—> Running in a6361fdfc193
Removing intermediate container a6361fdfc193
—> a43948bf1b98
Step 3/7 : ADD target/*.jar app.jar
—> 18f4bc60818f
Step 4/7 : ENV TZ=“Asia/Shanghai”
—> Running in cc738aa5865b
Removing intermediate container cc738aa5865b
—> 538adb85609e
Step 5/7 : ENV JAVA_OPTS=“”
—> Running in f8b635d32b2b
Removing intermediate container f8b635d32b2b
—> 34e7a8cd7b6e
Step 6/7 : ENV JVM_OPTS=“-XX:MaxRAMPercentage=80.0”
—> Running in 9331cb6e443e
Removing intermediate container 9331cb6e443e
—> 232b9c6c1d29
Step 7/7 : ENTRYPOINT [“sh”,“-c”,“java J V M O P T S JVM_OPTS JVMOPTS JAVA_OPTS -jar /app.jar” ]
—> Running in c3a24fba3a10
Removing intermediate container c3a24fba3a10
—> a41974d5f0e3
可以看到总共存在 7 个构建步骤,每步都与 Dockerfile 里面一行指令对应。样子和下图相似:
如果这时候,我们改变原来 Dockerfile 内容,创建一个新的镜像,其 Dockerfile 如下:
FROM openjdk:8u275
VOLUME /tmp
ADD target/*.jar app.jar
ENV TZ=“Asia/Macao” #与原来 Dockerfile 不同
ENV JVM_OPTS=“-Xmx512m -Xss256k” #与原来 Dockerfile 不同
ENTRYPOINT [“sh”,“-c”,“java