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


    Docker使用Dockerfile自定义镜像

    引子

    镜像结构

    Dockerfile语法

    什么是Dockerfile?

    案例:基于Ubuntu镜像构建一个新的镜像,运行一个Java项目

    (1)首先新建目录,将所需要的文件导入

    (2)我们来看看准备的Dockerfile中写了什么

    (3)执行构建命令

    (4)启动项目

    项目访问运行结果

    存在的问题

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

    (1)修改Dockerfile文件

    (2) 构建java:8-alpine镜像

    (3)运行容器 


    Docker使用Dockerfile自定义镜像

    引子

    常见的镜像在DockerHub就能找到,但是我们自己写的项目就必须自己构建镜像了。

    而要自定义镜像,就必须先了解镜像的结构才行。

    镜像结构

    镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。

    我们以MySQL为例,来看看镜像的组成结构:

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

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

    简单来说,镜像就是在系统函数库、运行环境基础上,添加应用程序文件、配置文件、依赖文件等组合,然后编写好启动脚本打包在一起形成的文件。

    我们要构建镜像,其实就是实现上述打包的过程。

    Dockerfile语法

    什么是Dockerfile?

    构建自定义的镜像时,并不需要一个个文件去拷贝,打包。

    我们只需要告诉Docker,我们的镜像的组成,需要哪些BaseImage、需要拷贝什么文件、需要安装什么依赖、启动脚本是什么,将来Docker会帮助我们构建镜像。

    而描述上述信息的文件就是Dockerfile文件。

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

    案例:基于Ubuntu镜像构建一个新的镜像,运行一个Java项目

    (1)首先新建目录,将所需要的文件导入

    我们在tmp目录中新建cloud-demo目录,将想要的文件导入这里。

    但是我们之前说过,使用的工具是finallshell,要想实现拖拽的方式,将本地的文件“copy”到虚拟机CentOS7中,要给 “mkdir” 创建的文件夹加权限。

    1. cd tmp
    2. mkdir cloud-demo
    3. chmod 777 cloud-demo

    (2)我们来看看准备的Dockerfile中写了什么

    1. # 指定基础镜像
    2. FROM ubuntu:16.04
    3. # 配置环境变量,JDK的安装目录
    4. ENV JAVA_DIR=/usr/local
    5. # 拷贝jdk和java项目的包
    6. COPY ./jdk8.tar.gz $JAVA_DIR/
    7. COPY ./docker-demo.jar /tmp/app.jar
    8. # 安装JDK
    9. RUN cd $JAVA_DIR \
    10. && tar -xf ./jdk8.tar.gz \
    11. && mv ./jdk1.8.0_144 ./java8
    12. # 配置环境变量
    13. ENV JAVA_HOME=$JAVA_DIR/java8
    14. ENV PATH=$PATH:$JAVA_HOME/bin
    15. # 暴露端口
    16. EXPOSE 8090
    17. # 入口,java项目的启动命令
    18. ENTRYPOINT java -jar /tmp/app.jar

    (3)执行构建命令

    docker build -t javaweb:1.0 .

    其中,-t就是tag的意思版本,指的是镜像的名称为javaweb,版本为1.0;最后面还有一个 “ . ” 不要忘记,意思是 Dockerfile 在当前目录下! 

    (4)启动项目

    docker images

    根据镜像启动容器 

    1. docker run --name cloud -p 8090:8090 -d javaweb:1.0
    2. docker ps

    项目访问运行结果

    存在的问题

    运行成功,docker自定义镜像构建、启动成功了。

    但是我们回顾一下Dockerfile,一层一层操作,内容还是比较多的,那么以后的微服务项目可能是有成千上万个模块,如果我们都要像这样一步一步的构建下来,是要重复耗费很多时间。

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

    (1)修改Dockerfile文件

    1. #安装jdk有一个包帮忙做了
    2. FROM java:8-alpine
    3. COPY ./docker-demo.jar /tmp/app.jar
    4. # 暴露端口
    5. EXPOSE 8090
    6. # 入口,java项目的启动命令
    7. ENTRYPOINT java -jar /tmp/app.jar

    (2) 构建java:8-alpine镜像

    alpine是帮我们将jdk所需要的环境打了一个包。 

    docker build -t javaweb:2.0 .

    上图中我们想要构建的步骤从案例一的 9 个减少到了现在的 4 个。 

    (3)运行容器 

    docker run --name web -p 8090:8090 -d javaweb:2.0

  • 相关阅读:
    国际物流和跨境电商物流的区别
    LeetCode --- 1952. Three Divisors 解题报告
    HTML+CSS大作业 格林蛋糕(7个页面) 餐饮美食网页设计与实现
    剑指offer 08. 用两个栈实现队列
    3.3.OpenCV技能树--二值图像处理--图像形态学操作
    姓氏情侣家庭亲子谐音顽梗头像分销流量主微信抖音小程序开发
    设计模式-代理模式
    黑苹果修改intel hd3000核显显存大小.2022-11-29
    【华为机试真题 Python】按身高和体重排队
    SD6.24集训总结
  • 原文地址:https://blog.csdn.net/weixin_43715214/article/details/126212630
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | 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号