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: ./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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入了解Pytest中的Mocking:简化测试,避免依赖问题!

在软件开发中,测试是确保代码质量的关键步骤之一。而在测试中,经常需要模拟(Mock)一些对象或函数,以确保测试的独立性和可靠性。在Pytest中,Mocking是一个强大的工具,能够简化测试过程&#xff…

【Docker】部署mysql 和 tomcat

目录 部署MySQL 1.搜索镜像 2. 拉取镜像 部署Tomcat 1. 搜索镜像 2.拉取镜像 3.查看镜像 部署MySQL 1.搜索镜像 docker search mysql 2. 拉取镜像 通过mysql 镜像创建对应的容器,并设置端口映射,目录映射 创建mysql 的目录 docker run -id \ …

【PostgreSQL】在DBeaver中实现序列、函数、视图、触发器设计

【PostgreSQL】在DBeaver中实现序列、函数、触发器、视图设计 基本配置一、序列1.1、序列使用1.1.1、设置字段为主键,数据类型默认整型1.1.2、自定义序列,数据类型自定义 1.2、序列延申1.2.1、理论1.2.2、测试1.2.3、小结 二、函数2.1、SQL直接创建2.1.1…

20240108移远的4G模块EC20在Firefly的AIO-3399J开发板的Android11下调通的步骤

20240108移远的4G模块EC20在Firefly的AIO-3399J开发板的Android11下调通的步骤 2024/1/8 17:50 缘起:使用友善之臂的Android11可以让EC20上网,但是同样的修改步骤,Toybrick的Android11不能让EC20上网。最后确认是selinux的问题! …

DDIM学习笔记

写在前面: (1)建议看这篇论文之前,可先看我写的前一篇论文: DDPM推导笔记-大白话推导 主要学习和参考了以下文章: (1)一文带你看懂DDPM和DDIM (2)关于 DDIM …

如何优雅的搭建一个轻量化的网站

本地网页 这里我找到了一个带有简单的悬停变色效果的个人博客网站模板。用来演示这次的轻量化网站搭建。你可以复制这段代码到一个txt文件中,修改文件后缀名为html即可得到一个最简单的静态网页文件。在没有搭建网站服务器时,本机可以通过直接双击该文件…

设计模式的艺术P1基础—2.3 类之间的关系

设计模式的艺术P1基础—2.3 类之间的关系 在软件系统中,类并不是孤立存在的,类与类之间存在各种关系。对于不同类型的关系,UML提供了不同的表示方式 1.关联关系 关联(Association)关系是类与类之间最常用…

AR眼镜定制_ar智能眼镜5G硬件解决方案

AR眼镜近年来备受瞩目,其易于佩戴、轻巧耐用、功能强大、用途广泛的特点受到了广泛关注。 AR眼镜的应用场景非常广泛,不仅包括消费级市场,还涵盖了旅游、教育、工业、医疗等多个领域。新的工业AR穿戴技术以及工业级语音交互操作系统&#xff…

BigDecimal的性能问题

BigDecimal 是 Java 中用于精确计算的数字类,它可以处理任意精度的小数运算。由于其精确性和灵活性,BigDecimal 在某些场景下可能会带来性能问题。 BigDecimal的性能问题 BigDecimal的性能问题主要源于以下几点: 内存占用:BigDec…

Opencv实验合集——实验八:相机校准

1.定义 首先,我们来理解一下怎么从相机的角度去看一张图片,就好比如你用眼睛作为相机来进行摄影,但是比摄影机强的是,你是怎么摄影图片之后再将它矫正出现在你眼前,将歪歪扭扭的图片变成一张在你眼前是一张直的图片 为…

scala 安装和创建项目

Scala,一种可随您扩展的编程语言:从小型脚本到大型多平台应用程序。Scala不是Java的扩展,但它完全可以与Java互操作。在编译时,Scala文件将转换为Java字节码并在JVM(Java虚拟机)上运行。Scala被设计成面向对…

excel中相同类型的数据归到一起显示

1.选中所有数据 2.开始菜单-排序和筛选-自定义排序 3.选择分类关键字 此处,以属性为例 4.效果 归类后的数据:

已解决 | Go Error: redeclared as imported package name 问题

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通Golang》…

【MIT 6.S081】2020, 实验记录(2),Lab: System calls

目录 TaskTask 1: System call tracing1.1 task 说明1.2 实现过程1.3 测试 这个实验尝试自己在 OS kernel 中添加 system call。 Task Task 1: System call tracing 1.1 task 说明 这个 task 实现在 kernel 中添加一个 trace 的系统调用,当用户调用这个系统调用…

大模型学习

大模型的参数量和显存占用估算 现在业界的大语言模型都是基于transformer模型的,模型结构主要有两大类:encoder-decoder(代表模型是T5)和decoder-only,具体的,decoder-only结构又可以分为Causal LM&#x…

【Linux Shell】10. 函数

文章目录 【 1. 函数的定义 】【 2. 函数参数 】 【 1. 函数的定义 】 所有函数在使用前必须定义 。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。 调用函数仅使用其函数名即可 。 函数返回值在调用该函数后通过 $? 来…

一文搞定JMM核心原理

公众号《鲁大猿》,寻精品资料,帮你构建Java全栈知识体系 www.jiagoujishu.cn (架构技术.cn) JMM引入 从堆栈说起 JVM内部使用的Java内存模型在线程栈和堆之间划分内存。 此图从逻辑角度说明了Java内存模型: # 堆栈里…

消除代码冗长神器 - Lombok | @EqualsAndHashCode/@ToString注解详解

🤷 场景 Java 中所有对象的父类都是 Object 类,而 Object 类中会有默认的 equals/hashCode/toString 方法,但是有时候,这些方法需要子类去 Override。 😎 IDE 解决方案 很多 IDE 中内置了生成 equals、hashCode、toString 的功能,下面以 IDEA 为例。在类中,按 Alt …

[Kubernetes]5. k8s集群StatefulSet详解,以及数据持久化(SC PV PVC)

前面通过deployment结合service来部署无状态的应用,下面来讲解通过satefulSet结合service来部署有状态的应用 一.StatefulSet详解 1.有状态和无状态区别 无状态: 无状态(stateless)、牲畜(cattle)、无名(nameless)、可丢弃(disposable) 有状态: 有状态(stateful)、宠物(pet)…

系列九、Feign

一、Feign 1.1、Java中如何实现跨接口调用 (1) Httpclient Httpclient是Apache Jakarta Comon下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议的最新版本和建议。HttpC…