Dockerfile基本结构及编写详解

文章目录

  • 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: ./mysqlenvironment:MYSQL_ROOT_PASSWORD: adminrestart: alwayscontainer_name: dream21th-mysqlvolumes:- /data/mysql/data:/var/lib/mysqlports:- 3306:3306networks:dream21th-net:micro-app-b:build:context: ./microappbenvironment:- "SPRING_PROFILES_ACTIVE=uat"restart: alwayscontainer_name: microAppBvolumes:- /data/micro-app-b/log:/home/ops/app/micro-app-b/logports:- 9100:9100networks: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---> 7d740e419929Successfully 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---> 04213956c926Successfully 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.mzph.cn/news/606216.shtml

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

相关文章

汽车雷达:实时SAR成像的实现

摘要: 众所周知,点云成像是目前实现汽车雷达感知最流行的方案,尤其是采用多级联实现的4D点云成像雷达,这是目前最有希望实现产品落地的技术方案之一。 今天重点分享关于汽车雷达SAR成像相关技术内容,这也证实了4D点云成像雷达并不一定就是汽车雷达成像唯一的方案,在业内…

CompletableFuture超详解与实践

0.背景 一个接口可能需要调用 N 个其他服务的接口,这在项目开发中还是挺常见的。举个例子:用户请求获取订单信息,可能需要调用用户信息、商品详情、物流信息、商品推荐等接口,最后再汇总数据统一返回。 如果是串行(按…

前端如何结合数据库查看本地头像文件,配置静态资源

由于oss过期了,项目中又需要一个上传头像功能,于是研究了一下上传文件至本地,用java将文件存储到本地的代码好写,但是如何利用前端Vue把我难住了,因为之前存在OSS服务器直接查看就可以了,于是记录本文。 后…

数据结构-测试4

一、判断题 1.队列结构的顺序存储会产生假溢出现象。 (T) 2.度为二的树就是二叉树。(F) 二叉树的度可以小于等于2 3. 栈是插入和删除只能在一端进行的线性表;队列是插入在一端进行,删除在另一端进行的线性表。(T&…

C++模板——(2)函数模板的声明和使用

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝 勤奋,机会,&am…

Linux文件系统与日志管理

目录 一、Linux文件系统 1、inode 与 block 详解 1.1 inode 和 block 概述 1.2 inode表的内容 1.3 查看文件的inode号码 1.4 模拟innode号耗尽故障处理 2、访问文件的流程 3、文件恢复 3.1 恢复误删除的ext3格式文件 3.2 恢复误删除的 xfs 格式文件 二、Linux日志…

《BackTrader量化交易图解》第8章:plot 绘制金融图

文章目录 8. plot 绘制金融图8.1 金融分析曲线8.2 多曲线金融指标8.3 Observers 观测子模块8.4 plot 绘图函数的常用参数8.5 买卖点符号和色彩风格 8. plot 绘制金融图 8.1 金融分析曲线 BackTrader内置的plot绘图函数, 通过style参数变量控制不同风格的K线图&…

因为热Key和大Key,Redis终于被压崩了

大家好,我是洋子,今天分享一下在做压测时遇到的很有意思的性能问题以及对应的排查解决方案。这个性能问题的现象为,Redis线上实例不可用,Redis读写均超时 性能问题排查过程 先来看一下问题代码(Go语言实现&#xff0…

【CMake】1. VSCode 开发环境安装与运行

CMake 示例工程代码 https://github.com/LABELNET/cmake-simple 插件 使用 VSCode 开发C项目,安装 CMake 插件 CMakeCMake ToolsCMake Language Support (建议,语法提示) 1. 配置 CMake Language Support , Windows 配置 donet 环境 这…

RT-Thread: 基于STM32CubeMX配置驱STM32驱动的USB虚拟串口调试

关键词:USB 虚拟串口 USB虚拟串口,RT-Thread Studio,STM32 说明: 1:文档记录 STM32F103系列基于 RT-Thread 系统的 USB虚拟串口的开启及数据收发应用流程介绍。 2:本文以STM32F103C8T6型号做测试&#x…

计算机基础面试题 |16.精选计算机基础面试题

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

Win10电脑关闭OneDrive自动同步的方法

在Win10电脑操作过程中,用户想要关闭OneDrive的自动同步功能,但不知道具体要怎么操作?首先用户需要打开OneDrive,然后点击关闭默认情况下将文档保存到OneDrive选项保存,最后关闭在这台电脑上同步设置保存就好了。接下来…

TypeScript 从入门到进阶之基础篇(九) Class类篇

系列文章目录 TypeScript 从入门到进阶系列 TypeScript 从入门到进阶之基础篇(一) ts基础类型篇TypeScript 从入门到进阶之基础篇(二) ts进阶类型篇TypeScript 从入门到进阶之基础篇(三) 元组类型篇TypeScript 从入门到进阶之基础篇(四) symbol类型篇TypeScript 从入门到进阶…

OCP NVME SSD规范解读-5.命令超时限制-2

Sanitize清除的数据很彻底,对FTL映射表、User Data(包括已经写入NAND和仍在cache里的)、Meta Data、安全密匙、CMB中SQ/CQ相关信息、可能含有用户数据的log等等会全部清除。不过,sanitize操作不会改变RPMB、boot分区、不包含用户数据的cache等内容。 RP…

总420+,专业120+南京大学851信号与系统电子信息考研经验通信,电子信息

今年考研数学130,专业课120,总分420顺利被南京大学电通录取,梦圆南大,这一年的复习有过迷茫,有过犹豫,最后都坚持过来了,总结一下自己的复习经验,希望对大家有所帮助。数学 5-8月数…

HarmonyOS应用开发之ArkTS语言学习记录

1、ArkTS介绍 ArkTS是鸿蒙生态的应用开发语言。它在保持TypeScript(简称TS)基本语法风格的基础上,对TS的动态类型特性施加更严格的约束,引入静态类型。同时,提供了声明式UI、状态管理等相应的能力,让开发者…

76.乐理基础-打拍子-二连音、四连音

内容来源于:三分钟音乐社 上一个内容:八三、八六拍的三角形打法-CSDN博客 这里要先理解了三连音的知识。 关于多少连音的总方针,其实就是两句话,如下图中的内容:二连音与四连音实际上就是下图中第二句话里的第一部分…

mmdetection训练自己的数据集

mmdetection训练自己的数据集 这里写目录标题 mmdetection训练自己的数据集一: 环境搭建二:数据集格式转换(yolo转coco格式)yolo数据集格式coco数据集格式yolo转coco数据集格式yolo转coco数据集格式的代码 三: 训练dataset数据文件配置config…

高防ip适合防御网站和游戏类的攻击吗?

​  作为站长,要学会并承受得住网站外来攻击的压力,尤其是所属为 DDoS 攻击高发行业的网站类业务及游戏行业,是很容易被竞争对手或者一些伪黑客爱好者盯上的。 加上,有些站长并没有提前了解,就盲目进军了这两个行业&…

C语言算法(二分查找、文件读写)

二分查找 前提条件&#xff1a;数据有序&#xff0c;随机访问 #include <stdio.h>int binary_search(int arr[],int n,int key);int main(void) {}int search(int arr[],int left,int right,int key) {//边界条件if(left > right) return -1;//int mid (left righ…