从零开始学Docker-自定义镜像(Dockerfile)

1. 镜像的构成

        镜像是一个分层结构主要由三部分组成:

  1. 1. 基础镜像(BaseImage),应用依赖的系统函数库、环境、配置、文件等

  2. 2. 层(Layer),在基础镜像上添加安装包、依赖、配置等,每次操作都将形成一个新层

  3. 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 来一键部署分布式~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Andrew-ZhangJinyi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值