Dockerfile 自定义镜像

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
性能测试 PTS,5000VUM额度
云原生网关 MSE Higress,422元/月
简介: 在这个快速发展的技术时代 , 我们经常面临着应用部署的复杂性、环境差异以及不同操作系统之间的兼容性问题 . 这些问题不仅消耗大量时间 , 还可能导致项目延期和成本增加 . 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 .

目录
相关文章
|
2月前
|
应用服务中间件 Shell nginx
制作docker镜像的dockerfile编写规则汇总
制作docker镜像的dockerfile编写规则汇总
|
11月前
|
运维 Java Shell
Docker(四) 通过DockerFile自定义镜像
Docker(四) 通过DockerFile自定义镜像
171 0
|
2月前
|
缓存 Ubuntu JavaScript
Docker自定义镜像-构建镜像-Dockerfile语法
Docker自定义镜像-构建镜像-Dockerfile语法
65 0
|
2月前
|
存储 缓存 Docker
Docker镜像构建:深入Dockerfile创建自定义镜像
Docker的强大之处在于其能够通过Dockerfile定义和构建自定义镜像,为应用提供独立、可移植的运行环境。在这篇博客文章中,将深入探讨Docker镜像构建的核心概念,通过更加丰富的示例代码,帮助大家全面理解和掌握构建自定义镜像的技术。
|
2月前
|
Java Shell 应用服务中间件
DockerFile使用与自定义镜像详解
DockerFile使用与自定义镜像详解
231 0
|
Ubuntu 关系型数据库 MySQL
利用Dockerfile创建指定镜像
利用Dockerfile创建指定镜像
224 2
|
11月前
|
运维 Oracle 关系型数据库
Docker(二) 自定义镜像
Docker(二) 自定义镜像
160 0
|
12月前
|
存储 Ubuntu Java
【Docker】自定义镜像与Compose(上)
【Docker】自定义镜像与Compose
230 0
|
12月前
|
关系型数据库 MySQL Java
【Docker】自定义镜像与Compose(下)
【Docker】自定义镜像与Compose(下)
209 0
|
Ubuntu 应用服务中间件 Shell
认识 Dockerfile 文件之镜像构建
了解 Dockerfile 指令语法并熟练掌握,如何编写 Dockerfile 文件来定制一个镜像。
241 1
认识 Dockerfile 文件之镜像构建