码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Dockerfile 自定义镜像


    大家好 , 今天我要和大家分享一个现代软件开发中不可或缺的工具 - Docker . 在这个快速发展的技术时代 , 我们经常面临着应用部署的复杂性、环境差异以及不同操作系统之间的兼容性问题 . 这些问题不仅消耗大量时间 , 还可能导致项目延期和成本增加 . Docker 的出现解决了我们在应用部署过程中遇到的障碍和挑战 . 通过将应用程序及其依赖环境封装在一个轻量级的、可移植的容器中 , Docker 不仅简化了开发和部署流程 , 还确保了不同环境间的无缝衔接和一致性 .

    docker01.png

    本文参考资源 : https://www.bilibili.com/video/BV1HP4118797/?spm_id_from=333.337.search-card.all.click

    专栏地址 : https://blog.csdn.net/m0_53117341/category_12682419.html

    文章目录

    • 一 . 镜像结构
    • 二 . Dockerfile 语法
      • 2.1 什么是 Dockerfile ?
      • 2.2 Dockerfile 的语法
      • 2.3 基于 Ubuntu 镜像构建出一个新镜像 , 运行一个 Java 项目
        • ① 新建一个空的文件夹 docker-demo
        • ② 将所需要的文件拷贝到 docker-demo 目录下
        • ③ 利用 Docker 构建镜像
        • ④ 构建容器
      • 2.4 基于 java:8-alpine 镜像 , 将一个 Java 项目构建为镜像

    一 . 镜像结构

    先来复习一下镜像的概念 : 镜像是将应用程序以及需要的系统函数库、环境、配置、依赖打包而成 .
    我们以 MySQL 的镜像为例 , 分析一下镜像的结构
    镜像的分层结构.png

    镜像的分层结构.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/
    

    image.png

    ② 将所需要的文件拷贝到 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
    

    image.png

    ③ 利用 Docker 构建镜像

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

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

    # 查看本地镜像
    docker images
    

    image.png

    ④ 构建容器

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

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

    image.png

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

    我们刚才的 Dockerfile 文件 , 其实我们观察一下 , 只有一个位置才发挥了作用
    image.png
    那 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 重新上传
    image.png
    我们重新构建镜像

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

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

    image.png

  • 相关阅读:
    C++的缺陷和思考(六)
    losf命令详解
    使用Wireshark软件抓包(分析报文)
    Vim入门教程
    PyTorch实战 | 文本情感分类任务 | LSTM与LSTM+Attention
    壳聚糖载抗生素水凝胶/接枝Nogo-A抗体的温敏型壳聚糖水凝胶/巯基化壳聚糖水凝胶的制备
    LuatOS-SOC接口文档(air780E)-- ftp - ftp 客户端
    证券期货业数据分类分级指引
    Spark 3.0 - 9.Ml 朴素贝叶斯中文分类分析与实战
    c++使用http请求-drogon框架
  • 原文地址:https://blog.csdn.net/m0_53117341/article/details/139726930
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号