Dockerfile基本结构及编写详解

news2024/9/21 16:30:54

文章目录

  • 1 Dockerfile
    • 1.1 Dockerfile的基本结构
    • 1.2 Dockerfile文件说明
    • 1.3 Dockerfile常见命令
    • 1.4 build命令
    • 1.5 部署微服务
    • 1.6 docker-compose部署

1 Dockerfile

​ Dockerfile其实就是我们用来构建Docker镜像的源码,当然这不是所谓的编程源码,而是一些命令的集合,只要理解它的逻辑和语法格式,就可以很容易的编写Dockerfile。简单点说,Dockerfile可以让用户个性化定制Docker镜像。因为工作环境中的需求各式各样,网络上的镜像很难满足实际的需求。

​ 参考文档:https://docs.docker.com/engine/reference/builder/

1.1 Dockerfile的基本结构

​ Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。

​ docker build命令用于从Dockerfile构建映像。可以在docker build命令中使用 -f 标志指向文件系统中任何位置的Dockerfile。

​ Dockerfile由一行行命令语句组成,并且支持以#开头的注释行,Dockerfile分为四部分:基础镜像信息、维护者信息、 镜像操作指令和容器启动时执行指令。

1.2 Dockerfile文件说明

​ Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM。一个声明以 # 字符开头则被视为注释。可以在Docker文件中使用 RUN , CMD , FROM , EXPOSE , ENV 等指令。

1.3 Dockerfile常见命令

​ Dockerfile的常用命令如下:

命令说明
FROM指定基础镜像,必须为第一个命令
MAINTAINER维护者(作者)信息
ENV设置环境变量
RUN构建镜像时执行的命令
CMD构建容器后调用,也就是在容器启动时才进行调用。
ENTRYPOINT指定运行容器启动过程执行命令,覆盖CMD参数;ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。
ADD将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
COPY功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
WORKDIR工作目录,类似于cd命令
ARG用于指定传递给构建运行时的变量
VOLUMN用于指定持久化目录
EXPOSE指定于外界交互的端口
USER指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户

1.4 build命令

​ docker build命令用于使用 Dockerfile 创建镜像,对应语法如下:

docker build [OPTIONS] PATH | URL | -

​ 常用参数有下面这些:

​ build命令参数特别多。这里只给大家介绍几个常用的参数,如果小伙伴们想了解更多内容,请参考docker官网手册。

​ 1,**–build-arg=[] 😗*设置镜像创建时的变量;

​ 2,**-f 😗*指定要使用的Dockerfile路径;

​ 3,**–rm 😗*设置镜像成功后删除中间容器;

​ 4,–tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。

​ 下面编写一个Dockerfile,指定系统时间为上海时区:

FROM mysql:5.7.31
# 作者信息 
MAINTAINER mysql from date UTC by Asia/Shanghai "dream21th@dream21th.com"
ENV TZ Asia/Shanghai

​ 进入到编写的Dockerfile所在目录,执行下面操作构建镜像:

[root@localhost mysql]# docker build -t dream21th/mysql:5.7.31 .

​ 构建镜像成功之后,查看镜像列表:

[root@localhost mysql]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED              SIZE
dream21th/mysql         5.7.31              e8a0308ad537        About a minute ago   448MB

​ 使用下面指令启动一个容器:

[root@localhost mysql]# docker run -p 3306:3306 --name dream21th-mysql -v /data/mysql:/etc/mysql -v /data/mysql/logs:/logs -v /data/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD='!QAZ@WSX#EDC' -d dream21th/mysql:5.7.31

​ 通过下面指令分别查看宿主机和容器的时间,发现时间一致:

[root@localhost mysql]# date
2022年 06月 24日 星期五 08:12:47 CST
[root@localhost mysql]# docker exec -it dream21th-mysql /bin/bash
root@4f6c18d98166:/# date
Fri Jun 24 08:12:57 CST 2022
root@4f6c18d98166:/# exit
exit

1.5 部署微服务

​ 本部分我们来通过用Dockerfile的生成微服务的部署,先将一个微服务的应用上传到服务器,并在相同的目录新建一个Dockerfile文件,Dockerfile文件代码的内容如下:

FROM openjdk:8-alpine3.9
# 作者信息
MAINTAINER dream21th Docker springboot "dream21th@dream21th.com"
#修改镜像为东八区时间
ENV TZ Asia/Shanghai
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
EXPOSE 9100
ENV JAVA_OPTS "-Xms800m -Xmx800m"
# 指定启动的环境
ENV SPRING_PROFILES_ACTIVE "dev"
ENTRYPOINT java ${JAVA_OPTS} -jar /app.jar --spring.profiles.active=${SPRING_PROFILES_ACTIVE}

在这里插入图片描述

​ 执行下面指令构建镜像:

[root@localhost microappb]# docker build --rm -t dream21th/micro-app-b:v1 --build-arg JAR_FILE=micro-app-b.jar .
[root@localhost microappb]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
dream21th/micro-app-b   v1                  3beaf4020dff        39 seconds ago      138MB

​ 通过下面指令启动一个服务镜像,并查看镜像日志,可以看到启动的环境是我们在命令里面显示加上的uat环境:

[root@localhost microappb]# docker run -itd --name MicroAppB -v /data/micro-app-b/log:/home/ops/app/micro-app-b/log -e SPRING_PROFILES_ACTIVE=uat -p 9100:9100 dream21th/micro-app-b:v1
3bb882872fbe12731268927478753098c62c4c47141b196cacf6a3d42edfafcd
[root@localhost microappb]# docker logs -f MicroAppB

在这里插入图片描述

​ 到宿主机的挂载日志的目录,也可以看到日志的相关信息:

在这里插入图片描述

1.6 docker-compose部署

​ 编写docker-compose.yml文件:

version: '3'
services:
  lagou-mysql:
    build:
      context: ./mysql
    environment:
       MYSQL_ROOT_PASSWORD: admin
    restart: always
    container_name: dream21th-mysql
    volumes:
      - /data/mysql/data:/var/lib/mysql
    ports:
      - 3306:3306
    networks:
      dream21th-net:
  micro-app-b:
    build:
      context: ./microappb
    environment:
      - "SPRING_PROFILES_ACTIVE=uat"
    restart: always
    container_name: microAppB
    volumes:
      - /data/micro-app-b/log:/home/ops/app/micro-app-b/log
    ports:
      - 9100:9100
    networks:
      dream21th-net:

networks:
  dream21th-net:

​ mysql文件夹下面文件只有Dockerfile,文件内容:

FROM mysql:5.7.31
# 作者信息 
MAINTAINER mysql from date UTC by Asia/Shanghai "dream21th@dream21th.com"
ENV TZ Asia/Shanghai

​ microappb文件夹里面内容micro-app-b.jar和Dockerfile。

FROM openjdk:8-alpine3.9
# 作者信息
MAINTAINER dream21th Docker springboot "dream21th@dream21th.com"
#修改镜像为东八区时间
ENV TZ Asia/Shanghai
ARG JAR_FILE
COPY micro-app-b.jar app.jar
#COPY start.sh start.sh
EXPOSE 9100
#ENTRYPOINT ["sh","start.sh"]
ENV JAVA_OPTS "-Xms800m -Xmx800m"
ENV SPRING_PROFILES_ACTIVE "dev"
ENTRYPOINT java ${JAVA_OPTS} -jar /app.jar --spring.profiles.active=${SPRING_PROFILES_ACTIVE}
[root@localhost app]# TAG=v1 docker-compose build
Building lagou-mysql
Step 1/3 : FROM mysql:5.7.31
 ---> 42cdba9f1b08
Step 2/3 : MAINTAINER mysql from date UTC by Asia/Shanghai "dream21th@dream21th.com"
 ---> Running in cf82b91a7858
Removing intermediate container cf82b91a7858
 ---> 63a7a5f11fde
Step 3/3 : ENV TZ Asia/Shanghai
 ---> Running in 0585992b8c1d
Removing intermediate container 0585992b8c1d
 ---> 7d740e419929

Successfully built 7d740e419929
Successfully tagged app_lagou-mysql:latest
Building micro-app-b
Step 1/9 : FROM openjdk:8-alpine3.9
 ---> a3562aa0b991
Step 2/9 : MAINTAINER dream21th Docker springboot "dream21th@dream21th.com"
 ---> Running in c1a8dd573b60
Removing intermediate container c1a8dd573b60
 ---> fb4f6ba95403
Step 3/9 : ENV TZ Asia/Shanghai
 ---> Running in 36a7408db8ec
Removing intermediate container 36a7408db8ec
 ---> 217adbd54217
Step 4/9 : ARG JAR_FILE
 ---> Running in 30a4bad5bc9b
Removing intermediate container 30a4bad5bc9b
 ---> a3397010f5bb
Step 5/9 : COPY micro-app-b.jar app.jar
 ---> 37bbf0668828
Step 6/9 : EXPOSE 9100
 ---> Running in 6e4db0b5b9cc
Removing intermediate container 6e4db0b5b9cc
 ---> 5b321d515abe
Step 7/9 : ENV JAVA_OPTS "-Xms800m -Xmx800m"
 ---> Running in a78bfa9103ec
Removing intermediate container a78bfa9103ec
 ---> aae4f5920d1e
Step 8/9 : ENV SPRING_PROFILES_ACTIVE "dev"
 ---> Running in 7808e96123dc
Removing intermediate container 7808e96123dc
 ---> 700091138d9a
Step 9/9 : ENTRYPOINT java ${JAVA_OPTS} -jar /app.jar --spring.profiles.active=${SPRING_PROFILES_ACTIVE}
 ---> Running in b691b41d06b0
Removing intermediate container b691b41d06b0
 ---> 04213956c926

Successfully built 04213956c926
Successfully tagged app_micro-app-b:latest

​ 在docker-compose.yml文件所在目录执行上面方法,镜像构建成功。

[root@localhost app]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
app_micro-app-b     latest              04213956c926        7 minutes ago       138MB
app_lagou-mysql     latest              7d740e419929        7 minutes ago       448MB

​ 执行下面指令启动容器:

[root@localhost app]# docker-compose up 
Creating dream21th-mysql ... done
Creating microAppB       ... done
Attaching to dream21th-mysql, microAppB

​ 在某些时刻可以指定docker-compose的入参:

[root@localhost app]# TAG=v1 docker-compose build

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用通俗易懂的方式讲解:2024 检索增强生成技术(RAG)研究进展

本篇内容1w字左右,稍微有点长,相对不容易理解,喜欢可以收藏、关注、点赞。 一、前言 在过去的一两年里,人工智能领域目睹了检索增强生成技术(RAG)的迅猛发展,这种技术结合了强大的语言模型与信…

百倍潜力股Aleo即将上线,布局正当时!牛市来时,你得有币!

前言 在加密货币市场,2024年被众多市场专家预测为迎来新一轮牛市的关键年份。这一预测背后,潜藏着多种可能推动牛市的因素。其中,下一次比特币(BTC)的减半事件,以及2024年 BTC 现货ETF的推出,都…

python统计分析——直方图(sns.histplot)

使用seanborn.histplot()函数绘制直方图 from matplotlib.pyplot as plt import seaborn as snsdata_setnp.array([2,3,3,4,4,4,4,5,5,6]) plt.hist(fish_data) (1)dataNone, 表示数据源。 (2)xNone, 表示直方图的分布垂直与x轴…

UG装配-爆炸图

当我们将零件装配成总成的时候,通常需要绘制爆炸图来说明总成零件组成,需要用到爆炸图命令,首先点击新建爆炸,然后为爆炸图命名 然后我们可以选择编辑爆炸或者自动爆炸: 编辑爆炸是通过手动的方式选择部件&#xff0c…

岁月匆匆,技术之光

岁月匆匆,技术之光 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客👦🏻 《java 面试题大全》 🍩惟余辈才疏学浅,临摹之作或有不妥之处,还请读者海涵指正。☕🍭 《MYSQL从入门到精…

【洛谷学习自留】p9226 糖果

解题思路: 简单的计算题,用n对k取余,如果余数为0,则输出k的值,否则输出(k-余数)的值。 代码实现: import java.util.Scanner;public class p9226 {public static void main(Strin…

2024年如何借用电商新零售破局?新型商业模式——乐享甄选竞拍模式

2024年如何借用电商新零售破局?新型商业模式——乐享甄选竞拍模式 背景:经历疫情三年的黑天鹅,消费者对未来收入预期和不自信等悲观情绪,从而使得“勒紧腰带,少消费,不消费”,以简单实用成为了新…

全栈自动化测试面试题含答案和学习路线(适合各级软件测试人员)

在面试战场上,我们需要像忍者一样灵活,像侦探一样聪明,还要像无敌铁金刚一样坚定。只有掌握了这些技巧,我们才能在面试的舞台上闪耀光芒,成为那个令HR们心动的测试人 前言: 我相信大多测试开发的或多或少经…

图像去噪——CBDNet网络训练自己数据集及推理测试,模型转ONNX模型(详细图文教程)

CBDNet 主要由两个子网络组成:噪声估计子网络和去噪子网络。噪声估计子网络用于估计图像的噪声水平,而去噪子网络用于去除图像中的噪声。 CBDNet 的优势在于: 它采用了更真实的噪声模型,既考虑了泊松-高斯模型,还考虑…

01.Typora1.7.6安装以及更换主题方法

重所周知,程序员的笔记资料有多么重要,不仅是自我提升也是加强记忆 那么一定少不了Typora这个软件 今天就来感受一下它应该如何打开正确的安装的方法。 双击文件夹以后,里面会有这样两个文件 我们双击后缀为.exe的文件 更改安装位置&#…

程序员副业之AI情侣头像(手把手超详细完整全流程)

项目介绍 小黑今天给咱们分享个轻松简单的项目,每天不会超过半小时,就是用AI制作情侣头像,在抖音上变现。听起来是不是很科幻?但实际上效果杠杠的! 最关键的是,收入方面,一单9块9,…

智能计价器Scratch-第14届蓝桥杯Scratch省赛真题第5题

5. 智能计价器(80分) 背景信息:A城市的出租车计价:3公里以内13元,基本单价每公里2.3元(超过3公里的部分,不满1公里按照1公里收费),燃油附加费每运次1元。例如:3.2公里的…

js数组循环,当前循环完成后执行下次循环

前言 上图中,点击播放icon,图中左边地球视角会按照视角列表依次执行。u3D提供了api,但是我们如何保证在循环中依次执行。即第一次执行完成后,再走第二次循环。很多人的第一思路就是promise。对,不错,出发的思路是正确的…

数据结构初阶之栈和队列(C语言版)

数据结构初阶之栈和队列(C语言版) ✍栈♈栈的结构设计♈栈的各个接口的实现👺StackInit(初始化)👺push(入栈)👺pop(出栈)👺获取栈顶元素👺获取栈中…

【LeetCode】20. 有效的括号(Deque的Stack用法)

今日学习的文章链接和视频链接 leetcode题目地址:20. 有效的括号 代码随想录题解地址:代码随想录 题目简介 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效…

ECharts 图表简单示例,中国地图

目录 ECharts官网链接: [ECharts](https://echarts.apache.org/zh/index.html)在项目中引入 Apache ECharts柱状图折线图饼图仪表盘中国地图完整示例代码 ECharts官网链接: ECharts 在项目中引入 Apache ECharts <!DOCTYPE html> <html><head><meta char…

RANSAC算法详解

给定两个点p1与p2的坐标&#xff0c;确定这两点所构成的直线&#xff0c;要求对于输入的任意点p3&#xff0c;都可以判断它是否在该直线上。初中解析几何知识告诉我们&#xff0c;判断一个点在直线上&#xff0c;只需其与直线上任意两点点斜率都相同即可。实际操作当中&#xf…

Windows10升级到Windows11 Office未激活解决方案

Windows11出了很久了&#xff0c;昨天才升级&#xff0c;今天打开Word发现激活不了&#xff0c;我的是2019的版本&#xff0c;然后发现是Windows系统的注册表的问题&#xff0c;想要找到解决方案还不简单&#xff0c;所以记录一下。 解决方案&#xff1a; Win r打开输入rege…

7个Pandas绘图函数助力数据可视化

大家好&#xff0c;在使用Pandas分析数据时&#xff0c;会使用Pandas函数来过滤和转换列&#xff0c;连接多个数据帧中的数据等操作。但是&#xff0c;生成图表将数据在数据帧中可视化&#xff0c;通常比仅仅查看数字更有帮助。 Pandas具有几个绘图函数&#xff0c;可以使用它…

MINCO+汽车

规划典型的解决方法: 如何准确的描述他的动力学,实际上是对这个物理对象进行建模.(规划等于开环的控制,控制等于闭环的规划),规划系统要做到是假设已知系统模型的情况下去计算一些可能会影响比较好的 未来运动的指令,做未来运动轨迹的推演.对自己建模的情况下还需对环境有个比较…