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.rhkb.cn/news/233516.html

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

相关文章

Linux下QT生成的(.o)、(.a)、(.so)、(.so.1)、(.so.1.0)、(.so.1.0.0)之间的区别

记录一下遇到的问题:Linux系统下Qt编译第三方动态库会生成多个.so文件,不了解的小伙伴可能很疑惑: (1)Linux 下 QT 生成的(.o)、(.a)和(.so)三个文…

图像分割-Grabcut法

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 本文的C#版本请访问:图像分割-Grabcut法(C#)-CSDN博客 GrabCut是一种基于图像分割的技术,它可以用于将图像…

客服系统接入FastGPT

接入FastGPT 点击【应用】【外部使用】【API访问】【新建】新建一个KEY,同时也可以看到我们的API根地址 这个根地址和Key可以填入任何支持OpenAI接口的应用里,这个接口是兼容OpenAI格式。 在客服系统【知识库AI配置】里填上接口地址和接口密钥。这样我…

MATLAB指令

01--根据数学公式进行绘制 1.绘制连续函数 ①一元函数 t0:0.1:10; y3*t2; plot(t,y) ②一元二次函数 t0:0.1:10; yt.*t; plot(t,y) 注意此处应为点乘 ③一元3次 t0:0.1:10; yt.*t.*t; plot(t,y) ④y1/t t0:0.1:10; y1./t; plot(t,y) ⑤yexp(t) t0:0.1:10; yexp(2*t); p…

Java如何拷贝数据?

Java如何拷贝数据? 在 Java 中,数组和集合的深拷贝与浅拷贝的概念与复制对象的引用和内容相关。深拷贝是创建一个新对象,并递归地复制其所有内容,而浅拷贝则只是复制对象的引用。 数组的深拷贝与浅拷贝: 1. 深拷贝数…

大模型第三节课程笔记

大模型开发范式 优点:具有强大语言理解,指令跟随,和语言生成的能力,具有强大的知识储备和一定的逻辑推理能力,进而能作为基座模型,支持多元应用。 不足:大模型的知识时效性受限,大模…

每日算法打卡:数的三次方根 day 7

文章目录 原题链接题目描述输入格式输出格式数据范围输入样例:输出样例: 题目分析示例代码 原题链接 790. 数的三次方根 题目难度:简单 题目描述 给定一个浮点数 n,求它的三次方根。 输入格式 共一行,包含一个浮…

matlab使用PhysioNet的WFDB工具箱

目录 PhysioNet 官方安装示例 PhysioNet 官方 官方的文档:Waveform Database Software Package (WFDB) for MATLAB and Octave 简介:用于MATLAB的WFDB工具箱是用于读取、写入和操作(处理)PhysioNet数据的MATLAB函数的集合&#x…

SpringBoot—支付—支付宝

一、流程 二、沙箱操作 1.用支付宝账号登录【开放控制平台】创建应用获取 appid 2.选择沙箱模拟环境 3.沙箱应用-》获取appid(一个appid绑定一个收款支付宝账户) 4.利用开发助手工具生成RSA2密钥 公钥:传给支付宝平台 私钥:配置代码中,…

ShardingSphere-JDBC学习笔记

引言 开源产品的小故事 Sharding-JDBC是2015年开源的,早期的定位就是一个分布式数据库的中间件,而在它之前有一个MyCat的产品。MyCat也是从阿里开源出来的,作为分库分表的代名词火了很长一段时间,而MyCat早年的目标就是想进入ap…

小白入门基础 - tomcat

一:前言 Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为&#x…

分布式【zookeeper面试题23连问】

1. ZooKeeper是什么? ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终&#x…

Spring Boot 完善订单【五】集成接入支付宝沙箱支付

1.1.什么是沙箱支付 支付宝沙箱支付(Alipay Sandbox Payment)是支付宝提供的一个模拟支付环境,用于开发和测试支付宝支付功能的开发者工具。在真实的支付宝环境中进行支付开发和测试可能涉及真实资金和真实用户账户,而沙箱环境则提…

【C++】STL 算法 ⑥ ( 二元谓词 | std::sort 算法简介 | 为 std::sort 算法设置 二元谓词 排序规则 )

文章目录 一、二元谓词1、二元谓词简介2、 std::sort 算法简介3、 代码示例 - 为 std::sort 算法设置 二元谓词 排序规则 一、二元谓词 1、二元谓词简介 " 谓词 ( Predicate ) " 是一个 返回 布尔 bool 类型值 的 函数对象 / 仿函数 或 Lambda 表达式 / 普通函数 , …

安全数据交换系统:有效提升网间文件交换能力

各级政府部门和金融、能源、电力这些行业,以及一些大中型企业组织,为了保护内部的重要数据不外泄,普遍都采用了多网络并行的方式,也是做了网络隔离划分,不同的网络拥有不同的密级以及人员权限。然后再通过安全数据交换…

java中使用redis

1、redis数据类型 1.1、5种数据类型 redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型:字符串 string、哈希 hash、列表 list、集合 set、有序集合 sorted set / zset。 字符串(string):普通字符…

Day1Qt

1、实现登录窗口界面 头文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QIcon>//图标 #include <QLabel>//标签类 #include <QMovie>//动态类 #include <QLineEdit>//行编辑类 #include <QPushButton>…

promethues grafana 安装和使用

文章目录 1、promethues安装2、node-exporter安装3、grafana安装4、配置promethues监控node节点5、grafana操作外传 Docker 镜像下载地址&#xff1a; https://hub.docker.com 比较好的hub.docker.com///-- https://hub.docker.com/u/bitnami grafana监控面板&#xff1a;https…

电子学会C/C++编程等级考试2023年12月(三级)真题解析

C/C++编程(1~8级)全部真题・点这里 第1题:因子问题 任给两个正整数N、M,求一个最小的正整数a,使得a和(M-a)都是N的因子。 时间限制:10000 内存限制:65536 输入 包括两个整数N、M。N不超过1,000,000。 输出 输出一个整数a,表示结果。如果某个案例中满足条件的正整数不存…

使用Python+selenium3.0实现第一个自动化测试脚本

这篇文章主要介绍了使用Pythonselenium实现第一个自动化测试脚本&#xff0c;文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值&#xff0c;需要的朋友们下面随着小编来一起学习学习吧 最近在学web自动化&#xff0c;记录一下学习过程。…