NipGeihou's blog NipGeihou's blog
  • Java

    • 开发规范
    • 进阶笔记
    • 微服务
    • 快速开始
    • 设计模式
  • 其他

    • Golang
    • Python
    • Drat
  • Redis
  • MongoDB
  • 数据结构与算法
  • 计算机网络
  • 应用

    • Grafana
    • Prometheus
  • 容器与编排

    • KubeSphere
    • Kubernetes
    • Docker Compose
    • Docker
  • 组网

    • TailScale
    • WireGuard
  • 密码生成器
  • 英文单词生成器
🍳烹饪
🧑‍💻关于
  • 分类
  • 标签
  • 归档

NipGeihou

我见青山多妩媚,料青山见我应如是
  • Java

    • 开发规范
    • 进阶笔记
    • 微服务
    • 快速开始
    • 设计模式
  • 其他

    • Golang
    • Python
    • Drat
  • Redis
  • MongoDB
  • 数据结构与算法
  • 计算机网络
  • 应用

    • Grafana
    • Prometheus
  • 容器与编排

    • KubeSphere
    • Kubernetes
    • Docker Compose
    • Docker
  • 组网

    • TailScale
    • WireGuard
  • 密码生成器
  • 英文单词生成器
🍳烹饪
🧑‍💻关于
  • 分类
  • 标签
  • 归档
  • Linux

  • Docker

    • 基本命令
    • Docker Compose Specification快速开始
    • Docker Swarm
    • Docker容器默认时区导致MySQL时区问题错误
    • Docker - 概述
    • Docker - 基本概念
    • Docker - 自定义镜像(Dockerfile)
      • 镜像结构
      • 什么是Dockerfile
      • 案例:容器运行Java项目
        • 传统部署流程
        • Docker部署流程
        • 改进
    • Docker Compose
    • Docker镜像仓库
    • 常用容器

  • 云原生

  • Kubernetes

  • KubeSphere

  • K3S

  • 笔记

  • PVE

  • 维修

  • DevOps

  • 云服务

  • 路由器

  • Hyper-V

  • Windows

  • macOS

  • 运维
  • Docker
NipGeihou
2022-06-09
目录

Docker - 自定义镜像(Dockerfile)

# 镜像结构

image-20220609163846905

镜像是分层结构,每一层称为一个 Layer

  • BaseImage 层:包含基本的系统函数库、环境变量、文件系统
  • Entrypoint:入口,是镜像中应用启动的命令
  • 其它:在 BaseImage 基础上添加依赖、安装程序、完成整个应用的安装和配置

# 什么是 Dockerfile

Dockerfile 就是一个文本文件,其中包含一个个的指令 (Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层 Layer。

指令 说明 示例
FROM 指定基础镜像 FROM centos:6
ENV 设置环境变量,可在后面指令使用 ENV key value
COPY 拷贝本地文件到镜像的指定目录 COPY ./mysql-5.7.rpm /tmp
RUN 执行 Linux 的 shell 命令,一般是安装过程的命令 RUN yum install gcc
EXPOSE 指定容器运行时监听的端口,是给镜像使用者看的 EXPOSE 8080
ENTRYPOINT 镜像中应用的启动命令,容器运行时调用 ENTRYPOINT java -jar xx.jar

更新详细语法说明,请参考官网文档: https://docs.docker.com/engine/reference/builder

# 案例:容器运行 Java 项目

基于 Ubuntu 镜像构建一个新镜像,运行一个 java 项目

# 传统部署流程

  1. 安装 Ubuntu系统
  2. 系统中安装 JDK
  3. 把 jar包 搞到系统里去,可以是上传,也可以是在服务器里用 Maven 构建
  4. 然后使用 java -jar 命令运行
  5. 浏览器访问

# Docker 部署流程

  1. 新建文件夹 docker-demo

  2. 拷贝 docker-demo.jar 文件到 docker-demo 目录

  3. 拷贝 jdk8.tar.gz 文件到 docker-demo 目录

  4. 拷贝 Dockerfile 到 docker-demo 目录

  5. 进入 docker-demo

  6. 构建镜像,运行命令: docker build -t javaweb:1.0 .

  7. 运行: docker run --name web -p 8090:8090 -d javaweb:1.0

  8. 最后访问 http://localhost:8090/hello/count,其中的 ip 改成你的虚拟机 ip

Dockerfile

# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录
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

使用此 Dockerfile,会导致每个微服务镜像都需要重复安装 JDK 环境变量,可使用 java:8-alpine 镜像代替

# 改进

可使用 java:8-alpine 镜像

Dockerfile

# 指定基础镜像
FROM java:8-alpine

# 拷贝java项目的包
COPY ./docker-demo.jar /tmp/app.jar

# 暴露端口
EXPOSE 8090

# 入口,java项目的启动命令
# ENTRYPOINT java -jar /tmp/app.jar  #与下面等价
ENTRYPOINT ["java","-jar","/tmp/app.jar"]
上次更新: 2025/04/18, 19:09:23
Docker - 基本概念
Docker Compose

← Docker - 基本概念 Docker Compose→

最近更新
01
iSCSI服务搭建
05-10
02
磁盘管理与文件系统
05-02
03
网络测试 - iperf3
05-02
更多文章>
Theme by Vdoing | Copyright © 2018-2025 NipGeihou | 友情链接
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式