docker程序镜像的制作

目录

一、每种资源的预安装(基础)

  • 安装 nginx
  • 安装 redis

二、dockerfile文件制作(基础)

  • 打包 redis 镜像
    • 创建镜像制作空间
    • 制作dockerfile
  • 打包 nginx 镜像

三、创建组合镜像(方式一)

  • 生成centos容器并运行
  • 开启端口转发
  • 通过yum源下载相应依赖
    • 替换repo文件内容
    • 重新生成缓存
    • 下载相关依赖
  • 在容器中安装多样程序

四、创建组合镜像(方式二)

  • dockerfile文件内容
  • startng.sh文件内容

五、对做好的镜像运维

  • 导出镜像
    • 将容器保存为新的镜像
    • 将docker保存生成tar文件导出
    • 将新的镜像文件进行压缩
  • 导入镜像
    • 解压缩文件
    • 载入镜像
    • 运行容器

总结

  • 预打包单个程序
  • -v 命令特比方便
  • 尝试理解运行原理会有新的发现
  • docker打包方式不止两种

一、每种资源的预安装

在系统环境安装程序。为打包docker准备数据文件

1. 安装 nginx
1. 下载安装包
wget http://nginx.org/download/nginx-1.21.5.tar.gz
2. 解压缩到指定目录下
tar zxvf nginx-1.21.5.tar.gz -C /usr/local/src
3. cd nginx-1.21.5
4. 安装必要依赖
yum install -y install pcre-devel openssl openssl-devel
5. 编译nginx. 执行命令后此时/opt/server/nginx目录还没有创建. 
./configure --prefix=/opt/server/nginx --with-http_ssl_module --with-http_stub_status_module --with-stream
6. 安装Nginx. 自动创建/opt/server/nginx目录
make && make install
2. 安装 redis
  • 跟随 >>文章 进行redis安装安装时有可能需首先安装如下依赖(环境需要)
    • 首先安装依赖系统: centos 7
    • 程序将使用标准C库(libc)的内存分配函数(如 malloc, free, realloc 等)来管理内存。这通常用于确保与特定系统或库的兼容性
      yum install gcc-c++  -y
      make MALLOC=libc
      

二、dockerfile文件制作

Ⅰ、打包 redis 镜像

★ 使用docker build 构建 镜像前要启动docker服务 linux环境 启动docker服务 systemctl start docker.service
★ 以下命令介绍摘自文章 >>|

FROM                #基础镜像  一切从这里开始构建
MAINTAINER          #镜像是谁写的,姓名+邮箱
RUN                 #镜像构建的时候需要运行的命运
ADD                 #步骤,tomcat镜像,这个tomcat压缩包!
WORKDIR             #镜像的工作目录
VOLUME              #挂载的目录
EXPOST              #暴露端口配置
CMD                 #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT          #指定这个容器启动时要运行的命令,可以追加命令
ONBUILD             #当构建一个被继承DockerFile 这个时候就会运行ONVUILD 的指令,触发指令
COPY                #类型ADD ,将我们文件拷贝到镜像中
ENV                 #构建的时候设置环境变量!
1. 编写Dockerfile文件及命令解释(借鉴redis打包docker镜像 > https://www.cnblogs.com/xiao98…)
  • 创建镜像制作空间
    mkdir -p /opt/dockerfile/redis
    cd /opt/dockerfile/redis
    
  • 制作dockerfile
    • FROM安装5.0.14版本redis, docker会自动寻找redis版本为5.0.14的redis镜像进行安装
    • COPY复制宿主机当前目录下的redis.conf文件 至 容器中/usr/local/etc/redis/redis.conf文件
    • CMD运行容器, 执行redis-server /usr/local/etc/redis/redis.conf命令启动redis
    • 注意:RUN命令在镜像创建的时候执行,利用当前系统环境通过命令将依赖打包入镜像完成安装。
    • 注意:CMD命令在容器启动后运行,如容器启动后运行程序等。
    FROM redis:5.0.14
    COPY redis.conf /usr/local/etc/redis/redis.conf
    CMD ["redis-server", "/usr/local/etc/redis/redis.conf"]
    
2. 编写redis.conf文件也可使用原redis.conf文件(官方文件, 内容较多, 这里编写的为精简后的内容)
  • dirredis数据文件存储路径, 如持久化文件
  • pidfile进程文件存储路径
  • logfile日志文件存储路径
  • requirepass客户端连接redis登陆时所需密码
  • maxmemory 2048m这设置了Redis服务器的最大内存限制为2048MB。当达到这个限制时,Redis将开始根据maxmemory-policy策略删除一些键来释放空间。
  • maxmemory-policy allkeys-lru这是关于内存管理的策略。当达到maxmemory限制时,这个策略会选择并删除最少使用的键。
  • 。。。剩余可百度或使用文心一言自行查阅内容解释>>文心一言
    dir /data
    pidfile /data/redis.pid
    logfile /data/redis.log
    repl-disable-tcp-nodelay yes
    no-appendfsync-on-rewrite yes
    maxmemory 2048m
    maxmemory-policy allkeys-lru
    requirepass 123456
    
    
3. 制作镜像
  • redis_pro:5.0.14 这个名称会在启动容器时用到 >>|
    docker build -t redis_pro:5.0.14 .
    
4. 编写启动容器脚本文件run.sh并执行sh run.sh
  • runs.sh文件内容
    • –restart:always 当容器退出时总是尝试重启容器
    • –name给这个容器起一个名字,名为"redis_prod"
    • redis_prod:5.0.14给镜像取一个名字
    • -v /data/redis:/data -v 命令对容器内数据进行持久化。1)如果容器内的 /data 目录有数据,那么这些数据实际上是存储在宿主机的 /data/redis 目录中。2)如果在容器内对 /data 目录进行了修改(例如写入了数据),那么这些更改也会反映到宿主机的 /data/redis 目录中。
    docker run -d -it --name redis_prod --restart=always -p 6379:6379 -v /data/redis:/data redis_prod:5.0.14
    
5. 查看镜像运行情况
docker ps -a 

在这里插入图片描述

Ⅱ、打包 nginx 镜像

6. 操作步骤与打包redis相同
mkdir -p /opt/dockerfile/nginx
cd /opt/dockerfile/nginx
  • dockerfile
FROM nginx:1.21.5
COPY /opt/server/nginx/conf/nginx.conf /etc/nginx.conf
CMD ['nginx','-c','/etc/nginx.conf']
  • run.sh
docker run -d -it --name nginx-t1 -p 8081:80 -v /tmp/nginx:/var/log/nginx/ nginx:1.21.5

在这里插入图片描述

三、创建组合镜像(方式一)

★ 原理:通过在centos镜像容器中安装相关程序。再对此容器做镜像导出。

1. 生成centos容器并运行。
  • 做dockerfile
    FROM centos:latest
    
  • 通过build命令创建镜像
    docker build -t centos .
    
  • 运行
    docker run -d -it --name centos centos
    
2. 开启端口转发(宿主机中配置)使运行的docker容器需要能够访问外网
  • 配置宿主机ipv4转发
    echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf    ###复制到终端上!以root用户身份执行。
    sysctl -p   ###使更改立即生效
    
3. 通过yum源下载相应依赖(docker容器中)按步骤走,才能使用yum
  • 替换repo文件内容,使得yum源可用。
    cd /etc/yum.repos.d/
    sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
    sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
    
  • 重新生成缓存
    yum makecache
    
  • 下载相关依赖
    yum update -y # 下载更新最新软件包
    yum install -y vim # 如添加vim工具等
    
4. 在容器中安装多样程序。

最后使用commit, 如 第五步骤 对程序进行导出即可。
在运行的docker容器中安装nginx, redis, postgresql, mongodb, java springboot即可。
安装详情后期进行补充

四、创建组合镜像(方式二)

★ 原理:使用dockerfile 对镜像创建步骤进行编辑

  • dockerfile文件内容 组合了方式一中的内容。制作的镜像运行启动后会自动运行nginx

    • sed 部分更换yum源
    FROM centos:latest
    ENV MYPATH /usr/local
    WORKDIR $MYPATH
    RUN cd /etc/yum.repos.d/ && \
    sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* && \
    sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
    RUN yum makecache
    RUN yum update -y
    RUN yum install -y pcre-devel openssl openssl-devel
    RUN yum install -y nginx
    COPY startng.sh /root/startng.sh
    RUN chmod +x /root/startng.sh
    ENTRYPOINT ["/root/startng.sh"]
    EXPOSE 80
    
  • dockerfile中starting.sh文件内容

    #!/bin/bash
    nginx -c /etc/nginx/nginx.conf
    /bin/bash
    

五、对做好的镜像运维

对组合镜像运行的容器制作快照(docker commit操作)

1. 导出镜像
  • 将容器保存为新的镜像
    docker commit centos-t1save wantimage
    
  • 将docker保存生成tar文件导出
    方便运维时迁移部署使用
    docker save -o wantimage.tar wantimage
    
  • 将新的镜像文件进行压缩
    gzip > wantimage.tar.gz
    
2. 导入镜像
  • 解压缩文件
    gunzip wantimage.tar.gz 
    
  • 载入镜像-i 指定输入文件的路径。在这里,输入文件是 wangeimage.tar
    docker load -i wangeimage.tar
    
    在这里插入图片描述
  • 运行容器。最后使用run.sh脚本创建并运行容器
    docker run -d -it --name wantimage [可指定其他参数] wangeimage
    

总结

1. 预打包单个程序。再进行组合打包时成功率会提高。如将nginx, redis, java, postgresql...进行组合安装时先单独对 redis, java, postgresql 进行单独镜像的打包
2. -v 命令特比方便。
  • run.sh文件中使用的 -v 命令可以在不进入docker容器内即可查看到容器内部的文件内容。如nginx日志的打印。

    curl http://localhost:8081/
    tail -10f /tmp/nginx/access.log
    

    在这里插入图片描述

3. 尝试理解运行原理会有新的发现。
  • 更加深入的学习docker会有许多原理需要学习。在学习期间会有一些莫名的问题,只有懂得更多才能明白发生这些问题的原因。如下内容是通过大模型搜索的。搜索时我的问题是 ?什么docker容器只允许一个前台进程?对更深入理解有所帮助
    Docker容器是基于Linux的cgroup和namespace技术实现的,它在宿主机上本质是个隔离的进程。容器在启动时,
    必须要有一个前台进程一直运行,因为容器并不是虚拟机。一个docker容器同时只能管理一个进程,如果容器中有
    多个进程同时运行,那么这些进程之间无法实现隔离,因此Docker容器仅在它的1号进程(PID为1)运行时,会保持运行。
    此外,docker容器默认会把容器内部第一个进程,也就是pid=1的程序作为docker容器是否正在运行的依据。
    如果docker容器中pid=1的进程挂了,那么docker容器便会直接退出,也就是说Docker容器中必须有一个前台进程,
    否则认为容器已经挂掉。
    以上内容仅供参考,可以咨询计算机领域专业人士获取准确信息。
    
4. docker打包方式不止两种。
  • docker的组合打包方式不止两种(dockerfile, commit)。还有其他方式,有兴趣可以上网搜索。还有使用编程进行打包的方式,据说对技术要求较高,这里篇幅不易过长,后期有机会的话再做补充吧。

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

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

相关文章

3.0 Zookeeper linux 服务端集群搭建步骤

本章节将示范三台 zookeeper 服务端集群搭建步骤。 所需准备工作,创建三台虚拟机环境并安装好 java 开发工具包 JDK,可以使用 VM 或者 vagrantvirtualbox 搭建 centos/ubuntu 环境,本案例基于宿主机 windows10 系统同时使用 vagrantvirtualb…

时序预测 | MATLAB实现基于CNN-GRU-AdaBoost卷积门控循环单元结合AdaBoost时间序列预测

时序预测 | MATLAB实现基于CNN-GRU-AdaBoost卷积门控循环单元结合AdaBoost时间序列预测 目录 时序预测 | MATLAB实现基于CNN-GRU-AdaBoost卷积门控循环单元结合AdaBoost时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于CNN-GRU-AdaBo…

Docker进阶篇-CIG重量级监控系统

一、简介 通过docker stats命令可以很方便的查看当前宿主机上所有容器的CPU、内存、网络流量等数 据,可以满足一些小型应用。 但是docker stats统计结果只能是当前宿主机的全部容器,数据资料是实时的,没有地方存储、 没有健康指标过线预警…

二叉树的详解

二叉树 【本节目标】 掌握树的基本概念掌握二叉树概念及特性掌握二叉树的基本操作完成二叉树相关的面试题练习 树型结构(了解) 概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。…

Redis核心技术与实战【学习笔记】 - 24.Redis 数据分片方案选择:Codis 和 Redis Cluster

简述 Redis 的切片集群使用多个实例保存数据,能很好的应对大数据量的场景。在《4.Redis 切片集群》中,介绍了 Redis 官方提供的切片集群方法 Redis Cluster。本章,再来学习下,在 Redis Cluster 方案正式发布前,业界广…

CodeMeter强化了ETM WinCC 开放架构平台的许可与安全保护

在面对日益复杂的网络安全威胁时,ETM professional control采取了前瞻性的措施,选择了业界领先的威步CodeMeter技术,以保护其标志性的WinCC开放架构平台。这一选择不仅体现了ETM对安全的高度重视,也标志着其在保障关键基础设施运营…

Jmeter 01 -概述线程组

1、Jmeter:概述 1.1 是什么? Jmeter是Apache公司使用Java 开发的一款测试工具 1.2 为什么? 高效、功能强大 模拟一些高并发或多次循环等特殊场景 1.3 怎么用? 下载安装 1、下载jmeter,解压缩2、安装Java环境(jmet…

基于OpenCV灰度图像转GCode的螺旋扫描实现

基于OpenCV灰度图像转GCode的螺旋扫描实现 引言激光雕刻简介OpenCV简介实现步骤 1.导入必要的库2. 读取灰度图像3. 图像预处理4. 生成GCode5. 保存生成的GCode6. 灰度图像螺旋扫描代码示例 总结 系列文章 ⭐深入理解G0和G1指令:C中的实现与激光雕刻应用⭐基于二值…

5-3、S曲线生成器【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】,查看本系列全部文章 摘要:本节介绍步进电机S曲线生成器的计算以及使用 一.计算原理 根据上一节内容,已经计算了一条任意S曲线的函数。在步进电机S曲线加减速的控制中,需要的S曲线如图1所示,横…

React 实现表单组件

表单是html的基础元素,接下来我会用React实现一个表单组件。支持包括输入状态管理,表单验证,错误信息展示,表单提交,动态表单元素等功能。 数据状态 表单元素的输入状态管理,可以基于react state 实现。 …

09_树莓派_树莓派外设板_GPIO_按键的中断与消抖

目录 1.树莓派外设集成板总体介绍 2.第一部分 按键矩阵 GPIO_按键与中断 3.实现效果 1.树莓派外设集成板总体介绍 1)前言:这是一块为了验证树莓派【兼容树莓派多个型号】的40pins的外设接口的外接板,告别复杂的面包板外设搭建。【欢迎各位…

【Iceberg学习四】Evolution和Maintenance在Iceberg的实现

Evolution Iceberg 支持就底表演化。您可以像 SQL 一样演化表结构——即使是嵌套结构——或者当数据量变化时改变分区布局。Iceberg 不需要像重写表数据或迁移到新表这样耗费资源的操作。 例如,Hive 表的分区布局无法更改,因此从每日分区布局变更到每小…

Node.js+Express+Mysql服务添加环境变量

1、使用dotenv插件 1)安装插件:npm install dotenv-cli --save-dev 2)在项目根目录下添加对应的 .env 配置文件; // .env配置文件内容 MODEdevelopment, BASE_URLhttp://127.0.0.1:80813) 在启动命令中设置对应的加载文件&#…

RabbitMQ-1.介绍与安装

介绍与安装 1.RabbitMQ1.0.技术选型1.1.安装1.2.收发消息1.2.1.交换机1.2.2.队列1.2.3.绑定关系1.2.4.发送消息 1.2.数据隔离1.2.1.用户管理1.2.3.virtual host 1.RabbitMQ 1.0.技术选型 消息Broker,目前常见的实现方案就是消息队列(MessageQueue&…

新零售的升维体验,摸索华为云GaussDB如何实现数据赋能

新零售商业模式 商业模式通常是由客户价值、企业资源和能力、盈利方式三个方面构成。其最主要的用途是为实现客户价值最大化。 商业模式通过把能使企业运行的内外各要素整合起来,从而形成一个完整的、高效率的、具有独特核心竞争力的运行系统,并通过最…

springboot与Elasticsearch版本兼容对比

首先 大家在下载 Elasticsearch 时 最好先弄清楚版本 因为 如果 Spring Boot 版本 不兼容 Elasticsearch 那就是到头一场空了 Elasticsearch 版本 6.x 可以兼容 Spring Boot 2.x Elasticsearch 版本 7.x 可以兼容 Spring Boot 2.x 3.x 4x Elasticsearch 版本 7.x 以及 8.x 可以…

Golang-Map有序输出——使用orderedmap库实现

前言 工作中遇到一个问题:需要导出一个MySQL表格,表格内容由sql查询得来。但现在发现,所导出的表格中,各列的顺序不确定。多次导出, 每一次的序列顺序也是不定的。 因此确定是后端,Map使用相关导致的问题。…

分布式文件存储系统minio

参考Linux搭建免费开源对象存储 wget https://dl.minio.io/server/minio/release/linux-amd64/minio yum install -y wget yum install -y wget wget https://dl.minio.io/server/minio/release/linux-amd64/minio chmod x minio sudo mv minio /usr/local/bin/ minio --vers…

黑马头条 Kafka

我是南城余!阿里云开发者平台专家博士证书获得者! 欢迎关注我的博客!一同成长! 一名从事运维开发的worker,记录分享学习。 专注于AI,运维开发,windows Linux 系统领域的分享! 知…

玩家笔记:幻兽帕鲁搭建服务器开服教程

玩转幻兽帕鲁服务器,阿里云推出新手0基础一键部署幻兽帕鲁服务器教程,傻瓜式一键部署,3分钟即可成功创建一台Palworld专属服务器,成本仅需26元,阿里云服务器网aliyunfuwuqi.com分享2024年新版基于阿里云搭建幻兽帕鲁服…
最新文章