1. 镜像的构成
镜像是一个分层结构主要由三部分组成:
-
1. 基础镜像(BaseImage),应用依赖的系统函数库、环境、配置、文件等
-
2. 层(Layer),在基础镜像上添加安装包、依赖、配置等,每次操作都将形成一个新层
-
3. 入口(Entrypoint)镜像运行入口,一般是程序启动的脚本和参数
2. 自定义镜像的两种方式:
docker commit 命令(不常用):
将已经运行的容器打包成一个新的镜像,命令如下:
# 命令格式 docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
# -a 指定新的镜像作者,-m指定提交时的信息,新镜像为redis:v1
docker commit -a "Andrew Zhang" -m "my new redis" my-redis redis:v1
Dockerfile脚本:
Dockfile是有一系列指令和参数构成的脚本文件, 每条指令表明了如何去构建这个镜像。
官方提供的一个简单的Dockerfile如下所示:
FROM busybox
ENV FOO=/bar
WORKDIR ${FOO} # WORKDIR /bar
ADD . $FOO # ADD . /bar
COPY \$FOO /quux # COPY $FOO /quux
优缺点:
docker commit :打包镜像时,方便,不需要额外配置,但不知道镜像是如何构建出来 的。且打包时会讲原容器日志一并打包,打包后体积偏大。
Dockerfile:打包时,需要编写Dockerfile,有额外的工作量,较为复杂。但可以清晰的知道镜像构建的过程,且在夸机器使用时,理论上可以制作出一摸一样的镜像,更适用于工程化。
3. Dockerfile常用命令
完善的Dockerfile请查看官方文档:Dockerfile reference | Docker Documentation
常用指令 | 说明 | 实例 |
---|---|---|
FROM | 指定基础镜像 | FROM centos:6 |
ENV | 设置环境变量,用于后续使用 | ENV key value |
COPY | 拷贝文件到镜像的指定目录 | COPY filepath1 filepath2 |
RUN | 执行linux的shell命令,一般是安装过程的命令 | RUN yum install gcc |
EXPOSE | 指定容器运行时监听的端口 | EXPOSE 8080 |
ENTRYPOINT | 容器启动时调用的命令 | ENTRYPOINT java -jar xx.jar |
4.使用Dockerfile构建自己的镜像
举例将一个Springboot的jar包打包成docker镜像
目录结构
Dockerfile
# 指定基础镜像
FROM ubuntu:20.04
# 配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local
# 拷贝jdk和java项目的包
COPY ./jdk8.tar $JAVA_DIR/
COPY ./my-app.jar /tmp/app.jar
# 安装JDK
RUN cd $JAVA_DIR \
&& tar -xf ./jdk8.tar \
&& mv ./jdk8u382-b05-debug-image ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
切换到Dockerfile所在目录,运行以下命令:
docker % docker build -t my-app:0.0.1 .
出现以下信息则表示构建成功:
使用docker images可以查看到构建的镜像:
以上的Dockerfile中,大部分内容在安装和配置Java环境。有些机构为我们打包好了这些基础镜像,如openjdk为我们打包好了基础镜像,配置了Java所需的环境和依赖,因此Dockerfile可以进一步简化成:
# 指定基础镜像
FROM openjdk:8
# 拷贝jdk和java项目的包
COPY ./my-app.jar /tmp/app.jar
# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
以上我们学会了如何自定义构建自己的docker镜像,接下来要学习的是docker compose 来一键部署分布式~