Dockerfile讲解

Dockerfile

  • 1. 构建过程解析
  • 2. Dockerfile常用保留字指令
  • 3. 案例
    • 3.1. 自定义镜像mycentosjava8
    • 3.2. 虚悬镜像
  • 4. Docker微服务实战

dockerfile是用来构建docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
dockerfile定义了进程需要的一切东西,涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;
image.png
官网:https://docs.docker.com/engine/reference/builder/

UnionFS(联合文件系统): Unin文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a sindle virtual flesystem)。 Union文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

1. 构建过程解析

构建三步骤:

  1. 编写dockerfile文件
  2. docker build命令构建镜像
  3. docker run依镜像运行容器实例

基础知识:

  1. 每条保留字指令都必须为大写字母且后面要跟随至少一个参数

image.png
像图中这种ADD,ENV,COPY等就叫保留字指令

  1. 指令按照从上到下,顺序执行
  2. #表示注释
  3. 每条指令都会创建一个新的镜像层并对镜像进行提交

docker 执行 dockerfile 的大致流程:

  1. docker从基础镜像运行一个容器
  2. 执行一条指令修改容器
  3. 执行类似docker commit的操作提交一个新的镜像层
  4. docker再基于刚提交的镜像运行一个新容器
  5. 执行dockerfile中的下一条指令直到所有指令执行完成
  • docker commit 提交容器副本使之成为一个新的镜像:docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]

使用dockerfile构建docker镜像,再用镜像生成容器

2. Dockerfile常用保留字指令

参考tomcat8的Dockerfile入门 https://github.com/docker-library/tomcat/blob/master/9.0/jdk8/corretto-al2/Dockerfile
image.png

  1. FROM

基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from
如.
image.png

  1. MAINTAINER

镜像维护者的姓名和邮箱地址

  1. RUN

容器构建时需要运行的命令,在 docker build时运行
有两种格式:

  • shell格式

RUN <命令行命令>
命令行命令等同于在终端操作的shell命令

例: RUN yum -y install vim

  • exec格式

RUN [“可执行文件”,“参数1",“参数2”]

例:RUN [“./test.php”,“dev”,“offline”] ,等价于 RUN ./test.php dev offline

如.
image.png

  1. EXPOSE

当前容器对外暴露出的端口

  1. WORKDIR

指定在创建容器后,终端默认登录进来的工作目录,一个落脚点
image.png
如上图这个/,就是默认的工作目录
如.
image.png

  1. USER

指定该镜像以什么样的用户去执行,如果都不指定,默认是root

  1. ENV

用来在构建镜像过程中设置环境变量

ENV MY_PATH /usr/mytest
这个环境变量可以在后续的任何RUN指令中使用,如同在命令前指定了环境变量前缀一样,也可以在其他指令中直接使用这些环境变量

例:WORKDIR $MY_PATH 指定了登录后的默认工作目录为/usr/mytest

如.
image.png

  1. VOLUME

容器数据卷,用于数据保存和持久化工作

  1. ADD

将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
相比于COPY命令多了个解压功能

  1. CMD

指定容器启动后的要干的事情,与RUN的区别是CMD时在docker run时运行
CMD指令的格式和RUN相似,也是两种格式:

  • shell格式:CMD <命令>
  • exec格式:CMD [“可执行文件”,“参数1",“参数2” …]
  • 参数列表模式:CMD [“参数1",“参数2” …] 在指定了ENTRYPOINT指令后,用CMD指定具体的参数

Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换

如.
image.png

  1. ENTRYPOINT

格式:ENTRYPOINT [“”,“”,“”,…]

也是用来指定一个容器启动时要运行的命令
类似于CMD指令,但是ENTRYPOINT不会被docker run 后面的命令覆盖,而且这些命令行参数会被当作参数送给ENTRYPOINT指令指定的程序

ENTRYPOINT可以和CMD一起用,一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参。
当指定了ENTRYPOINT后,CMD的含义就发生了变化,不再是直接运行其命令而是将CMD的内容作为参数传递给ENTRYPOINT指令,他两个组合会变成"<ENTRYPOINT>"<CMD>"
image.png

3. 案例

3.1. 自定义镜像mycentosjava8

centos7镜像具备vim+ifconfig+jdk8

  1. 创建文件夹myfile,将jdk压缩包传到当前目录下

jdk压缩包要与Dockerfile文件在同一目录下
image.png

  1. 创建Dockerfile文件,编辑内容]

Dockerfile文件中的D一定是大写

FROM centos:7
MAINTAINER zy<2351950143@qq.com>ENV MYPATH /usr/local
WORKDIR $MYPATH#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把jdk-8u341-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u341-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_341
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATHEXPOSE 80CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
  1. 构建镜像

最后有一个点别忘了

docker build -t centosjava8:1.0 .

构建完成:
image.png
查看创建的镜像:
image.png

  1. 运行镜像
docker run -it 镜像ID /bin/bash

image.png

3.2. 虚悬镜像

仓库名和版本号都为none的就是虚悬镜像
image.png
查看所有的虚悬镜像

docker image ls -f dangling=true

删除所有虚悬镜像

docker image prune

image.png

4. Docker微服务实战

  1. 新建一个普通微服务模块

端口为6001,只有一些简单的接口
image.png
本机测试没问题
image.png
打包并把他放进虚拟机目录里
image.png

  1. 通过dockerfile发布微服务部署到docker容器

编写Dockerfile文件:

# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER zy
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为zy_docker.jar
ADD docker_test-0.0.1-SNAPSHOT.jar zy_docker.jar
# 运行jar包
RUN bash -c 'touch /zy_docker.jar'
ENTRYPOINT ["java","-jar","/zy_docker.jar"]
# 暴露6001端口
EXPOSE 6001

构建:
别忘了最后的点

docker build -t zy_docker:1.1 .

image.png
image.png

运行容器:

docker run -d -p 6001:6001 661bf8447553

image.png

测试:
image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/206500.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[蓝桥杯习题]———位运算、判断二进制1个数

⭐Hello!这里是欧_aita的博客。 ⭐今日语录&#xff1a;行动胜过一切。 ⭐个人主页&#xff1a;欧_aita ψ(._. )>⭐个人专栏&#xff1a; 数据结构与算法&#xff08;内含蓝桥杯习题&#xff09; MySQL数据库 位运算 位运算位运算的定义简单运用 实战刷题题目思路代码实现声…

flutter,uni-app开发调试ios

一、申请ios开发者账号 二、ios开发者配置 ios 开发者需要配置的地方 https://developer.apple.com/account/resources/certificates/list Certificates&#xff08;证书&#xff09;: 作用&#xff1a; 证书用于对应用程序和开发者进行身份验证&#xff0c;确保安全性和可…

mac截图Snagit 中文介绍

1.超越普通的屏幕截图 TechSmith Snagit 是唯一具有内置高级图像编辑和屏幕录制功能的屏幕捕获软件。因此&#xff0c;您可以在一个程序中轻松创建高质量的图像和视频。 2.最后&#xff0c;屏幕捕获软件可以完成您所做的一切 快速解释一个过程如果您正在努力清楚地沟通&…

2023 年 IntelliJ IDEA下载、安装教程,附详细图文

大家好&#xff0c;今天为大家带来的是 2023年 IntelliJ IDEA 下载、安装教程&#xff0c;超详细的图文教程&#xff0c;亲测可用。 文章目录 1 IDEA 下载2 IDEA 安装3 IDEA 使用4 快捷键新手必须掌握&#xff1a;Ctrl&#xff1a;Alt&#xff1a;Shift&#xff1a;Ctrl Alt&a…

STM32CubeIDE(CUBE-MX hal库)----定时器

系列文章目录 STM32CubeIDE(CUBE-MX hal库)----初尝点亮小灯 STM32CubeIDE(CUBE-MX hal库)----按键控制 STM32CubeIDE(CUBE-MX hal库)----串口通信 文章目录 系列文章目录前言一、定时器二、使用步骤三、HAL库实验代码三、标准库代码 前言 STM32定时器是一种多功能外设&#…

【MATLAB】异常数据识别

基于分位数的异常点识别 首先&#xff0c;给定了一个原始数据序列x。然后&#xff0c;计算了序列x的上四分位数和下四分位数&#xff0c;并根据这两个值计算了异常点的阈值。上四分位数减去1.5倍的四分位数范围得到异常值下界&#xff0c;下四分位数加上1.5倍的四分位数范围得…

Selenium介绍及基本使用方法

Selenium是一个开源、免费、简单、灵活&#xff0c;对Web浏览器支持良好的自动化测试工具&#xff0c;在UI自动化、爬虫等场景下是十分实用的&#xff0c;能够熟练掌握并使用Selenium工具可以大大的提高效率。 Selenium简介 Selenium支持多平台、多浏览器、多语言去实现自动化…

【Qt绘图】之绘制坦克

使用绘图事件&#xff0c;绘制坦克。 效果 效果很逼真&#xff0c;想象力&#xff0c;有没有。 示例 代码像诗一样优雅&#xff0c;有没有。 包含头文件 #include <QApplication> #include <QWidget> #include <QPainter>绘制坦克类 class TankWidge…

【docker系列】docker实战之部署SpringBoot项目

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Docker篇之利用docker搭建ftp服务器可实现多用户上传

一、前言 场景&#xff1a;公司需要搭建FTP服务器&#xff0c;供内网之前可以互相传递数据&#xff0c;安全稳定&#xff0c;需要满足开通多个账号&#xff0c;每个用户上传的文件有自己对应的文件目录。 这里建议&#xff1a;用户目录Disk尽量大一点&#xff0c;避免因为空间不…

低代码平台在数字化转型过程中的定位

内容来自演讲&#xff1a;郭昊东 | 上海外服 | 流程分析工程师 摘要 本文介绍了外服集团的 IT 共享中心在低代码平台应用开发方面的实践经验。他们选择低代码平台的原因包括开发成本低、快速看到实际产品以及能够解决数据孤岛和影子 IT 等问题。他们在应用开发中面临的挑战包括…

android shape绘制半圆

<?xml version"1.0" encoding"utf-8"?><shape xmlns:android"http://schemas.android.com/apk/res/android"android:shape"rectangle"><sizeandroid:width"20dp"android:height"10dp" /><…

HBase数据模型杂谈

1.概述 HBase是一个稀疏、多维度、排序的映射表&#xff0c;这张表的索引是行键、列族、列限定符和时间戳。 每个值是一个未经解释的字符串&#xff0c;没有数据类型。用户在表中存储数据&#xff0c;每一行都有一个可排序的行键和任意多的列。表在水平方向由一个或者多个列族…

前端管理制度

数据运营中心的管理形式&#xff1a; 数据运营中心的管理形式 竖向是各小组 横向是项目管理 负责人的定位&#xff1a; 只是工作的内容不同&#xff0c;没有上下级之分 帮助组员找到适合的位置&#xff0c;帮助大家解决问题&#xff0c;给大家提供资源 前端组的工作形式&am…

YOLOV7主干改进,使用fasternet轻量化改进主干(完整教程)

1&#xff0c;Pconv&#xff08;来自Fasternet&#xff09;&#xff08;可作为模型中的基础卷积模块使用&#xff09; 论文链接&#xff1a;https://arxiv.org/abs/2303.03667 2&#xff0c;为了大家方便的使用&#xff0c;这里我对原本的PConv的代码做了部分的改动&#xff0…

系列六、Spring整合单元测试

一、概述 Spring中获取bean最常见的方式是通过ClassPathXmlApplicationContext 或者 AnnotationConfigApplicationContext的getBean()方式获取bean&#xff0c;那么在Spring中如何像在SpringBoot中直接一个类上添加个SpringBootTest注解&#xff0c;即可在类中注入自己想要测试…

Spring Cloud 版本升级遇坑记:OpenFeignClient与Gateway的恩怨情仇

Spring Cloud 版本升级遇坑记&#xff1a;OpenFeignClient与Gateway的恩怨情仇 近日&#xff0c;在对项目中的 Spring Boot、Spring Cloud 以及 Spring Cloud Alibaba 进行版本升级时&#xff0c;遭遇了一个令人头疼的问题&#xff1a;Spring Cloud Gateway 在运行时一直卡住&a…

Nginx(十二) gzip gzip_static sendfile directio aio 组合使用测试(2)

测试10&#xff1a;开启gzip、sendfile、aio、directio1m&#xff0c;关闭gzip_static&#xff0c;请求/index.js {"time_iso8601":"2023-11-30T17:20:5508:00","request_uri":"/index.js","status":"200","…

JVM——几种常见的对象引用

目录 1. 软引用软引用的使用场景-缓存 2.弱引用3.虚引用和终结器引用 可达性算法中描述的对象引用&#xff0c;一般指的是强引用&#xff0c;即是GCRoot对象对普通对象有引用关系&#xff0c;只要这层关系存在&#xff0c; 普通对象就不会被回收。除了强引用之外&#xff0c;Ja…

Vue项目的创建、运行与端口号修改

前言&#xff1a;Vue-cli是Vue官方提供的一个脚手架&#xff0c;用于快速生成一个Vue的项目模板&#xff0c;依赖于NodeJS环境 NodeJS下载&#xff1a;NodeJS安装下载 Vue-cli下载&#xff1a;Vue-cli下载 一.Vue图形化创建项目 1.建立一个文件夹&#xff0c;保存Vue项目 2.在该…