Docker-制作镜像

news2024/9/22 5:36:46

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、操作系统的组成
    • (一)bootfs
    • (二)rootfs
    • (三)Liunx操作系统的启动过程
      • (1)引导阶段:
      • (2)根文件系统挂载:
    • (四)Liunx发行版的区别
  • 二、Docker镜像原理
    • (一)Liunx系统与Docker容器比较
      • (1)系统文件结构比较
      • (2)系统版本信息比较
  • 三、DockerFile
    • (一)DockerFile 概念
    • (二)DockerFile 指令
      • (1)FROM指令
      • (2)LABEL指令
      • (3)RUN指令
      • (4)CMD 指令
      • (5)ENTRYPOINT指令
      • (6)COPY指令
      • (7)ADD指令
      • (8)WORKDIR指令
      • (9)VOLUME指令
      • (10)EXPOSE指令
      • (11)ENV指令
      • (12)ARG指令
      • (13)USER指令
      • (14)ONBUILD指令
      • (15)STOPSIGNAL指令
      • (16)HEALTHCHECK指令
      • (17)SHELL指令
  • 四、DockerFile 制作镜像
    • (一)编写DockerFile文件
    • (二)Jenkisn拉取拉取
    • (三)制作服务镜像
      • (1)进入到 hm-service 这个服务目录下
      • (2)制作镜像
      • (3)启动容器
      • (4)浏览器访问
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:

在使用 docker 制作镜像之前,我们需要学会docker 安装、基本概念,以及 docker 基础命令的使用,然后再开始制作自己的镜像文件。学习制作镜像,还要从基本概念出发,直到镜像制作成功为止。


提示:以下是本篇文章正文内容,下面案例可供参考

一、操作系统的组成

进程子系统
进程通信子系统
内存管理系统
设备管理系统
文件管理系统
网络通信子系统
作业控制子系统

Liunx操作系统由 bootfs 和 rootfs 两部分组成

在实际的 Linux 系统中:

bootfs 通常是一个单独的分区(例如 /dev/sda1),挂载点为 /boot。这个分区专门存放启动所需的文件。

rootfs 是主文件系统,通常挂载在根目录 / 下。它包含了系统的所有文件和目录。

(一)bootfs

bootfs(Boot Filesystem 启动文件系统)
定义: bootfs 是系统用来存放引导相关文件的文件系统。这些文件通常包括内核映像、引导加载程序(如 GRUB)、初始 RAM 磁盘(initrd/initramfs)等。
功能: 这个文件系统的作用是在系统启动过程中,提供启动加载器和必要的内核文件。它确保在计算机启动时可以正确地加载和执行操作系统的内核。

(二)rootfs

rootfs(Root Filesystem 根文件系统)
定义: rootfs 是系统的根文件系统,挂载在系统的根目录 / 上。它包含了操作系统所需的所有文件和目录,包括用户文件、系统库、配置文件等。
功能: 在启动过程完成后,rootfs 成为系统的主文件系统,支持操作系统的正常运行。它存储了系统的主要内容,如 /bin、/etc、/usr 等目录。

(三)Liunx操作系统的启动过程

(1)引导阶段:

当计算机启动时,BIOS 或 UEFI 固件会加载引导加载程序(bootloader),这个引导加载程序通常位于 bootfs 中。
引导加载程序读取内核映像和初始 RAM 磁盘,这些文件也在 bootfs 中。

(2)根文件系统挂载:

内核开始启动操作系统时,它会加载 rootfs,并将其挂载为系统的根文件系统(/)。
一旦 rootfs 被挂载,系统就进入正常的运行状态,所有的用户操作和应用程序都在 rootfs 上进行

(四)Liunx发行版的区别

Liunx的发行版有很多,比如:Ubuntu、RedHat、CentOS、Debian、Fedora、SuSE、OpenSUSE、Arch Linux、SolusOS 等
不同Liunx的发行版,bootfs基本一样的,而不同的发行版区别在于rootfs不同

二、Docker镜像原理

Docker镜像是由特殊的文件系统叠加而成,最底端是 bootfs,并使用宿主机的bootfs,第二层是 root文件系统rootfs,称为base image ,然后再往上可以叠加其他的镜像文件。

使用统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。

一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础镜像

当从一个镜像被创建成容器并启动时,Docker会在最顶层加载一个读写文件系统作为容器, docker的本质就是一个分层文件系统 。

下面我们在虚拟机上查看Liunx操作系统 和 docker 容器关系

(一)Liunx系统与Docker容器比较

(1)系统文件结构比较

a. 在Liunx操作系统中,进入 /root 目录 ,查看系统文件目录

cd /
ll

在这里插入图片描述
b.进入 mysql容器内部

docker exec -it mysql /bin/bash
ls -l

在这里插入图片描述
c.进入 nacos 容器内部

docker exec -it nacos /bin/bash
ls -l

在这里插入图片描述

从 a(CentOS系统),b(MySQL容器)到 c(nacos容器)我们可以看到文件结构都是如此相似,说明 dokcer 启动的容器就是,在我们系统内部又创建了一个Liunx系统,这个Liunx系统呢,他并非是跟我们使用CentOS系统一样完整,因为有的容器内部文件很多(mysql),有的很少(nacos),这下我们可以清楚地理解容器了,docker 容器 其实就是在我们系统内部创建了一台微小虚拟机,例如:MySQL容器就是为我们创建一个虚拟机,并且安装上了mysql,安装mysql时是需要额外自定义配置一些参数的,所以docker创建容器时为我们提供 -e 来设置参数,这就是为什么 docker 拉取mysql镜像时,为什么启动mysql 容器的指令这么长。

当然除了看文件,使用ls -l 指令就判断 docker 容器就是个微小的Liunx系统是否过于草率?还有一个方法,就是进入docker 容器内部,使用Liunx中查看系统版本的指令

(2)系统版本信息比较

cat /etc/os-release

这是我们CentOS系统
在这里插入图片描述
mysql 容器内部系统版本号
在这里插入图片描述

三、DockerFile

(一)DockerFile 概念

Dockerfile 是一个文本文件,其中包含了构建 Docker 镜像所需的所有指令和配置。通过 Dockerfile,你可以定义基础镜像、安装软件包、复制文件、设置环境变量以及配置容器运行时的其他设置。Dockerfile 用于自动化创建 Docker 镜像的过程,使得部署和分发应用程序变得更加高效和一致。

(二)DockerFile 指令

(1)FROM指令

指定基础镜像。所有的 Dockerfile 都以 FROM 指令开始。

FROM ubuntu:20.04

(2)LABEL指令

添加元数据到镜像,例如维护者信息、版本号等

LABEL maintainer="123@example.com"
LABEL version="1.0"

(3)RUN指令

在镜像内执行命令,通常用于安装软件包或进行配置

RUN apt-get update && apt-get install -y nginx

(4)CMD 指令

指定容器启动时执行的默认命令。可以被 docker run 命令行中的命令覆盖

CMD ["nginx", "-g", "daemon off;"]

(5)ENTRYPOINT指令

指定容器启动时执行的命令,并且不能被 docker run 命令行中的命令覆盖。通常用于指定容器的主进程。

ENTRYPOINT ["nginx"]
CMD ["-g", "daemon off;"]

(6)COPY指令

将文件或目录从构建上下文复制到镜像中的指定路径。

COPY ./localfile.txt /containerfile.txt

(7)ADD指令

与 COPY 类似,但功能更强大。可以解压 tar 文件或从 URL 下载文件。

ADD https://example.com/file.tar.gz /app/
ADD localfile.tar.gz /app/

(8)WORKDIR指令

设置工作目录。后续的 RUN、CMD、ENTRYPOINT、COPY 和 ADD 指令都会在这个目录下执行

WORKDIR /app

(9)VOLUME指令

创建一个挂载点,并在容器和主机之间共享数据。

VOLUME ["/data"]

(10)EXPOSE指令

声明容器在运行时将监听的端口。注意,这个指令不会自动开放端口,只是为了文档目的。

EXPOSE 80

(11)ENV指令

设置环境变量。可以用于配置软件和容器的运行环境。

ENV APP_ENV=production

(12)ARG指令

定义构建时的变量。这些变量可以在 RUN 指令中使用,并且在构建时通过 --build-arg 传递。

ARG VERSION=1.0
RUN echo "Version is $VERSION"

(13)USER指令

指定运行容器时的用户。

USER www-data

(14)ONBUILD指令

指定当当前镜像作为另一个镜像的基础镜像时执行的命令。

ONBUILD RUN echo "This will run on build of the child image"

(15)STOPSIGNAL指令

设置容器停止时发送的信号,默认为 SIGTERM。

STOPSIGNAL SIGINT

(16)HEALTHCHECK指令

为容器设置健康检查,以确保容器的运行状态良好。

HEALTHCHECK CMD curl --fail http://localhost/ || exit 1

(17)SHELL指令

更改默认的 shell(默认是 /bin/sh -c)。如果需要使用其他 shell,可以使用这个指令。

SHELL ["/bin/bash", "-c"]

四、DockerFile 制作镜像

本次我们制作镜像的项目黑马程序员课程中的一个商城项目-hm,在作者专栏中有个Jenkins专栏,里面有篇博客是讲解Jenkins是如何从Gitee上拉取代码到服务器上的。
本次DockerFile 制作镜像:就是以 hm 的项目来制作镜像,部署我们开发的微服务项目。

(一)编写DockerFile文件

在每个服务下添加 dockerfile 文件

# 基础镜像
FROM openjdk:17-jdk
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 暴露端口
# 监听 8080 端口
# 拷贝jar包
COPY ./target/hm-service.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]

在这里插入图片描述

(二)Jenkisn拉取拉取

进入Jenkisn工作空间,随便找个微服务项目(hm是微服务项目)

cd /var/lib/jenkins/workspace/hmall/hm-service

在这里插入图片描述
其它微服务也确保拉取到了dockerfile文件
在这里插入图片描述
其它的就不一一展示了

(三)制作服务镜像

(1)进入到 hm-service 这个服务目录下

cd /var/lib/jenkins/workspace/hmall/hm-service
docker iamges

在这里插入图片描述

(2)制作镜像

docker build -t hm-service .   #注意后面有个 . 
docker build -t cart-service .
docker build -t item-service .
docker build -t user-service .

doucker build 构建镜像
-t 构建的镜像名称
. 表示当前目录是 Dockerfile 的位置。如果 Dockerfile 不在当前目录中,你需要提供相应的路径

在这里插入图片描述

(3)启动容器

1、hm-service容器

docker run -d \
> --name hm-service \
> -p 8080:8080 \
> hm-service:latest

在这里插入图片描述
2、item-service容器

docker run -d --name item-service -p 8081:8081 item-service:latest

在这里插入图片描述

3、cart-service容器

docker run -d \
> --name cart-service \
> -p 8082:8082 \
> cart-service:latest

在这里插入图片描述

这里的命令就不做解释了,可以看docker-命令篇

(4)浏览器访问

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


总结

以上就是我们讲解怎么将微服务制作成镜像,并使用docker部署我们服务。当我们知道如何使用docker制作镜像后,后续我们需要将docker与Jenkins结合起来使用,最终想要实现的效果是,当我们提交代码后,Jenkins会为我们自动拉取代码,打包,调用docker制作镜像,并且将最新的镜像文件做成容器部署在服务器上。

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

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

相关文章

正确安装振弦式应变的步骤有哪些?

在工程结构监测与评估中,振弦式应变计广泛应用于桥梁、建筑、隧道、大坝等各类结构的健康监测中。它能够实时、准确地反映结构在承受荷载作用下的应变状态,为工程师们提供关键的数据支持,以便及时发现并处理潜在的结构问题。然而,…

运维学习————Redis在Linux(Centos7)单机部署和集群部署

目录 一、单机部署 1、软件准备 2、安装配置 3、启动Redis 二、Redis集群 2.1、主从模式 2.1.1、作用 2.1.2、规划图 2.1.3、具体配置 准备工作 主从配置 启动测试 2.1.4、主从复制原理 主从全量复制 主从增量同步(slave重启或后期数据变化) 2.1.5、缺点 2.2、哨兵…

Verilog刷题笔记52

题目: Fsm serial In many (older) serial communications protocols, each data byte is sent along with a start bit and a stop bit, to help the receiver delimit bytes from the stream of bits. One common scheme is to use one start bit (0), 8 data bit…

如何打包CST仿真结果【电磁仿真基础教程】

本期介绍一个小的技巧关于打包仿真结果。很多时候我们需要把仿真的结果传递给同事,领导或者导师等看。如果把整个仿真文件夹压缩,很不方便。其实CST软件自带Archive功能能很方便的打包你想要的部分结果。 比如我们仿真完一个喇叭天线,结果中带…

ubuntu-linux ifconfig只有回环IP问题解决

问题如下图所示: 解决方案: sudo dhclient

uniapp - plugins的组件配置使用

点击进入到uniapp中mp-weixin的配置中 点击进入小程序的plugin的配置 在项目中,我们可引用插件的使用,例如一些快递100,点餐插件的业务引入 添加插件 在使用插件前,首先要在小程序管理后台的“设置-第三方服务-插件管理”中添加…

【论文阅读】SegNeXt:重新思考卷积注意力设计

《SegNeXt: Rethinking Convolutional Attention Design for Semantic Segmentation》 原文:https://github.com/Visual-Attention-Network/SegNeXt/blob/main/resources/paper.pdf 源码:https://github.com/Visual-Attention-Network/SegNeXt 1、简介 …

图书管理系统900pf

TOC springboot533图书管理系统900pf 第一章 课题背景及研究内容 1.1 课题背景 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性&#xff0…

(十四)SpringCloudAlibaba-Nacos集群

前言 Nacos集群官方部署说明集群部署说明https://nacos.io/docs/latest/guide/admin/cluster-mode-quick-start/ 1.官方Nacos集群图 2.集群计划 因为本次的重点在于搭建Nacos集群,为了方便本次数据库我们使用单节点; 3.资源规划 节点IPPortnacos_8845127.0.0.18…

Java语聊大厅个人厅陪玩厅陪玩系统小程序源码

🎉【探索语聊新纪元】🎉 —— 语聊大厅:你的专属社交乐园 🌟【初识语聊大厅,开启无限可能】🌟 嘿宝贝们,今天我要带你们走进一个超燃的社交新天地——语聊大厅!这可不是普通的聊天…

链表OJ题——删除链表中等于给定值 val 的所有节点

文章目录 一、题目链接二、解题思路三、解题代码 一、题目链接 删除链表中等于给定值 val 的所有节点 二、解题思路 三、解题代码

基于JavaWeb的本科生交流培养管理平台的设计与实现--论文pf

TOC springboot529基于JavaWeb的本科生交流培养管理平台的设计与实现--论文pf 第1章 绪论 1.1选题动因 当前的网络技术,软件技术等都具备成熟的理论基础,市场上也出现各种技术开发的软件,这些软件都被用于各个领域,包括生活和…

Linux搭建环境:从零开始掌握基础操作(二)

​ ​ 您好,我是程序员小羊! 前言 软件测试第一步就是搭建测试环境,如何搭建好测试环境,需要具备两项的基础知识: 1、Linux 命令: 软件测试第一个任务, 一般都需要进行环境搭建, 一部分,环境搭建内容是在服…

力扣:加一

文章目录 需求分析结尾 需求 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外,这个整数不会以零开头。 示例 1&#xff1a…

C盘空间满了有什么招吗?

最好的答案就是Dism 第一步:下载软件 第二步:打开,如下: 第三步: 如何选择?如果不懂,就选默认就行了。 但是临时文件,就比较简单了,直接删除。

【前端】VUE动态引入组件 通过字符串动态渲染模板 动态生成组件

【前端】VUE动态引入组件 通过字符串动态渲染模板 应用场景&#xff1a; js增强 动态代码 扩展一类的 可以配合低代码平台等 灵活配置在线表单 在线列表等 适合灵活性 扩展性比较强的组件 VUE2 <template><div><textarea v-model"templateString"…

深度学习--时间序列预测方法总结

时间序列预测是分析和预测一系列时间顺序数据的方法。不同的时间序列预测方法在应用中根据数据特征和目标有不同的适用性。以下是时间序列预测方法的详细总结&#xff0c;包括概念、原理和Python实现代码。 1. 简单平均法 (Simple Average Method) 概念与原理&#xff1a; 简…

QT网络编程: 实现UDP通讯设置

目录 一.widget.ui界面设计 二.创建UDP通信 1.pro文件添加network模块。 2.添加对应头文件 3.定义槽函数&#xff0c;即与 UI 中的按钮点击事件相关联的函数 4.定义类的私有成员 5.关闭按钮 6.信息处理 7.绑定端口 8.发送信息 9.效果图 三.代码演示 1.widget.h 2.…

鸿蒙公共事件和通知

创建一个鸿蒙应用项目&#xff0c;在Index页面中创建一个按钮&#xff0c;点击该按钮&#xff0c;可以创建一个公共事件订阅者&#xff0c;可以订阅自定义公共事件&#xff08;事件名称为&#xff1a;“ncwu.harmonytest.event1”&#xff09;&#xff1b;创建一个Toggle组件&a…

解决 kill -9 PID 无法杀死 python 进程的问题:杀死 defunct 进程

文章目录 1. 一定要用 Ctrl C 结束程序2. 如何杀死后台僵尸 (defunct) 进程2.1 查看 defunct 进程2.2 杀死 defunct 进程的父进程 1. 一定要用 Ctrl C 结束程序 CtrlZ 和 CtrlC 都可以中断程序&#xff0c;但他们却有很大的差异&#xff0c;主要体现在&#xff1a; CtrlC: …