Dockerfile 自定义镜像

本文涉及的产品
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
注册配置 MSE Nacos/ZooKeeper,182元/月
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
简介: 在这个快速发展的技术时代 , 我们经常面临着应用部署的复杂性、环境差异以及不同操作系统之间的兼容性问题 . 这些问题不仅消耗大量时间 , 还可能导致项目延期和成本增加 . Docker 的出现解决了我们在应用部署过程中遇到的障碍和挑战 . 通过将应用程序及其依赖环境封装在一个轻量级的、可移植的容器中 , Docker 不仅简化了开发和部署流程 , 还确保了不同环境间的无缝衔接和一致性 .

一 . 镜像结构

先来复习一下镜像的概念 : 镜像是将应用程序以及需要的系统函数库、环境、配置、依赖打包而成 .

我们以 MySQL 的镜像为例 , 分析一下镜像的结构

📎镜像的分层结构.png

二 . Dockerfile 语法

2.1 什么是 Dockerfile ?

Dockerfile 就是一个文本文件 , 其中包含了一个个的指令 , 通过指令来说明要执行什么操作来去构建镜像 .

我们就可以把 Dockerfile 当做一个构建镜像的说明书 , Docker 就会按照说明书构建出指定的镜像了 .

那每一个指令 , 其实都会形成一层 Layer .

2.2 Dockerfile 的语法

指令

说明

实例

FROM

指定基础镜像

FROM centos:8

ENV

设置环境变量 (可以理解为全局变量) , 可供后续指令使用

ENV key value

COPY

拷贝本地文件到镜像的指定目录

copy ./mysql-5.7 .rpm /tmp

RUN

执行 Linux 的相关 Shell 命令 , 一般是安装命令

RUN yum install gcc

EXPOSE

指定容器运行时监听的端口 , 也就是 -p 后面的参数

EXPOSE 8080

ENTRYPOINT

镜像中应用的启动命令 , 容器运行时进行调用

ENTRYPOINT java -jar xx.jar

2.3 基于 Ubuntu 镜像构建出一个新镜像 , 运行一个 Java 项目

① 新建一个空的文件夹 docker-demo

cd /tmp/
mkdir docker-demo
cd docker-demo/

② 将所需要的文件拷贝到 docker-demo 目录下

📎docker-demo.jar

📎jdk8.tar.gz

📎Dockerfile.zip

Dockerfile 需要进行解压之后再进行上传

我们可以来看一下 Dockerfile 的内容

# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量, JDK 的安装目录
# ENV 就相当于全局变量
ENV JAVA_DIR=/usr/local
# 拷贝 JDK 和 Java 项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/ 
COPY ./docker-demo.jar /tmp/app.jar
# 安装 JDK
RUN cd $JAVA_DIR \
 && tar -xf ./jdk8.tar.gz \
 && mv ./jdk1.8.0_144 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 暴露端口
EXPOSE 8090
# 入口, Java 项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar

③ 利用 Docker 构建镜像

# docker build 表示构建镜像
# -t 表示版本 (tag)
# test:1.0 前半部分是镜像名称, 后半部分是镜像的版本号
# . 表示的是 Dockerfile 所在的目录, 当前 Dockerfile 文件就在此目录
docker build -t test:1.0 .

此时我们就可以看一下镜像是否构建完毕

# 查看本地镜像
docker images

④ 构建容器

我们可以构建并且启动容器

# docker run : 创建并运行容器
# --name web : 给当前容器起一个别名
# -p 8090:8090 : 将宿主机的 8090 端口和容器的 8090 端口进行绑定
# -d : 设置容器后台运行
# test:1.0 : 要操作的镜像
docker run --name web -p 8090:8090 -d test:1.0

2.4 基于 java:8-alpine 镜像 , 将一个 Java 项目构建为镜像

我们刚才的 Dockerfile 文件 , 其实我们观察一下 , 只有一个位置才发挥了作用

那 java:8-alpine 镜像就包含了基础环境的所有步骤 , 那所以我们就可以把无用代码全部删掉 , 基础镜像指定成 java:8-alpine 就可以了

# 指定基础镜像
FROM java:8-alpine
# 拷贝 java 项目包
COPY ./docker-demo.jar /tmp/app.jar
# 暴露端口
EXPOSE 8090
# 入口, Java 项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar

那我们就可以把修改之后的 dockerfile 重新上传

我们重新构建镜像

我们需要提前关闭之前 1.0 版本的镜像

docker stop web

# 构建镜像
docker build -t test:2.0 .

目录
相关文章
|
存储 缓存 安全
90%的Go语言程序员map遍历方式都是错的
90%的Go语言程序员map遍历方式都是错的
521 0
|
Linux Python
centos使用Linux命令行测试网速/带宽
安装speedtest-cli speedtest-cli是一个用Python编写的轻量级Linux命令行工具,在Python2.4至3.4版本下均可运行。
4360 0
|
4月前
|
机器学习/深度学习 数据采集 并行计算
面壁小钢炮MiniCPM 4.0开源,端侧推理常规提速5倍!
面壁智能重磅推出MiniCPM 4.0 ——一个极致高效的端侧大模型,通过其 CPM.cu 自研推理框架,可实现220倍极致的速度提升,5 倍常规提速。
685 14
|
9月前
|
SQL Java 关系型数据库
【📕分布式锁通关指南 01】从解决库存超卖开始加锁的初体验
本文通过电商场景中的库存超卖问题,深入探讨了JVM锁、MySQL悲观锁和乐观锁的实现及其局限性。首先介绍了单次访问下库存扣减逻辑的正常运行,但在高并发场景下出现了超卖问题。接着分析了JVM锁在多例模式、事务模式和集群模式下的失效情况,并提出了使用数据库锁机制(如悲观锁和乐观锁)来解决并发问题。 悲观锁通过`update`语句或`select for update`实现,能有效防止超卖,但存在锁范围过大、性能差等问题。乐观锁则通过版本号或时间戳实现,适合读多写少的场景,但也面临高并发写操作性能低和ABA问题。 最终,文章强调没有完美的方案,只有根据具体业务场景选择合适的锁机制。
321 12
【📕分布式锁通关指南 01】从解决库存超卖开始加锁的初体验
|
9月前
|
存储 Docker 容器
Docker-基础(数据卷、自定义镜像、Compose)
通过数据卷实现持久化存储,通过自定义镜像满足特定需求,通过Docker Compose方便地管理多容器应用
189 27
|
10月前
|
JSON Shell Linux
dockerfile 用法全解析
Dockerfile指令简介:`FROM`基于Alpine镜像;`WORKDIR`设置工作目录;`COPY`复制文件;`ADD`支持URL;`RUN`运行命令;`CMD`容器启动时执行;`ENTRYPOINT`与`CMD`组合执行;`EXPOSE`声明端口;`VOLUME`映射文件;`ENV`设置环境变量;`ARG`构建参数;`LABEL`元数据;`ONBUILD`触发命令;`STOPSIGNAL`停止信号;`HEALTHCHECK`健康检查;`SHELL`默认Shell。Alpine仅5M,小巧高效。
237 4
dockerfile 用法全解析
|
应用服务中间件 Linux nginx
Docker Compose 安装与使用(常用指令)
Docker Compose 安装与使用(常用指令)
997 0
|
存储 搜索推荐 大数据
大数据在医疗领域的应用
大数据在医疗领域有广泛应用,包括电子病历的数字化管理和共享,提升医疗服务效率与协同性;通过数据分析支持医疗决策,制定个性化治疗方案;预测疾病风险并提供预防措施;在精准医疗中深度分析患者基因组信息,实现高效治疗;在药物研发中,加速疗效和副作用发现,提高临床试验效率。此外,在金融领域,大数据的“4V”特性助力业务决策前瞻性,被广泛应用于银行、证券和保险的风险评估、市场分析及个性化服务中,提升运营效率和客户满意度。
1348 6
|
负载均衡 Java 网络架构
Spring Cloud原理详解
介绍了Spring Cloud的原理和核心组件,包括服务注册与发现、配置管理、负载均衡、断路器、智能路由、分布式消息传递、分布式追踪和服务熔断等,旨在帮助开发人员快速构建和管理微服务架构中的分布式系统。
501 0
|
Ubuntu
ubuntu20+window双系统启动引导项的修复
ubuntu20+window双系统启动引导项的修复
3048 1
ubuntu20+window双系统启动引导项的修复