Docker基础系列之DockerFile

news2024/11/26 12:16:22

Docker基础系列之Dockerfile

文章目录

  • Docker基础系列之Dockerfile
    • 1. Dockerfile是什么?
      • 1.1 Dockerfile概述
      • 1.2 构建三步骤
    • 2. Dockerfile构建过程解析
      • 2.1 Dockerfile内容基础知识
      • 2.2 执行Dockerfile的大致流程
    • 3. DockerFile体系结构(保留字指令)
    • 4. 案例
      • 4.1 首先创建一个sprigboot项目
      • 4.2 创建 Dockerfile文件
      • 4.3 构建镜像,也可以把构建镜像的命令编写成脚本
      • 4.4 实例化容器
    • 5. 参考和感谢

1. Dockerfile是什么?

1.1 Dockerfile概述

Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。

1.2 构建三步骤

  • 编写Dockerfile文件
  • 构建镜像docker build
  • 实例化容器docker run

2. Dockerfile构建过程解析

2.1 Dockerfile内容基础知识

  • 1:每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  • 2:指令按照从上到下,顺序执行
  • 3:#表示注释
  • 4:每条指令都会创建一个新的镜像层,并对镜像进行提交

2.2 执行Dockerfile的大致流程

  • (1)docker从基础镜像运行一个容器
  • (2)执行一条指令并对容器作出修改
  • (3)执行类似docker commit的操作提交一个新的镜像层
  • (4)docker再基于刚提交的镜像运行一个新容器
  • (5)执行dockerfile中的下一条指令直到所有指令都执行完成

3. DockerFile体系结构(保留字指令)

以下是常用的 Dockerfile 关键字的完整列表和说明:

关键字说明
FROM基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER镜像维护者的姓名和邮箱地址
RUN在镜像内部执行命令,用于安装软件包、设置环境等
EXPOSE当前容器对外暴露出的端口
ENV设置环境变量
ADD将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY类似ADD,拷贝文件和目录到镜像中。 COPY src dest COPY ["src", "dest"]
ENTRYPOINT指定容器启动时要运行的命令,不会被 Docker run 命令覆盖
CMD指定容器启动时要运行的命令,可以被 Docker run 命令覆盖
VOLUME声明容器挂载的文件卷
USER指定运行镜像的用户和用户组
WORKDIR设置工作目录,后续命令将在该目录下执行
ARG定义构建时的参数。
ONBUILD在当前镜像被用作其他镜像的基础镜像时执行一些命令,通常用于构建通用的基础镜像
STOPSIGNAL指定容器停止时发送的信号
HEALTHCHECK指定容器健康检查命令,判断容器是否存活并运行
SHELL定义默认的 shell,或者在 RUN 指令中覆盖默认 shell

4. 案例

使用docker容器部署一个springboot项目

4.1 首先创建一个sprigboot项目

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.xmc</groupId>
    <artifactId>spring-boot-hello-world</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-boot-hello-world</name>
    <description>spring-boot-hello-world</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.9</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

application.yml

server:
  port: 8080

启动类

package com.xmc.hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @author xiaomuchong
 */
@SpringBootApplication
public class SpringBootHelloWorldApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootHelloWorldApplication.class, args);
    }

}

定义一个测试接口

package com.xmc.hello.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author xiaomuchong
 */
@RequestMapping("test")
@RestController
public class HelloWorldController {

    @GetMapping("hello")
    public String  sayHello() {
        return "Hello Dockerfile ######";
    }
}

验证这个springboot项目正确之后,打包spring-boot-hello-world-0.0.1-SNAPSHOT.jar

4.2 创建 Dockerfile文件

vim Dockerfile

#指定基镜像
FROM openjdk:latest
#指定数据卷
VOLUME ["/tmp"]
#作者
MAINTAINER 小木虫 <1750xxxx@qq.com>

#添加项目
COPY *.jar /usr/local/app/app.jar

#定义时区参数
ENV WORK_DIR = /usr/local/app


#修改这个文件的访问时间为当前时间
RUN sh -c 'touch /app.jar'

# 工作目录(docker内部目录)
WORKDIR $WORK_DIR

#暴露端口
EXPOSE 8080
#指定执行启动项目
ENTRYPOINT ["java","-jar","/usr/local/app/app.jar"]

4.3 构建镜像,也可以把构建镜像的命令编写成脚本

vim docker.build.sh

#!/bin/bash

docker build --rm -t springboot-dockerfile-image:1.0 .

构建镜像

//赋予执行权限
chmod +x docker.build.sh
//执行
./docker.build.sh

构建过程日志

[root@Docker110 dockerfile]# ./docker.build.sh 
[+] Building 2.3s (9/9) FINISHED                                                          docker:default
 => [internal] load .dockerignore                                                                   0.0s
 => => transferring context: 2B                                                                     0.0s
 => [internal] load build definition from Dockerfile                                                0.0s
 => => transferring dockerfile: 573B                                                                0.0s
 => [internal] load metadata for docker.io/library/openjdk:latest                                   0.0s
 => [internal] load build context                                                                   0.3s
 => => transferring context: 20.05MB                                                                0.2s
 => [1/4] FROM docker.io/library/openjdk:latest                                                     0.1s
 => [2/4] COPY *.jar /usr/local/app/app.jar                                                         0.1s
 => [3/4] RUN sh -c 'touch /app.jar'                                                                1.4s
 => [4/4] WORKDIR = /usr/local/app                                                                  0.0s
 => exporting to image                                                                              0.3s
 => => exporting layers                                                                             0.3s
 => => writing image sha256:a8ae4d1222bad9a074e8ac165728910eeda46bd9e938e297ec9e81e958f582d9        0.0s
 => => naming to docker.io/library/springboot-dockerfile-image:1.0                                  0.0s

4.4 实例化容器

vim docker.run.sh

docker run -d \
-p 8088:8080 \
--name=springboot-dockerfile-docker \
springboot-dockerfile-image:1.0

创建容器并运行

//赋予执行权限
chmod +x docker.run.sh
//执行
./docker.run.sh

查看容器

通过接口验证

http://192.168.10.110:8088/test/hello

服务器部署截图

5. 参考和感谢

尚硅谷阳哥Docker课程

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

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

相关文章

BUUCTF-MISC-[GUET-CTF2019]soul sipse1

题目链接&#xff1a;BUUCTF在线评测 (buuoj.cn) 下载附件是一个音频文件&#xff0c;使用au打开没有什么发现 试试kali中的steghide steghide extract -sf /root/桌面/out.wav 无密码分离出download.txt 打开txt文件发现是个网址&#xff0c;访问看看 下载后使用binwalk查看照…

同态加密+区块链,在大健康数据隐私保护中的应用

PrimiHub一款由密码学专家团队打造的开源隐私计算平台&#xff0c;专注于分享数据安全、密码学、联邦学习、同态加密等隐私计算领域的技术和内容。 近几年&#xff0c;越来越多的隐私计算技术被用于解决临床和研究数据共享中的隐私和安全问题。 当然&#xff0c;对这些技术的法…

Android 14后台服务永久保活的技术方法

Android 14后台服务永久保活的技术方法 在本篇博客中&#xff0c;我们将探讨如何创建一个在Android系统中不会被杀死的后台服务。 第一步&#xff1a;创建一个后台服务。 在这一步中&#xff0c;我们需要创建一个后台服务的代码。 第二步&#xff1a;在AndroidManifest.xml中…

HDFS简介与部署以及故障排错(超简单)

文章目录 一、HDFS介绍1、简介2、结构模型3、文件写入过程4、文件读取过程5、文件块的存放6、存储空间管理机制6.1 文件删除和恢复删除6.2 复制因子配置6.3 文件命名空间6.4 数据复制机制 二、环境搭建&#xff08;单机版&#xff09;1、修改主机名2、配置ssh免密登录3、Hadoop…

串的匹配算法——KMP算法

目录 一.特点 二.算法思想 三.公式证明 四.next数组及其练习 五.找规律计算next[k] 六.代码实现 一.特点 BF算法的特点是i回退&#xff0c;KMP算法的最大特点是i不回退&#xff0c;由于i不回退&#xff0c;所以KMP算法的时间复杂度是O(nm)。 二.算法思想 在匹配主串和子…

Ubuntu 22.04修改静态ip

1. 备份原网络配置文件 # 配置文件名称因机器设置有异 cd /etc/netplan cp 01-network-config.yaml 01-network-config.yaml.bak# 文件内容如下 network:version: 2renderer: NetworkManager2. 修改配置文件 使用 ipconfig 命令查看网络信息&#xff0c;ip addr 命令也可 我这…

day52(vueJS)json-server模拟数据

json-server介绍&#xff1a;&#xff1a;&#xff1a;JSON Server 是一个用于快速搭建 REST API 的工具&#xff0c;它可以帮助我们在开发过程中快速模拟 一个后端 API 服务器&#xff0c;方便前端开发人员进行接口调试和开发。使用 JSON Server&#xff0c;你可以通过创建一个…

【Vue】VueX仓库

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;Vue ⛺️稳中求进&#xff0c;晒太阳 目录 Vue概述 是什么 场景&#xff1a; 优势 构建多组件共享环境 创建一个空仓库 核心概念 - state 状态 1. 提供数据 2.使用数据 ​编辑 …

在虚拟机vm下的Linux系统下 安装redis 超详细

打开Linux后 右键打开终端 1.输入:su root 登录root 密码是123456 2.然后输入:yum -y install gcc-c 安装gcc基础依赖包 3.yum -y install centos-release-scl 4.yum -y install devtoolset-9-gcc devtoolset-9-gcc-c devtoolset-9-binutils //为了编译最新版本的Redis源码 用…

纯手工搭建一个springboot maven项目

前言&#xff1a;idea社区版无法自动搭建项目&#xff0c;手动搭建的经验分析如下&#xff1a; 1 包结构 参考下图&#xff1a; 2 项目结构 3 maven依赖 具体的项目如图&#xff1a; 依据这个结构配置一个springboot 的 pom依赖&#xff1a; <?xml version"1.0…

SanctuaryAI推出Phoenix: 专为工作而设计的人形通用机器人

文章目录 1. Company2. Main2.1 关于凤凰™ (Phoenix)2.2 关于碳™(Carbon)2.3 商业化部署2.4 关于 Sanctuary Corporation 3. My thoughtsReference彩蛋&#xff1a;将手机变为桌面小机器人 唯一入选《时代》杂志 2023 年最佳发明的通用机器人。 称机器人自主做家务的速度和灵…

js SheetJS 合并表格导出到同一个excel中

最近有个需求,我在一个页面显示了4个表格, 然后合并导出到excel文件中 四个表,四个sheet,一个excel文件 最后导出时这样: 实现: 1,页面有个导出的checkbox,勾选则导出,不勾选不处理 2,在一个函数中,集中处理四个表数据获取,并将结果返回出来 //获取数据后返回为…

【C++】递归 1241 - 角谷猜想 1108 - 正整数N转换成一个二进制数

文章目录 一、问题&#xff1a;1241 - 角谷猜想二、问题&#xff1a;1108 - 正整数N转换成一个二进制数三、总结四、感谢 一、问题&#xff1a;1241 - 角谷猜想 类型&#xff1a;有规律的循环、递归。 题目描述&#xff1a; 日本一位中学生发现一个奇妙的定理&#xff0c;请角…

如何判断可编程电子负载是否合格?

可编程电子负载是一种可以模拟实际负载的电子设备&#xff0c;广泛应用于电源、电池、充电器等产品的测试和研发。判断可编程电子负载是否合格&#xff0c;需要从以下几个方面进行考量&#xff1a; 精度是衡量电子负载性能的重要指标&#xff0c;包括电流精度、电压精度、功率精…

ImportError: Could not import docarray python package解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

Qt 使用QListView实现简约美观的聊天窗口

今天和大家分享一个使用QListView来展现聊天窗口的历史记录的例子, 因为聊天记录可能会有很多, 所以使用试图-模型的方式更加合理 这是最终效果: ChatHistoryModel继承自QAbstractListModel , ChatHistoryViewDelegate继承自QStyledItemDelegate, 这个例子最关键的就是在QSty…

Keil MDK安装armcc V5编译器

不知道从什么时候开始&#xff0c;Keil MDK默认不支持V5的编译器了&#xff0c;里面默认只有V6的编译器&#xff0c;设置界面跟V5有很大的差异不太熟悉。最可怕的是&#xff0c;之前使用V5编译的工程&#xff0c;换成V6编译器后居然报错...虽然修改一下应该也可以正常编译&…

几种常用的查看Ros话题的命令

1、查看 rqt_tf_tree rosrun rqt_tf_tree rqt_tf_tree 2、查看ros node 关系 rqt_graph 3、列出所有话题 rostopic list 4、查看某一话题的类型 以 /scan 为例 rostopic type /scan 5、查看某个数据类型包含哪些数据 rosmsg show sensor_msgs/LaserScan sensor_…

Gitlab修改仓库权限为public、Internal、Private

Public&#xff08;公开&#xff09;&#xff1a;所有人都可以访问该仓库&#xff1b; Internal&#xff08;内部&#xff09;&#xff1a;同一个GitLab群组或实例内的所有用户都可以访问该仓库&#xff1b; Private&#xff08;私人&#xff09;&#xff1a;仅包括指定成员的用…

2024年最新《国际预警期刊》正式更新!

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、国际期刊预警名单的变化&#xff1f;二、课程案例展示&#xff08;篇幅有限仅展示部分&#xff09;1.【热图系列】2.【九象限图系列】3.【富集分析系列】4.【机…