当前位置: 首页 > news >正文

docker之程序镜像的制作

目录

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

  • 安装 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)。还有其他方式,有兴趣可以上网搜索。还有使用编程进行打包的方式,据说对技术要求较高,这里篇幅不易过长,后期有机会的话再做补充吧。

相关文章:

docker之程序镜像的制作

目录 一、每种资源的预安装(基础) 安装 nginx安装 redis 二、dockerfile文件制作(基础) 打包 redis 镜像 创建镜像制作空间制作dockerfile 打包 nginx 镜像 三、创建组合镜像(方式一) 生成centos容器并…...

Git - 每次 git pull/push 时需要账号和密码解决方案

问题描述 在提交项目代码或者拉取代码的时候,每次 git 都要输入用户名密码,很烦~ 解决方案 让服务器记下来用户名和密码,此时输入一次,以后再 git push /pull 的时候就不用再输账号和密码了 # 配置 git 记录用户名和密码 git c…...

C语言中在main函数之后运行的函数

在 Linux 平台上&#xff0c;atexit 函数同样是一个用于注册终止处理函数的库函数&#xff0c;它是 C 标准库 <stdlib.h> 的一部分。atexit 函数允许你注册一个或多个函数&#xff0c;这些函数会在 main 函数执行结束后&#xff0c;或者在调用 exit 函数时&#xff0c;由…...

pytorch训练指标记录之tensoboard,wandb

详解Tensorboard及使用教程_tensorboard怎么用-CSDN博客文章浏览阅读5.1w次&#xff0c;点赞109次&#xff0c;收藏456次。目录一、什么是Tensorboard二、配置Tensorboard环境要求安装三、Tensorboard的使用使用各种add方法记录数据单条曲线(scalar)多条曲线(scalars)直方图(hi…...

C语言——oj刷题——实现字符串逆序

当我们需要逆序一个字符串的内容时&#xff0c;可以通过C语言编写一个函数来实现。下面将详细介绍如何通过C语言实现这个功能&#xff0c;并附上代码示例。 1、实现原理 要逆序一个字符串的内容&#xff0c;可以使用两个指针来交换字符串中对应位置的字符。具体实现原理如下&am…...

空气质量预测 | Matlab实现基于SVR支持向量机回归的空气质量预测模型

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 政府机构使用空气质量指数 (AQI) 向公众传达当前空气污染程度或预测空气污染程度。 随着 AQI 的上升,公共卫生风险也会增加。 不同国家有自己的空气质量指数,对应不同国家的空气质量标准。 基于支持向量机(Su…...

Vue中的请求拦截器

目录 1 前言 2 使用方法 2.1 创建拦截器 2.2 引入拦截器 1 前言 我们常常会使用JWT令牌来验证登录&#xff0c;因此很多请求都需要携带JWT令牌&#xff0c;我们当然可以用{headers:{Authorization:xx}}的方式&#xff0c;向每个请求中都以这样的方式添加JWT令牌。不过这样…...

Java奠基】对象数组练习

目录 商品对象信息获取 商品对象信息输入 商品对象信息计算 商品对象信息统计 学生数据管理实现 商品对象信息获取 题目要求是这样的&#xff1a; 定义数组存储3个商品对象。 商品的属性&#xff1a;商品的id&#xff0c;名字&#xff0c;价格&#xff0c;库存。 创建三个…...

排序算法---快速排序

原创不易&#xff0c;转载请注明出处。欢迎点赞收藏~ 快速排序是一种常用的排序算法&#xff0c;采用分治的策略来进行排序。它的基本思想是选取一个元素作为基准&#xff08;通常是数组中的第一个元素&#xff09;&#xff0c;然后将数组分割成两部分&#xff0c;其中一部分的…...

算法||实现典型数据结构的查找、添加和删除数据 并分析其时间和空间复杂度

实现典型数据结构的查找、添加和删除数据 并分析其时间和空间复杂度 线性结构&#xff1a; 数组&#xff1a;是一种线性表数据结构&#xff0c;它用一组连续的内存空间&#xff0c;来存储一组具有相同类型的数据。 查找数据 &#xff1a;随机访问 流程图 /** 查询元素下标…...

【蓝桥杯冲冲冲】Invasion of the Milkweed G

【蓝桥杯冲冲冲】Invasion of the Milkweed G 蓝桥杯备赛 | 洛谷做题打卡day30 文章目录 蓝桥杯备赛 | 洛谷做题打卡day30[USACO09OCT] Invasion of the Milkweed G题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 题解代码我的一些话 [USACO09OCT] Invasion of the Mi…...

【JAVA WEB】 百度热榜实现 新闻页面 Chrome 调试工具

目录 百度热榜 新闻页面 Chrome 调试工具 --查看css属性 打开调试工具的方式 标签页含义 百度热榜 实现效果&#xff1a; 实现代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"vi…...

Linux——动静态库

基础知识:动vs静 类型动静加载时机运行时编译时可复用性多个文件只需要加载一份库文件每个文件都需要加载一份文件性能链接次数越多越有优势链接次数越少越有优势 代码编写 静态库 生成静态库 libmath.a:add.o sub.oar -rc $ $^%.o:%.cgcc -c $<使用静态库 头文件和工…...

Vulnhub靶机:hacksudo-search

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;hacksudo-search&#xff08;10.0.2.50&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://download.vulnhub.co…...

Leetcode 188 买卖股票的最佳时机 IV

题意理解&#xff1a; 给你一个整数数组 prices 和一个整数 k &#xff0c;其中 prices[i] 是某支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。也就是说&#xff0c;你最多可以买 k 次&#xff0c;卖 k 次。 注意&#xf…...

win32编程系统BUG(Win32 API中的WM_SETTEXT消息)

由于频繁使用Win32 API中的WM_SETTEXT消息&#xff0c;导致内存占用直线上升。 暂未找到有效解决方案。...

Linux防火墙开放

记录一次问题 写的网络服务无法通信 代码没问题&#xff0c;IP绑定、端口绑定没问题&#xff0c;就是无法进行通信&#xff0c;这里要分2步走。 服务器控制台开放 进入防火墙 添加规则&#xff0c;这里以开放udp的8899端口为例 这里在服务器后台就已经开放了&#xff0c;但此时…...

通过 docker-compose 部署 Flink

概要 通过 docker-compose 以 Session Mode 部署 flink 前置依赖 Docker、docker-composeflink 客户端docker-compose.yml version: "2.2" services:jobmanager:image: flink:1.17.2ports:- "8081:8081"command: jobmanagervolumes:- ${PWD}/checkpoin…...

HarmonyOS ArkTS修改App的默认加载的界面(二十)

前言&#xff1a;在Android开发中想要修改默认启动页&#xff0c;只需要在AndroidManifest.xml中设置即可 只需要在启动的activity种添加如下属性即可 <intent-filter><action android:name"android.intent.action.MAIN" /><category android:name&qu…...

【前端高频面试题--Vue基础篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;前端高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac;前端高频面试题--Vue基础篇 Vue基本原理双向绑定与MVVM模型Vue的优点计算属性与监听属性计算属性监…...

Spring Boot 实现热插拔 AOP

现在有这么一个需求:就是我们日志的开与关是交给使用人员来控制的,而不是由我们开发人员固定写死的。大家都知道可以用aop来实现日志管理,但是如何动态的来实现日志管理呢?aop源码中的实现逻辑中有这么一个步骤,就是会依次扫描Advice的实现类,然后执行。我们要做的就是自…...

2月05日,每日信息差

第一、全球首套5G及6G天地一体网络低轨试验卫星发射入轨、。据了解&#xff0c;“中国移动01星”是全球首颗可验证5G天地一体演进技术的试验卫星&#xff0c;它搭载的基站可以利用卫星的广覆盖优势把5G信号传送到地面网络无法覆盖到的地方&#xff1b;另外一颗“‘星核’验证星…...

使用Python进行数据的描述性分析,用少量的描述性指标来概括大量的原始数据

在进行数据分析时&#xff0c;当研究者得到的数据量很小时&#xff0c;可以通过直接观察原始数据来获得所有的信息。但是&#xff0c;当得到的数据量很大时&#xff0c;就必须借助各种描述性指标来完成对数据的描述工作。用少量的描述性指标来概括大量的原始数据&#xff0c;对…...

【JS逆向三】逆向某某网站的sign参数,并模拟生成仅供学习

逆向日期&#xff1a;2024.02.06 使用工具&#xff1a;Node.js 类型&#xff1a;webpack 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 可使用AES进行解密处理&#xff08;直接解密即可&#xff09;&#xff1a;AES加解密工具 1、打开某某…...

移动光猫gs3101超级密码及改桥接模式教程

文章目录 超级管理员账号改桥接模式路由器连接光猫&#xff0c;PPPOE拨号即可&#xff01;附录&#xff1a;如果需要改桥接的话不知道拨号密码咋办打开光猫Telnet功能Telnet 登录 参考文章 移动光猫吉比特GS3101超级账号获取更改桥接 移动光猫gs3101超级密码及改桥接模式教程 …...

leetcode 153

153 寻找旋转排序数组中的最小值 这道题&#xff0c;如果我们熟悉数组 api&#xff0c;可以直接用 Arrays.sort()秒杀&#xff0c;这个方法使用了双轴快速排序算法。 解法1如下&#xff1a; class Solution {public int findMin(int[] nums) {Arrays.sort(nums);return nums…...

【MySQL】数据库的基础——数据库的介绍、MySQL的介绍和架构、SQL分类、MySQL的基本使用、MySQL的存储引擎

文章目录 MySQL1. 数据库的介绍1.2 主流数据库 2. MySQL的介绍2.1 MySQL架构2.2 SQL分类2.3 MySQL的基本使用2.4 MySQL存储引擎 MySQL 1. 数据库的介绍 数据库&#xff08;Database&#xff0c;简称DB&#xff09;是按照数据结构来组织、存储和管理数据的仓库。它是长期存储在计…...

后端的技术设计文档

一、 背景 1.简介 2.业务规划(非必需) 3.工作项拆解 拆解成多个工作项&#xff0c;每个工作项&#xff0c;需要多少人力。 4.资源评估(非必需) 有没有新的服务 二、架构设计 1.架构图(非必需&#xff0c;新服务比较需要) 2.技术选型 SpringCloud、Redis、Mysql、Myba…...

Windows10安装PCL1.14.0及点云配准

一、下载visual studio2022 下载网址&#xff1a;Visual Studio: 面向软件开发人员和 Teams 的 IDE 和代码编辑器 (microsoft.com) 安装的时候选择"使用C的桌面开发“&#xff0c;同时可以修改文件路径&#xff0c;可以放在D盘。修改文件路径的时候&#xff0c;共享组件、…...

C语言第二十二弹---指针(六)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 指针 1. 回调函数是什么&#xff1f; 2、qsort使用举例 2.1、使用qsort函数排序整型数据 2.2 使用qsort排序结构体数据 3、qsort函数的模拟实现 总结 1. 回…...