docker的镜像制作

news2024/9/22 17:24:11

镜像的加载原理

        docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS

        UnionFS(联合文件系统): Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像

镜像的结构

        镜像不是一个单一的文件,而是有多层构成。可以通过 docker history 命令查看镜像中各 层内容及大小,每层对应着 Dockerfile 中的一条指令。Docker 镜像默认存储在 /var/lib/docker/目录中。容器其实是在镜像的最上面加了一层读写层, 在运 行容器里做的任何文件改动,都会写到这个读写层。如果删除了容器,也就删除了其最上面的 读写层,文件改动也就丢失了。Docker 使用存储驱动管理镜像每层内容及可读写层的容器 层

        分层结构的特点

        多个镜像都从相同的 base 镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像,同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

        镜像的特点

        docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称为容器层,容器层之下的都叫镜像层

        镜像的制作方式

                1.基于容器(现有镜像)创建镜像

                        1.启动一台虚拟机,连接ssh,上传包(docker-ce-24.0.7.rpm.tar.gz)

                        2.解压安装

                        3.启动服务,下载nginx镜像

systemctl start docker
systemctl enable docker
docker run -d -p 80:80 --name nginx01 nginx

#创建命令格式: 
#docker commit [选项] 容器ID/名称 仓库名称:[标签]
#常用选项: 
#-m说明信息; 
#-a作者信息; 
#-p生成过程中停止容器的运行。 

#登录daocker
docker exec -it nginx01 bash
#写入信息,用以记录
echo 'this is KGC' > /usr/share/nginx/html/index.html
#退出,基于上个镜像,创建镜像
docker commit -m "new nginx" -a "lx" nginx01 mynginx:1.01
#启用自定义的镜像
docker run -d -P --name nginx02 mynginx:1.01

 

                2.基于模板创建镜像(没有镜像,制作镜像)

                        1.下载地址:http://openvz.org/Download/template/precreated

                        2.使用 docker 导入命令将下载的 debian 模板压缩包导入为本地镜像

wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
docker import - debian:new
sha256:234c82524631e98feb5e54fbab7dca81bf275617c39b85de49a246c54d86438e
docker images debian
                3.基于dockerfile 创建常用的镜像

                        1.除了手动生成 Docker 镜像之外,可以使用 Dockerfile 自动生成镜像。Dockerfile 是由一 组指令组成的文件,其中每条指令对应 Linux 中的一条命令,Docker 程序将读取Dockerfile 中 的指令生成指定镜像

                        2.什么是dockerfile

                                镜像的定制实际上就是定制每一层所添加的配置、文件等信息,但是命令毕竟只是命令,每次定制都得去重复执行这个命令,而且还不够直观,如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么这些问题不就都可以解决了吗?对的,这个脚本就是我们说的Dockerfile

Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构

                        3.在编写 Dockerfile 时,有严格的格式需要遵循:第一行必须使用 FROM 指令指明所基于 的镜像名称;之后使用 MAINTAINER 指令说明维护该镜像的用户信息;然后是镜像操作相关 指令,如 RUN 指令。每运行一条指令,都会给基础镜像添加新的一层。最后使用 CMD 指令 指定启动容器时要运行的命令操作

指令

含义

FROM 镜像

指定新镜像所基于的镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令。

MAINTAINER 名字

说明新镜像的维护人信息

RUN命令

在所基于的镜像上执行命令,并提交到新的镜像中

CMD[“要运行的程序“,”参数1,“参数2“]

指令启动容器时要运行的命令或者脚本,Dockerfile只能有一条CMD命令,如果指定多条则只能最后一条被执行

EXPOSE 端口号

指定新镜像加载到Docker时要开启的端口

ENV 环境变量 变量值

设置一个环境变量的值,会被后面的RUN使用

ADD 源文件/目录 目标文件/目录

将源文件复制到目标文件,源文件要与Dockerfile位于相同目录中,或者是一个URL

COPY 源文件/目录 目标文件/目录

将本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中

VOLUME [“目录“]

在容器中创建一个挂载点

USER 用户名/UID

指定运行容器时的用户

WORKDIR 路径

为后续的RUN、CMD、ENTRYPOINT指定工作目录

ONBUILD 命令

指定所生成的镜像作为一个基础镜像时所要运行的命令

HEALTHCHECK

健康检查

                        4.使用dockerfile制作镜像 

                                1.构建nginx服务

mkdir nginx
cd nginx
vi Dockerfile

                                2.创建nginx镜像

# 第一行必须指明基于的基础镜像
FROM centos:7.6.1810
# 作者信息(可选)
MAINTAINER lx
#上传包到nginx路径下作为依赖(nginx-1.15.2.tar.gz)

                                3.构建镜像,测试是否可用,可用即可继续编辑

docker build -t nginx:v1 .
docker images
docker run -it --rm nginx:v1 ls -lh /

                                 4.继续编辑

FROM centos:7.6.1810
MAINTAINER lx
#上传包到nginx路径下作为依赖(nginx-1.15.2.tar.gz)
COPY nginx-1.15.2.tar.gz /nginx-1.15.2.tar.gz
#对容器的操作
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
RUN yum -y install gcc make pcre-devel zlib-devel tar zlib
RUN tar zxf /nginx-1.15.2.tar.gz
RUN cd /nginx-1.15.2 && ./configure --prefix=/usr/local/nginx && make && make install
COPY run.sh /run.sh
RUN chmod +x /run.sh

#暴露端口号
EXPOSE 80


#后台运行
CMD ["/run.sh"]
#前台运行,使用一个即可 【前台启动命令】
#CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

                                        编写脚本

vi run.sh
#!/bin/bash

/usr/local/nginx/sbin/nginx
while true
do
        sleep 1
done

                                         清除内容,方便管理

docker ps -aq | xargs docker stop
docker ps -aq | xargs docker rm

                                5.构建镜像

docker build -t nginx:v2 .
docker images
docker run -it --rm nginx:v2 ls -lh /

 

                 构建sshd镜像

mkdir sshd
cd sshd
vi Dockerfile

# 第一行必须指明基于的基础镜像
FROM centos:7.6.1810
# 作者信息(可选)
MAINTAINER name
# 镜像的操作指令
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
RUN yum -y install initscripts openssh-server && \
mkdir -p /sshd && \
echo "root:123456789" | chpasswd && \
echo '#!/bin/bash' > /sshd/run.sh && \
# 生成主机密钥
echo '/usr/sbin/sshd-keygen -A' >> /sshd/run.sh && \
echo '/usr/sbin/sshd -D ' >> /sshd/run.sh && \
chmod -R 755 /sshd/run.sh

# 取消pam限制
RUN sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd

# 开放端口
EXPOSE 22

# 设置自启动命令
CMD ["/sshd/run.sh"]
docker build -t sshd:kgc .
docker run --privileged --name sshd01 -tid sshd:kgc /sbin/init
#privileged  特权限制

多阶段构建镜像

        将全部组件及其依赖库的编译、测试、打包等流程封装进一个 Docker 镜像中。采用这种方式往往忽略了以下这些问题

                Dockefile 特别长,可维护性降低

                镜像的层次多,体积大,部署时间长

                源代码存在泄漏的风险

        多阶段构建的好处

                减小镜像大小:每个构建阶段只包含必要的依赖项和文件,从而减小了生成的镜像大小。这可以减少镜像的存储空间和传输时间。

                提高构建速度:每个构建阶段可以并行执行,因此可以提高构建速度。而且,每个构建阶段只构建所需的内容,从而减少了构建时间。

                简化Dockerfile:使用多个构建阶段可以将Dockerfile分解为更小的部分,从而使Dockerfile更加易于管理和维护。每个构建阶段都可以专注于特定的任务,而不必关注整个构建过程。

                提高安全性:使用多个构建阶段可以限制敏感信息的泄露。例如,在第一个构建阶段中,可以包含敏感信息,例如私有密钥或密码。而在第二个构建阶段中,可以只包含必要的文件和依赖项。

        多阶段构建实例

# 未使用多阶段构建

[root@bogon ~]# mkdir demo

[root@bogon ~]# cd demo/

# 编写C语言测试代码

[root@bogon demo]# cat demo.c

# include<stdio.h>

int main()

{

  printf("%s\n","This is a demo!");

  return 0;

}

# 编写Dockerfile

[root@bogon demo]# cat Dockerfile

FROM centos:7.6.1810

ENV VERSION 1.0

WORKDIR /demo

COPY demo.c .

RUN yum install -y gcc && \

    gcc -v

RUN gcc demo.c -o demo && \

    rm -f demo.c && \

    yum erase -y gcc && \

    cp demo /usr/local/bin/

CMD ["demo"]

[root@bogon demo]# docker build -t demo:v1 .

[root@bogon demo]# docker images demo

REPOSITORY   TAG       IMAGE ID       CREATED          SIZE

demo         v1        4575ab954243   21 seconds ago   526MB

# 使用多阶段构建

[root@bogon ~]# mkdir demo

[root@bogon ~]# cd demo/

# 编写C语言测试代码

[root@bogon demo]# cat demo.c

# include<stdio.h>

int main()

{

  printf("%s\n","This is a demo!");

  return 0;

}

# 编写Dockerfile

[root@bogon demo]# cat Dockerfile

FROM centos:7.6.1810

ENV VERSION 1.0

WORKDIR /demo

COPY demo.c .

RUN yum install -y gcc && \

    gcc -v

RUN gcc demo.c -o demo && \

    rm -f demo.c && \

    yum erase -y gcc && \

    cp demo /usr/local/bin/

FROM centos:7.6.1810

# --from表示从第一个FROM的流程里面复制

COPY --from=0 /usr/local/bin/demo /usr/local/bin/demo

CMD ["demo"]

[root@bogon demo]# docker build -t demo:v2 .

# 可以看到使用多阶段构建后镜像大小有明显缩减

[root@bogon demo]# docker images demo

REPOSITORY   TAG       IMAGE ID       CREATED         SIZE

demo         v2        c05a904e23a7   3 seconds ago   202MB

demo         v1        4575ab954243   2 minutes ago   526MB

注意事项:

在进行多阶段构建的时候第二个FROM里面的COPY可以使用—from=0把第一个阶段的文件复制过来,也可以使用一下方式

FROM centos:7.6.1810 AS build

ENV VERSION 1.0

WORKDIR /demo

COPY demo.c .

RUN yum install -y gcc && \

    gcc -v

RUN gcc demo.c -o demo && \

    rm -f demo.c && \

    yum erase -y gcc && \

    cp demo /usr/local/bin/

FROM centos:7.6.1810

# --from表示从build的流程里面复制

COPY --from=build /usr/local/bin/demo /usr/local/bin/demo

CMD ["demo"]

Docker图形管理界面

        说到Docker GUI管理界面,可以说业内最出名的便是Portainer了,其次Kitematic以及没有中文界面,甚至没有图形UI的LazyDocker。而今天介绍的这款是国内大佬开发的UI,兼备了良好的UI界面的同时,也同时具备Docker主机管理、集群管理以及docker的任务编排。 

        一.下载安装

docker run --restart always --name docker.ui -d -v /var/run/docker.sock:/var/run/docker.sock -p 8989:8999 joinsunsoft/docker.ui

浏览器访问 http://<IP>:8989

账号:ginghan

密码:123456

        2,使用镜像包安装 

docker run --restart always --name docker.ui -d -v /var/run/docker.sock:/var/run/docker.sock -p 8989:8999 joinsunsoft/docker.ui

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

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

相关文章

Delphi 12.1安卓APP开发中获取硬件信息及手机号

Demo与代码已上传到CSDN下载。 这里简单说一下代码内容&#xff0c;完整代码请自行下载&#xff0c;不清楚的欢迎留言交流。 前言 演示Demo使用了我自己开发的一个控件&#xff0c;TLayoutPro 《Delphi D10.3 LayoutsPro 控件简介 -避免输入焦点被虚拟键盘遮挡》请查看并下载控…

第三部分:3---环境变量

目录 什么是环境变量&#xff1f; PATH环境变量&#xff1a; 临时修改环境变量PATH&#xff1a; HOME环境变量&#xff1a; 可能使用环境变量的场景&#xff1a; 进程和环境变量的关系&#xff1a; 环境变量相关操作&#xff1a; 代码获取环境变量&#xff1a; 主函数传…

百度静态资源瓦片nginx直接显示完整案例

案例地址&#xff1a;https://download.csdn.net/download/jinhuding/89733763 访问显示效果&#xff1a;(根据瓦片地址直接显示) http://172.16.39.203:8099/tiles/

(rs系列)rs4之补环境

网站&#xff1a;aHR0cDovL3d3dy5mYW5nZGkuY29tLmNuLw 先讲讲rs4特征​&#xff1a; 1、打开控制台立刻进入无限debugger&#xff0c;混淆代码格式_$xx 会有两次无限debugger&#xff0c;直接在对应位置鼠标右键》Never pause here即可​。当然这种方法比较耗资源&#xff0c;也…

代码随想录算法训练营第42天|188. 买卖股票的最佳时机 IV、714. 买卖股票的最佳时机含手续费

目录 188. 买卖股票的最佳时机 IV&#xff08;交易最多k次&#xff09;1、题目描述2、思路3、code4、复杂度分析 714. 买卖股票的最佳时机含手续费1、题目描述2、思路3、code4、复杂度分析 309. 买卖股票的最佳时机含冷冻期1、题目描述2、思路3、code4、复杂度分析 买卖股票习题…

智能语音交互:人工智能如何改变我们的沟通方式?

在科技飞速发展的今天&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到我们生活的方方面面。其中&#xff0c;智能语音交互作为AI技术的一个重要分支&#xff0c;正以前所未有的速度改变着我们的沟通方式。从智能家居的控制到办公自动化的应用&#xff0c;再到日常交…

CentOs7 解决yum更新源报错:[Errno 14] HTTP Error 404 - Not Found 正在尝试其它镜像。

CentOs7 解决yum更新源报错&#xff1a;[Errno 14] HTTP Error 404 - Not Found 正在尝试其它镜像。 前言问题解决方法&#xff1a; 前言 遇到这个问题大概率是镜像源的问题可以参照这篇文章的内容试一下 镜像源问题相关解决方法 根据自己的情况对症下药&#xff0c;如果还不…

WPS如何删除表格下的空白页

WPS Office&#xff08;12.1.0.17827&#xff09; ① 鼠标右键&#xff0c;选择段落 ② 行距&#xff1a;固定值&#xff1b;设置值&#xff1a;1磅&#xff1b;取消勾选&#xff0c;确定即可~

【区块链 + 人才服务】CERX- 基于联盟链的研学资源交换网络 | FISCO BCOS应用案例

CERX 是定位于面向高校科学研究与教学的分布式研学资产交换网络&#xff0c;构建一个用于数据、算法模型、论文和课程的研学资源价值流转平台。该平台采用 FISCO BCOS 联盟链为核心区块链层。 CERX 基于“交叉学科”的人才培养生态&#xff0c;围绕“科研、课件、课程、证书”…

【C++从练气到飞升】23--内联函数、auto、范围for、nullptr

&#x1f388;个人主页&#xff1a;库库的里昂 ✨收录专栏&#xff1a;C从练气到飞升 &#x1f389;鸟欲高飞先振翅&#xff0c;人求上进先读书&#x1f389; 目录 ⛳️推荐 一、内联函数 1.1 定义 1.2 特性 二、auto关键字 2.1 简介 2.2 auto使用细则 2.3 不能使用aut…

ES6标准---【二】【学习ES6看这一篇就够了!!】

目录 ES6以往文章 ES6新增字符串方法&#xff1a; includes()、startsWith()、endsWith() repeat() padStart()、padEnd() 常见用途 为数值补全指定位数 提示字符串格式 trimStart()、trimEnd() String.raw() ES6以往文章 ES6标准-【一】【学习ES6看这一篇就够了&a…

开关电源综合测试平台自动生成报告,智能分析电源测试参数

在电源模块的检测过程中&#xff0c;数据的准确性和分析效率至关重要&#xff0c;开关电源综合测试平台的数据报告和数据分析功能为企业的电源测试带来了便利。 NSAT-8000开关电源综合测试平台是集自动化测试与数据收集分析于一体的综合测试软件&#xff0c;打破了传统测试系统…

【组件】WEB前端-富文本编辑器组件推荐 在线编辑器 Word

【组件】WEB前端-富文本编辑器组件推荐 在线编辑器 Word canvas-editor 基于canvas/svg的富文本编辑器 canvas-editor | rich text editor by canvas/svgrich text editor by canvas/svghttps://hufe.club/canvas-editor-docs/ canvas-editor 基于canvas/svg的富文本编辑器 开…

文案改写工具有哪些?5款智能改写工具迅速提升文案品质

在信息爆炸的时代&#xff0c;优秀的文案如同黄金&#xff0c;能瞬间抓住消费者的眼球。然而&#xff0c;创作出独具匠心的文案并非易事&#xff0c;尤其是当需要不断改写以保持文案内容新鲜感时。那么&#xff0c;文案改写工具有哪些是能帮助我们事半功倍呢&#xff1f;以下5款…

Goby 漏洞发布|(CVE-2024-45195)Apache OFBiz /viewdatafile 代码执行漏洞【已复现】

漏洞名称&#xff1a;Apache OFBiz /viewdatafile 代码执行漏洞&#xff08;CVE-2024-45195&#xff09; English Name&#xff1a;Apache OFBiz /viewdatafile Code Execution Vulnerability(CVE-2024-45195) CVSS core: 8.0 漏洞描述&#xff1a; Apache OFBiz是一个开源…

--数据库--

制作工人薪资管理系统 #include <myhead.h> #include <sqlite3.h> typedef struct {int gh;char name[20];double salary; }Worker;int do_insert(sqlite3 *ppdb) {Worker work;printf("请输入插入的工号&#xff1a;");scanf("%d",&work.…

基于Verilog HDL的FPGA设计基础

第一章 Verilog数字集成电路设计方法概述 HDL(Hardware Description Language)----硬件描述语言 EDA(Electronic Design Automation)----电子设计自动化 VLSI(Very Large Scale Integrated)----超大规模集成电路 ASIC(Application Specific Integrated Circuit)----专用集成电路…

坚守官网,深挖没有错;积极转型也没错,就怕10年前经验用在现在

如今官网建设领域哀嚎一片&#xff0c;出现三种应对策略。 其一&#xff1a;坚守官网&#xff0c;深挖下去&#xff0c;做出高大上&#xff0c;精美炫酷和实效网站&#xff0c;路子很对。 其二&#xff1a;积极寻求转型&#xff0c;客户需要啥就做啥&#xff0c;比如搞小程序…

Vue3可编辑表格插件

插件亮点&#xff1a; 通过可自定义单元格内容。可控的状态控制&#xff0c;例如只读、禁止编辑行等配置。可控的状态交互&#xff0c;例如框选单元格、框选行等配置。可控的推拽顺序&#xff0c;例如拖拽行、推拽列。方便的单元格数据验证配置。方便的快捷右键菜单&#xff0c…

std::map 合并

目录 示例 效果 采用insert函数实现两个map的合并。使用方法&#xff1a; map1.insert(map2) 假如map2的某些键也出现在map1里面&#xff0c;则map1中重复的键值对不变&#xff0c;map2中重复的键值对无法覆盖map1。 示例 #include <map> #include <iostream>…