docker之程序镜像的制作

news2024/10/6 6:52:28

目录

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

  • 安装 nginx
  • 安装 redis

二、dockerfile文件制作(基础)

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

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

  • 生成centos容器并运行
  • 开启端口转发
  • 通过yum源下载相应依赖
    • 替换repo文件内容
    • 重新生成缓存
    • 下载相关依赖
    • 添加自启动nginx配置
  • 在容器中安装多样程序
  • 创建新的镜像

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

  • 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 nginx # 如添加vim工具等(这里以nginx安装为例)
    
  • 添加自启动nginx配置
    • 编写startng.sh
      #!/bin/bash
      nginx
      /bin/bash
      
4. 在容器中安装多样程序。

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

5. 创建新的镜像

导出后编辑dockerfile对commit打包的镜像创建新的镜像。

  • dockerfile如导出镜像名称为 mycentos
    FROM mycentos
    ENTRYPOINT ["sh", "/startng.sh"]
    
    docker build -t mycentosng .
    docker run -d -it --name mycentosng -p 8080:80 mycentosng
    docker ps -a # 查看容器是否启动成功
    

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

★ 原理:使用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.coloradmin.cn/o/1436118.html

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

相关文章

苹果证书过期有什么影响

引言 苹果证书是一种数字签名,用于验证应用程序的身份和完整性。然而,若该证书过期,将会对用户和开发者带来一定的影响。在本文中,我们将详细介绍苹果证书过期的原理和影响,并提供一些解决方法。 苹果证书的原理 苹…

CleanMyMacX4.14.6如何清理mac垃圾内存

一直以来,苹果电脑的运行流畅度都很好,但是垃圾内存多了磁盘空间慢慢变少,还是会造成卡顿的。这篇文章就告诉大家电脑如何清理垃圾内存,电脑如何清理磁盘空间。 一、电脑如何清理垃圾内存 垃圾内存指的是各种缓存文件和系统垃圾…

C语言之找单身狗

个人主页(找往期文章包括但不限于本期文章中不懂的知识点): 我要学编程(ಥ_ಥ)-CSDN博客 题目: 在一个整型数组中,只有一个数字出现一次,其他数组都是成对出现的,请找出那个只出现一次的数字。…

IF=82.9!高分文献解读|吉西他滨联合顺铂化疗激活肿瘤免疫新机制

鼻咽癌(nasopharyngeal carcinoma, NPC)是一种发生于鼻咽部上皮细胞的恶性肿瘤,且高发于中国。吉西他滨联合顺铂(GP)化疗作为鼻咽癌的一种全球标准治疗方案,然而治疗的具体机制目前尚不清楚。中山大学肿瘤防…

摘录笔记——2024年2月5日

美团三年,总结的10条血泪教训在美团的三年多时光,如同一部悠长的交响曲,高高低低,而今离开已有一段时间。闲暇之余,梳理了三年多的收获与感慨,既是对过去一段时光的的一个深情回眸,也是对未来之…

旭华智能水文遥测终端机RTU

SV-RT8588低功耗测控终端,可采集、存储监测点传感器/仪表数据,通过4G/网口等通讯方式上传至监管平台,产品采用高性能32位处理器和工业级无线模块,接口类型丰富配置灵活,能满足不同场景下的各种需求;低功耗设…

北斗NTP同步时间服务器在五华县人民医院的应用、授时服务器、校时服务器

同步时间服务器,是针对自动化系统中的计算机、医疗仪器仪表、控制装置等进行校时的高科技产品,北斗时间服务器,从卫星上获取到时间信息,北斗时间服务器,内部将这些时间信息进行高科技的处理及转换,为医院的数字化管理提供精确时间保证。各办公…

idea2023创建spring项目无法选择Java8

idea2023创建spring项目无法选择Java8 今天下载了新版的idea 2023.3.2,但是在创建springboot项目的时候只能选择Java17和Java21,没法选择其他的版本。 使用下面阿里云的地址替换Server URL中的start.spring.io的地址即可 https://start.aliyun.com/替…

力扣● 62.不同路径 ● 63. 不同路径 II

● 62.不同路径 单解这道题的话,发现第一行或者第一列的这些位置,都只有一条路径走到,所以路径条数都是1。这就是初始化。坐标大于第一行第一列的这些位置,因为机器人只能向下/向右走,所以只能从上个位置向下走和从左…

文心一言4.0API接入指南

概述 文心一言是百度打造出来的人工智能大语言模型,具备跨模态、跨语言的深度语义理解与生成能力,文心一言有五大能力,文学创作、商业文案创作、数理逻辑推算、中文理解、多模态生成,其在搜索问答、内容创作生成、智能办公等众多…

jmeter二次开发函数-生成身份证号

代码参考这个 java 随机生成身份证代码 Java的身份证号码工具类 pom文件添加 <dependency><groupId>org.apache.jmeter</groupId><artifactId>ApacheJMeter_core</artifactId><version>5.4.1</version></dependency><d…

@ResponseBody

目录 概述 用途 使用案例 用 ResponseBody 设置返回值 概述 ResponseBody注解的作用是将方法返回的对象&#xff0c;通过适当的转换器(HttpMessageConverter)转换为指定的格式之后&#xff0c;写入到response对象的body区&#xff0c;通常用来返回JSON数据或者是XML数据 用…

transformers重要组件(模型与分词器)

1、模型&#xff1a; from transformers import AutoModelcheckpoint "distilbert-base-uncased-finetuned-sst-2-english" model AutoModel.from_pretrained(checkpoint) 除了像之前使用 AutoModel 根据 checkpoint 自动加载模型以外&#xff0c;我们也可以直接…

mhz_c1f

信息收集 探测到存活主机的IP地址为 192.168.101.32 # nmap -sT --min-rate 10000 -p- 192.168.101.32 -oN port.nmap Starting Nmap 7.94 ( https://nmap.org ) at 2024-02-03 13:41 CST Nmap scan report for 192.168.101.32 Host is up (0.0020s latency). Not shown: 6553…

高阶滤波器

一阶后向差分&#xff1a;s&#xff08;1-z^(-1)&#xff09;/T dx/dt[x(k)-x(k-1)]/T[x(k)-x(k)z^(-1)]/Tx(k)*&#xff08;1-z^(-1)&#xff09;/T 一阶前向差分&#xff1a;s(z-1)/T dx/dt[x(k1)-x(k)]/T[z*x(k)-x(k)]/Tx(k)*(z-1)/T 双线性差分&#xff1a;s(2/T)*(1-z…

环境配置:Udacity的Self-Driving项目安装运行

前言 Udacity的自动驾驶工程师纳米学位项目&#xff08;Self-Driving Car Engineer Nanodegree Program&#xff09;是一项面向学习者的前沿技术项目&#xff0c;旨在提供全面的自动驾驶工程师培训。该项目由Udacity与自动驾驶领域的领先公司和专业人士合作开发&#xff0c;涵…

常用的EasyExcel表格处理-2(动态合并、自适应宽高)

EasyExcel官网&#xff1a;点击查看 1、动态合并单元格 此处主要根据自定义处理类ExcelFillCellMergeStrategy进行处理&#xff0c;具体内容可看代码注释。 1.1 前端调用controller PostMapping("/download/template")public void toDoExport(HttpServletResponse…

linux k8s 源码编译及单集群测试

目录 概述实践安装插件docker 在线安装containerd安装二进制安装yum安装修改containder配置文件 cnietcdrsyncgo设置golang代理 安装CFSSL下载kubernetes代码编译启动本地单节点集群问题k8s没有被正常启动该如何k8s正常启动日志测试 结束 概述 此文详细说明在 centos 7上编译 k…

専攻春节钜惠

専攻春节钜惠 大家好&#xff0c;新春佳节到来之际&#xff0c;为了答谢大家多年来的支持厚爱&#xff0c;也为了更广泛的推广VBA应用&#xff0c;“VBA语言専攻”在春节期间再次推出钜惠活动&#xff0c;时间2月9日到2月17日&#xff08;大年三十到正月初八&#xff09; 1 &…

算法学习——LeetCode力扣数组篇

算法学习——LeetCode力扣数组篇 704. 二分查找 704. 二分查找 - 力扣&#xff08;LeetCode&#xff09; 描述 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值…