Docker镜像的手动制作commit

news2024/12/23 11:09:47

目录

一、docker镜像说明

1.1 Docker镜像中有没有内核

1.2 为什么没有内核

1.3 容器中的程序后台运行会导致此容器启动后立即退出

1.4 Docker镜像的生命周期

1.5 制作镜像方式

二、 将现有容器通过docker commit手动构建镜像

2.1 基于容器手动制作镜像步骤

2.2 实战案例:基于busybox制作httpd镜像

2.3 实战案例:基于官方镜像生成的容器制作tomcat镜像

2.4 实战案例:基于CentOS的基础镜像利用yum安装手动制作nginx的镜像

2.5 实战案例:基于CentOS编译安装nginx镜像


一、docker镜像说明

1.1 Docker镜像中有没有内核

        从镜像大小上面来说,一个比较小的镜像只有1MB多点或几MB,而内核文件需要几十MB, 因此镜像里面是没有内核的,镜像在被启动为容器后将直接使用宿主机的内核。而镜像本身则只提供相应的rootfs,即系统正常运行所必须的用户空间的文件系统,比如: /dev/,/proc,/bin,/etc等目录,容器当中/boot目录是空的,而/boot当中保存的就是与内核相关的文件和目录。   

1.2 为什么没有内核

        由于容器启动和运行过程中是直接使用了宿主机的内核,不会直接调用物理硬件,所以也不会涉及到硬件驱动,因此也无需容器内拥有自已的内核和驱动。而如果使用虚拟机技术,对应每个虚拟机都有自已独立的内核。

1.3 容器中的程序后台运行会导致此容器启动后立即退出

        Docker容器如果希望启动后能持续运行,就必须有一个能前台持续运行的进程,如果在容器中启动传统的服务,如:httpd,nginx等均为后台进程模式运行,就导致 docker 在前台没有运行的应用,这样的容器启动后会立即退出。所以一般会将服务程序以前台方式运行,对于有一些可能不知道怎么实现前台运行的程序,只需要在你启动的该程序之后添加类似于 tail ,top 这种可以前台运行的程序即可. 比较常用的方法,如 tail -f /etc/hosts。

1.4 Docker镜像的生命周期

        docker build .构建dockerfile生成镜像,当在容器中,定制安装了一些软件,想要实现某些效果,可以手动实现,docker commit 容器id。docker save导出镜像,docker load 导入镜像。stop,start,restart是关闭开启重启容器。一个最基础的镜像有些功能没有,需要自己装,如vim都没有,要自己装。yum是有的,就可以使用yum装vim。yum install -y vim。

1.5 制作镜像方式

        Docker 镜像制作类似于虚拟机的镜像(模版)制作,即按照公司的实际业务需求将需要安装的软件、相关配置等基础环境配置完成,然后将其做成镜像,最后再批量从镜像批量生成容器实例,这样可以极大的简化相同环境的部署工作。

        Docker的镜像制作分为手动制作(基于容器)和自动制作(基于DockerFile),企业通常都是基于Dockerfile制作镜像。

二、 将现有容器通过docker commit手动构建镜像

2.1 基于容器手动制作镜像步骤

制作镜像有手动commit和自动dockerfile。

手动制作格式:

docker commit 格式

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

# REPOSITORY  软件名
# TAG         版本号

#选项  OPTIONS
-a, --author string     Author (e.g., "John Hannibal Smith <hannibal@ateam.com>")
-c, --change list       Apply Dockerfile instruction to the created image
-m, --message string    Commit message
-p, --pause             Pause container during commit (default true)


#说明:
制作镜像和CONTAINER状态无关,停止状态也可以制作镜像
如果没有指定[REPOSITORY[:TAG]],REPOSITORY和TAG都为<none>
提交的时候标记TAG号: 生产当中常用,后期可以根据TAG标记创建不同版本的镜像以及创建不同版本的容器

基于容器手动制作镜像步骤具体如下:

1.拉取一个系统的官方基础镜像,如:centos或ubuntu

2.基于基础镜像启动一个容器,并进入到容器

3.在容器中做陪孩子操作

3.1 安装基础命令

3.2 配置运行环境

3.3 安装服务和配置服务

3.4 放业务程序代码

4.提交为一个新镜像docker commit

5.基于自己的镜像创建容器并测试访问。

2.2 实战案例:基于busybox制作httpd镜像

格式:

BusyBox v1.36.1 (2023-05-18 22:34:17 UTC) multi-call binary.

Usage: httpd [-ifv[v]] [-c CONFFILE] [-p [IP:]PORT] [-u USER[:GRP]] [-r REALM] [-h HOME]
or httpd -d/-e/-m STRING

Listen for incoming HTTP requests

    -i        Inetd mode
    -f        Run in foreground  #前台运行
    -v[v]        Verbose
    -p [IP:]PORT    Bind to IP:PORT (default *:80)
    -u USER[:GRP]    Set uid/gid after binding to port
    -r REALM    Authentication Realm for Basic Authentication
    -h HOME        Home directory (default .)  #指定主站点, 否则是当前目录
    -c FILE        Configuration file (default {/etc,HOME}/httpd.conf)
    -m STRING    MD5 crypt STRING
    -e STRING    HTML encode STRING
    -d STRING    URL decode STRING

使用docker pull [镜像名] 拉取镜像到本地

初始镜像和容器:

启动busybox容器:

/ # mkdir /data/html -p                #新建主站点目录
/ # echo "test page" > /data/html/index.html        #新建站点目录
/ # httpd -f -h /data/html/                #-f前台启动 -h指定主站点

制作镜像: 

 

查看制作的镜像:

启动制作好的容器:

访问到了我们写的主页面。

2.3 实战案例:基于官方镜像生成的容器制作tomcat镜像

先拉取镜像:docker pull images

查看镜像:docker images

下载启动tomcat容器:docker run -d -p 8080:8080 tomcat

进入容器,修改:docker exec -it [容器id] bash

复制页面文件:

打包成镜像:

启动镜像: 

2.4 实战案例:基于CentOS的基础镜像利用yum安装手动制作nginx的镜像

启动容器:

修正时区 yum 源 : 

 在宿主机中下载Centos-8.repo:

[root@Node2 ~]#:wget http://mirrors.aliyun.com/repo/Centos-8.repo
--2024-08-01 16:41:50--  http://mirrors.aliyun.com/repo/Centos-8.repo
正在解析主机 mirrors.aliyun.com (mirrors.aliyun.com)... 58.221.32.237, 58.221.32.238, 58.221.32.239, ...
正在连接 mirrors.aliyun.com (mirrors.aliyun.com)|58.221.32.237|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:2590 (2.5K) [application/octet-stream]
正在保存至: “Centos-8.repo”

100%[===============================================================>] 2,590       --.-K/s 用时 0.006s  

2024-08-01 16:41:50 (426 KB/s) - 已保存 “Centos-8.repo” [2590/2590])

查看相关容器的id,使用docker cp命令将Centos-8.repo文件拷贝进容器。

进入容器中,把根下的Centos-8.repo文件移动到yum.repos.d下。

移动之后,如果使用yum源,如果一个repo文件找不到,不会遍历该文件夹下的repo文件,所以创建一个文件夹bak,把原有的repo文件移动到bak中,只留下Centos-8.repo文件。

 安装nginx,修改配置文件:

 在全局设置中添加前台执行。

[root@6795422fabaf yum.repos.d]# vi /etc/nginx/nginx.conf
......
daemon off;
......

创建主页面:

echo "nginx test page in docker" > /usr/share/nginx/html/index.html

打包成镜像: 

docker commit -a "auth" -m 'yum nginx' -c "EXPOSE 80 443" c1 centos:nginx-v1

启动容器:

docker run -d -p 80:80 --name n1 centos:nginx-v1 nginx

后面的nginx是命令,启动nginx服务。

2.5 实战案例:基于CentOS编译安装nginx镜像

在CentOS 基础镜像的容器之上手动编译安装nginx,然后再将此容器提交为镜像

编译安装分以下几步:13步

2.5.1 运行centos

由于是系统类镜像,加一个tail -f持续运行,容器就不会停止。

[root@Node2 ~]#:docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@Node2 ~]#:
[root@Node2 ~]#:docker run -d --name c1 centos:latest tail -f /etc/passwd
581180384bf7a52ee6983217d91b1d24c27f08243b015be230bb8d66634bf0fe
[root@Node2 ~]#:
[root@Node2 ~]#:docker ps -a
CONTAINER ID   IMAGE           COMMAND                 CREATED         STATUS         PORTS     NAMES
581180384bf7   centos:latest   "tail -f /etc/passwd"   5 seconds ago   Up 4 seconds             c1

把本地的源复制到容器中的/下,yum下载源能够正常使用。

[root@Node2 ~]#:ll Centos-8.repo 
-rw-r--r--. 1 root root 2590 8月   4 2022 Centos-8.repo
[root@Node2 ~]#:docker cp Centos-8.repo c1:/
Successfully copied 4.61kB to c1:/

2.5.2 安装依赖包

依赖包要先修改源。才能使用yum。

[root@Node2 ~]#:docker exec -it c1 bash
[root@581180384bf7 /]# ls
Centos-8.repo  dev  home  lib64       media  opt   root  sbin  sys  usr
bin	       etc  lib   lost+found  mnt    proc  run	 srv   tmp  var
[root@581180384bf7 /]# mkdir /etc/yum.repos.d/bak
[root@581180384bf7 /]# mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak
[root@581180384bf7 /]# mv Centos-8.repo /etc/yum.repos.d/

 下载依赖包,包括vim,wget

[root@581180384bf7 /]# yum -y install gcc gcc-c++ make automake pcre pcre-devel zlib  zlib-devel openssl openssl-devel wget vim net-tools
......
  vim-common-2:8.0.1763-16.el8.x86_64                                                                    
  vim-enhanced-2:8.0.1763-16.el8.x86_64                                                                  
  vim-filesystem-2:8.0.1763-16.el8.noarch                                                                
  wget-1.19.5-10.el8.x86_64                                                                              
  which-2.21-16.el8.x86_64                                                                               
  zlib-devel-1.2.11-17.el8.x86_64                                                                        

Complete!

 2.5.3 修改时区

时区是配置文件/etc/localtime起作用。

2.5.4 创建一个用户

[root@581180384bf7 /]# useradd -r -s /sbin/nologin nginx

2.5.5 下载nginx包

wget http://nginx.org/download/nginx-1.18.0.tar.gz

[root@581180384bf7 /]# wget http://nginx.org/download/nginx-1.18.0.tar.gz
......
nginx-1.18.0.tar.gz        100%[=====================================>]   1015K   997KB/s    in 1.0s    

2024-08-01 18:22:55 (997 KB/s) - ‘nginx-1.18.0.tar.gz’ saved [1039530/1039530]

2.5.6 解压编译安装到指定目录

[root@581180384bf7 /]# ls
bin  etc   lib	  lost+found  mnt		   opt	 root  sbin  sys  usr
dev  home  lib64  media       nginx-1.18.0.tar.gz  proc  run   srv   tmp  var
[root@581180384bf7 /]# tar xf nginx-1.18.0.tar.gz 
[root@581180384bf7 /]# cd nginx-1.18.0
[root@581180384bf7 nginx-1.18.0]# ./configure --prefix=/apps/nginx
......

 编译安装:

[root@581180384bf7 nginx-1.18.0]# make && make install
......
test -d '/apps/nginx/logs' \
	|| mkdir -p '/apps/nginx/logs'
make[1]: Leaving directory '/nginx-1.18.0'

2.5.7 修改为前台启动

[root@581180384bf7 nginx-1.18.0]# vim /apps/nginx/conf/nginx.conf
......

daemon off;
......

2.5.8 绝对路径,检查语法

[root@581180384bf7 nginx-1.18.0]# /apps/nginx/sbin/nginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful

 

2.5.9 获取IP地址

[root@581180384bf7 nginx-1.18.0]# hostname -I
172.17.0.2

2.5.10 绝对路径启动服务

[root@581180384bf7 nginx-1.18.0]# ss -natp | grep 80
[root@581180384bf7 nginx-1.18.0]# 
[root@581180384bf7 nginx-1.18.0]# /apps/nginx/sbin/nginx

再开一个终端:进入容器,绝对路径启动后,查看80端口:

 可以看到容器内部访问nginx服务成功。

打包成镜像:

[root@Node2 ~]#:docker commit -m "nginx1.8.0" -c "CMD /apps/nginx/sbin/nginx" 581180384bf7 nginx1.18.0-centos8:v1
sha256:5f0b53d14c2a10d693e3e35247a531bbdc6da2aa5e5e455875428119d677ae63
[root@Node2 ~]#:
[root@Node2 ~]#:docker images
REPOSITORY            TAG        IMAGE ID       CREATED             SIZE
nginx1.18.0-centos8   v1         5f0b53d14c2a   7 seconds ago       583MB
centos                nginx-v1   04ea6a202135   About an hour ago   343MB
tomcat                10.0.14    726200e5bb17   3 hours ago         684MB
httpd-b               1.0        760a661b0b57   3 hours ago         1.24MB
httpd-busybox         v1.0       5329ca751e9c   4 hours ago         1.24MB
busybox               latest     beae173ccac6   2 years ago         1.24MB
nginx                 latest     605c77e624dd   2 years ago         141MB
tomcat                latest     fb5657adc892   2 years ago         680MB
mysql                 5.7.29     3218b38490ce   2 years ago         516MB
httpd                 latest     dabbfbe0c57b   2 years ago         144MB
alpine                latest     c059bfaa849c   2 years ago         5.59MB
centos                latest     5d0da3dc9764   2 years ago         231MB

此时,镜像中就成了我们基于centos编译安装的nginx镜像。

测试:启动容器:

由于该容器里面运行着nginx。运行容器时我们指定了端口映射,90:80。我们可以测试访问一下本地的90端口。是否成功。

发现是可以访问运行的这个镜像的。

---end---

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

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

相关文章

【卷积神经网络】池化层【计算和python代码】

文章目录 1、简介2、池化层计算3、Stride4、Padding5、多通道池化计算6、数学公式⭐7、PyTorch 池化 API 使用7.1、形状调整7.2、最大和平均池化7.3、调整stride步长7.4、padding填充7.5、多通道池化7.6、完整代码⭐ 8、小结 &#x1f343;作者介绍&#xff1a;双非本科大三网络…

[Docker][Docker NetWork][上]详细讲解

目录 1.为什么需要网络管理2.Docker 网络架构简介0.铺垫说明1.CNM2.Libnetwork3.驱动 3.常见网络类型1.bridge 网络2.host 网络3.container 网络4.none 网络5.overlay 网络 1.为什么需要网络管理 容器的网络默认与宿主机及其他容器都是相互隔离&#xff0c; 但同时也要考虑以下…

Node污染 (Node.js)

&#x1f3bc;个人主页&#xff1a;金灰 &#x1f60e;作者简介:一名简单的大一学生;易编橙终身成长社群的嘉宾.✨ 专注网络空间安全服务,期待与您的交流分享~ 感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持&#xff01;❤️ &#x1f34a;易编橙终身成长社群&#…

C语言指针(Pointer)

指针与底层硬件联系紧密&#xff0c;使用指针可操作数据的地址&#xff0c;实现数据的间接访问 问题&#xff1a;这好好的一个变量&#xff0c;我定义完之后为啥不用它名字直接访问呢&#xff1f;我非要用间接访问&#xff0c;这不没事找事吗&#xff1f; 为什么需要指针? …

18.C语言函数相关练习题2

函数相关练习题2 1.不同班级的平均分2.二维数组和函数的概念3.外部变量和全局变量4.全局变量的例子5.输入10个数&#xff0c;找出最大数及最大数的下标 1.不同班级的平均分 #include <stdio.h>void inityarry(int arr[],int len){int i;for(i0;i<len;i){printf("…

【第八天】DNS及其查询过程

DNS及其查询过程 什么是DNS&#xff1f; 一般我们的主机&#xff0c;服务器都有一个ip地址&#xff0c;例如10.10.10.1。在计算机层面&#xff0c;如果我们要发送请求的话&#xff0c;首先就要知道我们的目标&#xff0c;也就是对方的ip地址。而IP地址很难记&#xff0c;比如…

初学者编程指南:方法与资源推荐

一、引言 编程已成为当代大学生的必备技能&#xff0c;但面对众多编程语言和学习资源&#xff0c;新生们常常感到迷茫。如何选择适合自己的编程语言&#xff1f;如何制定有效的学习计划&#xff1f;如何避免常见的学习陷阱&#xff1f;编程不仅是技术领域的一项基本技能&#…

H.264编码中的16x16宏块分析

&#x1f60e; 作者介绍&#xff1a;欢迎来到我的主页&#x1f448;&#xff0c;我是程序员行者孙&#xff0c;一个热爱分享技术的制能工人。计算机本硕&#xff0c;人工制能研究生。公众号&#xff1a;AI Sun&#xff08;领取大厂面经等资料&#xff09;&#xff0c;欢迎加我的…

快速索引alarm添加

快速索引alarm添加 添加预警alarm 文件夹和 temp_led.c , temp_led.h , humi_led.c, humi_led.h (1)点击品字, 添加alarm, 然后增加文件, 点进Source文件夹 (2)点击新建文件夹, 然后新建alarm文件夹 (3)把文件类型切换为all, 方便后续右键添加上述四个文件名字. (4)空白处, 右…

社区团购的全流程解析与开源AI智能名片S2B2C商城小程序的应用探索

摘要&#xff1a;随着互联网技术的飞速发展&#xff0c;社区团购作为一种新兴的电商模式&#xff0c;凭借其高效、便捷、低成本的优势迅速崛起。本文旨在深入探讨社区团购的交易全流程&#xff0c;并以开源AI智能名片S2B2C商城小程序为例&#xff0c;分析其在社区团购中的创新应…

Nginx进阶-常见配置

一、nginx Proxy 反向代理 1、代理原理 反向代理产生的背景&#xff1a; 在计算机世界里&#xff0c;由于单个服务器的处理客户端&#xff08;用户&#xff09;请求能力有一个极限&#xff0c;当用户的接入请求蜂拥而入时&#xff0c;会造成服务器忙不过来的局面&#xff0c…

计算机毕业设计选题推荐-预制菜平台-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

传输限速的方案那么多,却都没有这一个全面

在很多行业和领域&#xff0c;传输速度并不是无限制地越快越好&#xff0c;反而基于很多原因&#xff0c;在很多情况下&#xff0c;需要对传输的速度进行限制&#xff0c;原因如下&#xff1a; 带宽分配&#xff1a;在有限的网络资源下&#xff0c;对传输进行限速可以确保关键…

MIT-离散数学笔记

离散数学 PropositionEx 1:Ex 2:Ex 3:Ex 4:Ex 5:Ex 6:Ex 7:Ex 8: Proposition In mathematics, we have a mathematical proof is a verification of a proposition by a chain of logical deductions from a set of axioms. 在数学中&#xff0c;数学证明是通过一组公理的一系…

强化学习-alphazero 算法理论

一、算法简介 简单地说&#xff0c;AlphazeroMCTS SL(策略网络价值网络) Selfplay resnet。 其中MCTS指的是蒙特卡洛树搜索&#xff0c;主要用于记录所有访问过的棋盘状态的各种属性&#xff0c;包括该状态访问次数&#xff0c;对该状平均评价分数等。 SL指监督学习算法&…

PCDN技术如何提高数据传输的可靠性?

PCDN技术通过以下方式提高数据传输的可靠性: 1.负载均衡与故障转移: PCDN系统具备负载均衡的能力&#xff0c;可以根据节点的负载情况动态分配请求&#xff0c;避免单点故障和过载情况。此外&#xff0c;当某个节点发生故障时&#xff0c;PCDN可以迅速将流量转移到其他可用节…

OpenAI推出GPT-4o长输出版版本

&#x1f989; AI新闻 &#x1f680; OpenAI推出GPT-4o长输出版版本 摘要&#xff1a;OpenAI宣布正在测试每次请求可输出最多64K tokens的GPT-4o长输出版版本&#xff0c;目前仅Alpha测试参与者可使用。该版本推理成本较高&#xff0c;定价每百万tokens输入6美元&#xff0c;…

从微架构到向量化--CPU性能优化指北

引入 定位程序性能问题&#xff0c;相信大家都有很多很好的办法&#xff0c;比如用top/uptime观察负载和CPU使用率&#xff0c;用dstat/iostat观察io情况&#xff0c;ptrace/meminfo/vmstat观察内存、上下文切换和软硬中断等等&#xff0c;但是如果具体到CPU问题&#xff0c;我…

用于跟踪个人图书馆的BookLogr

什么是 BookLogr &#xff1f; BookLogr 是一款网络应用&#xff0c;旨在帮助您轻松管理个人图书馆。这项自托管服务可确保您完全控制数据&#xff0c;提供安全且私密的方式来跟踪您拥有、阅读或希望阅读的所有书籍。您也可以选择向公众自豪地展示您的图书馆&#xff0c;与您的…