【Docker】Docker如何构建自己的镜像?从镜像构建到推送远程镜像仓库图文教程

news2024/11/16 11:49:46

请添加图片描述

专栏往期文章

  1. 《Docker是什么?Docker从介绍到Linux安装图文详细教程》
  2. 《30条Docker常用命令图文举例总结》

本期目录

  • 专栏往期文章
  • 1. 构建镜像
  • 2. 本地镜像发布到公有云
  • 3. 本地镜像发布到私有云


1. 构建镜像

提交构建镜像的命令如下:

$ docker commit -m="提交描述信息" -a="作者" 容器ID 目标镜像名称:[TAG]

举例:本节我们将自己构建一个带 Vim 编辑工具的 Ubuntu 镜像。从官网下载的 base Ubuntu 镜像,里面是没有 Vim 工具的,那么我可以在 base Ubuntu 镜像的基础上,增加 Vim 工具,再构建出一个带 Vim 的 Ubuntu 镜像,使其天生带有 Vim ,在这个镜像创建的容器都会带有 Vim 。

前台交互式启动一个 Ubuntu 容器。

$ docker run -it ubuntu:latest /bin/bash

image-20221212095117439

尾号 5731 的 Ubuntu 容器是不带 Vim 编辑工具的。

$ vim

image-20221212095237871

安装 Vim 之前,先更新包管理工具 apt-get ( Ubuntu 一般用的是 apt-get ) 。

$ apt-get update

image-20221212095741618

然后,在这个容器中安装 Vim 。

$ apt-get -y install vim

安装完成后,测试 Vim 。

$ vim a.txt

image-20221212095955451

能够进入编辑页面,Vim 安装成功。

image-20221212100111355

键盘按下 Ctrl + P + Q 让 Ubuntu 容器保持运行退出容器。

image-20221212100657043

接下来是本节的核心内容,把带 Vim 的 Ubuntu 容器 Commit 成镜像。镜像构建成功后,返回镜像 ID 。

$ docker commit -m="add vim cmd" -a="xiesh" 45ce35485731 ouc/myubuntu:1.0

image-20221212100834183

此时列出所有镜像,可以看到成功构建了镜像。由于添加了 Vim 编辑工具,我们构建的 Ubuntu 镜像大小已经从官方原来的 72.8 MB 扩大到 181 MB 。这就是镜像分层带来的好处,可以基于最简单的 base 镜像,像搭积木一样一层一层往上加自己需要的程序和软件,最终构建出功能越来越强大的镜像。

image-20221212100941360

【总结】Docker 中的镜像分层,支持通过扩展现有的镜像,创建新的镜像。类似于 Java 继承于一个 Base 基础类,自己再按需扩展。新镜像是从 base 镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层。

image-20221212101716665


2. 本地镜像发布到公有云

本节把刚刚构建的带 Vim 的 Ubuntu 镜像发布到阿里云 (公有云) ,这样别的开发者就可以拉取你制作的镜像使用了,服务广大人民群众。

首先登录阿里云官网 https://www.aliyun.com/ ,点击【控制台】。

image-20221210205236753

点击【容器镜像服务】。

image-20221210205446586

进入【个人实例】。

image-20221212103621201

设置密码。

image-20221212103748082

先创建命名空间,点击【命名空间】,点击【创建命名空间】。

image-20221212104043952

image-20221212104206031

设为【公开】开源给大家。

image-20221212104258030

点击【镜像仓库】。

image-20221212103857660

点击【创建镜像仓库】。

image-20221212104645427

然后选择【本地仓库】上传,直接【创建镜像仓库】。

image-20221212104750356

image-20221212104824569

把本地镜像推送到阿里云镜像仓库,推送脚本可从上面的管理页面复制。首先登录到阿里云的远程仓库。

$ docker login --username=xiesh registry.cn-hangzhou.aliyuncs.com

image-20221212105138502

设置 Tag 。

$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/ouc-xsh/myubuntu1.0:[镜像版本号]

推送到阿里云远程库。

$ docker push registry.cn-hangzhou.aliyuncs.com/ouc-xsh/myubuntu1.0:[镜像版本号]

image-20221212105536578

到此就成功把本地镜像推送到阿里云了。

为了验证,我们接下来从阿里云镜像仓库拉取镜像到本地仓库。先把本地仓库中的 Ubuntu 镜像删除。

$ docker rmi -f b9b636ea0a65

image-20221212105954061

拉取镜像到本地。

$ docker pull registry.cn-hangzhou.aliyuncs.com/ouc-xsh/myubuntu1.0:1.0

image-20221212110137572

拉取成功。创建容器,并尝试使用 Vim 编辑文本。

$ docker run -it b9b636ea0a65 /bin/bash
$ vim a.txt

image-20221212110313678

image-20221212110357309

说明我们构建的带 Vim 的 Ubuntu 镜像成功推送到阿里云远程库,并可以正常拉取镜像和创建容器。


3. 本地镜像发布到私有云

在企业中,为了安全,构建的镜像绝大部分都是推送到企业内部的私有云镜像仓库中。Docker Registry 是官方提供的工具,可以用于构建私有镜像仓库。

本节把刚刚构建的带 Vim 的 Ubuntu 镜像发布到私有云作为演示。

  1. 首先下载镜像 Docker Registry 。
$ docker pull registry

image-20221212111314639

  1. 运行私有库 Registry 容器,相当于本地有个私有的 Docker Hub。
$ docker run -d -p 5000:5000 -v /root/myregistry/:/tmp/registry --privileged=true registry:latest

image-20221212154909160

其中,-d 表示后台守护式运行;-p 5000:5000 表示把容器的 5000 端口映射到宿主机的 5000 端口端口上;-v 表示把容器中 /tmp/registry 目录下的数据同步到宿主机的 /root/myregistry 目录中;--priviledged=true 表示扩大容器的权限解决挂载目录没有权限的问题 。

默认情况下,仓库被创建在容器的 /var/lib/registry 目录下,建议自行用容器卷映射,方便与宿主机联调。

  1. 创建一个新 Ubuntu 镜像,Ubuntu 安装 ifconfig 命令。
$ docker run -it --name=u1 ubuntu:latest /bin/bash

image-20221212155321230

安装 ifconfig 之前,先更新包管理工具 apt-get ( Ubuntu 一般用的是 apt-get ) 。

$ apt-get update

image-20221212095741618

然后,在这个容器中安装 ifconfig 命令。

$ apt-get -y install net-tools

image-20221212160035863

安装完成后,测试 ifconfig 。能看到这个 Ubuntu 容器内部的 IP 信息。

$ ifconfig

image-20221212160134484

安装完成后,commit 我们自己构建的新镜像。

$ docker commit -m="add ifconfig cmd" -a="xiesh" cbcc904f1be5 ouc/myubuntu:1.1

image-20221212160606232

  1. Curl 验证私服库上有什么镜像。

接下来我们是想把构建的带 ifconfig 命令的 Ubuntu 镜像推送到本地的 Docker Registry 私有仓库中。首先我们要查看该私有库中有什么镜像。

$ curl -XGET http://192.168.168.101:5000/v2/_catalog

image-20221212161021748

可以看到私服仓库是空的,里面没有任何镜像。

  1. 将新镜像 ouc/myubuntu:1.1 修改成符合私服规范的 Tag 。
$ docker tag 镜像:Tag Host:Port/Registry:Tag

注意,这里要写自己的 host 主机 IP 地址。

使用该命令将 ouc/myubuntu:1.1 这个镜像修改为 192.168.168.101:5000/ouc/myubuntu:1.1

$ docker tag ouc/myubuntu:1.1 192.168.168.101:5000/ouc/myubuntu:1.1

image-20221212161633843

  1. 修改配置文件使之支持 HTTP 协议。

由于 Docker Registry 做了安全加固,默认不支持 HTTP 协议的推送。因此我们要取消此限制。

$ cat /etc/docker/daemon.json

image-20221212162159307

registry-mirrors 配置的是国内阿里云提供的镜像加速地址,不用的话访问官网会很慢。

我们要在这个文件中新增内容。注意 JSON 格式要加逗号分隔。

$ vim /etc/docker/daemon.json

image-20221212162631442

:wq 保存退出,如果修改完后不生效,建议重启 Docker 和 registry 容器。

$ systemctl restart docker
$ docker start d035810c65ef
  1. push 推送到私服库。
$ docker push 192.168.168.101:5000/ouc/myubuntu:1.1

image-20221212163423435

  1. curl验证私服上有什么镜像。这次私服仓库中就有刚刚推送的镜像了。
$ curl -XGET http://192.168.168.101:5000/v2/_catalog

image-20221212163703345

  1. pull 拉取到本地并运行。

先删除本地仓库的镜像。

$ docker rmi -f 192.168.168.101:5000/ouc/myubuntu:1.1

image-20221212164008627

从私服仓库中拉取镜像到本地。

$ docker pull 192.168.168.101:5000/ouc/myubuntu:1.1

image-20221212164120584

运行这个镜像,创建容器。并使用 ifconfig 命令。

$ docker run -it a73412a51b67 /bin/bash
$ ifconfig

image-20221212164322821

拉取的镜像创建的容器可以成功运行 ifconfig 命令。至此,我们又获得了一个增加了 ifconfig 命令的 Ubuntu 镜像。

从此以后,你编写的微服务就可以打包成镜像,推送到公司的私服仓库中。如果新入职的同事来了,可以装个逼,我们公司一切在云端,处处是容器,在容器下进行云原生的开发。

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

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

相关文章

大二学生《web课程设计》中华英雄人物介绍袁隆平HTML+CSS+JavaScript(期末考核大作业)

🎉精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

2021年网络安全省赛--服务器内部信息获取解析(中职组)

2021年省赛服务器内部信息获取解析 任务环境说明:Linux20210510 服务器场景操作系统:未知 (关闭连接) 服务器场景操作系统:Linux(封闭靶机) 用户名:test密码:123456 1.收集服务器场景中的服务信息。并获取服务器中开放的端口号信息,将服务器端口号作为flag提交…

GCN解读并附数据处理代码

此文GCN不是之前提到的lightGCN,而是真正的GCN图卷积,这个问题源于paper分类,同样是GAT所用的数据,其中paper之前的引用关系构成了图的边信息,之所以称之为半监督,并不是因为部分paper没有label及embedding信息&#x…

Nacos--命名空间、分组、ID的概念及用法

原文网址:Nacos--命名空间、分组、ID的概念及用法_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Nacos的命名空间、分组、ID的概念及用法。 Nacos通过命名空间(Namespace)分组(Group)应用(Data ID或Name&#…

在Maix duino开发板上实现LED闪烁

文章目录简单介绍编程实现效果展示后简单介绍 如果你还不知道如何点亮LED,请看:点亮LED 今天开始上手在开发板上运行程序了,学习点亮LED灯就像是学习编程语言的Hello,worldHello, worldHello,world。学会电亮一盏LED灯之后,我便…

深度学习中计算量和参数量介绍、实现代码、例子

计算量 参数量 模型内存前言1 计算量和参数量2 统计计算量、参数量和模型内存3 源码分享3.1 thop实现3.2 ptflops实现pytorch_model_summary实现各层参数量统计4 总结前言 理清FLOPS和FLOPs,大写S代表的是显卡的运算性能,小写s代表的是模型的运算次数&a…

异构混排在vivo互联网的技术实践

作者:vivo 互联网算法团队- Shen Jiyi 本文根据沈技毅老师在“2022 vivo开发者大会"现场演讲内容整理而成。 混排层负责将多个异构队列的结果如广告、游戏、自然量等进行融合,需要在上下游和业务多重限制下取得最优解,相对复杂和难以控制…

基于外业移动端GIS+CAD在工程行业中的应用

摘要: 本文以广东九建某某高校施工项目前期准备和施工验证工作为依托,以图新地球精准导入CAD为研究对象,总结了一套相对成熟且完善的应用技术。该应用技术能在实际地形和现状数据中迅速找到施工点的大致位置,为前期工程勘测争取足…

【云原生消息中间件】RocketMQ消费者启动(consumer start)流程

目录 一、前言 二、消费者启动(consumer start)流程 1、RocketMQPushConsumer初始化 1.1、InitializingBean的afterPropertiesSet() 实现 1.2、RocketMQPushConsumer初始化 2、DefaultMQPushConsumer#start()逻辑 3、defaultMQPushConsumerImpl.start()逻辑 3.1、预设置…

哈希表题目:“气球”的最大数量

文章目录题目标题和出处难度题目描述要求示例数据范围解法思路和算法代码复杂度分析题目 标题和出处 标题:“气球”的最大数量 出处:1189. “气球”的最大数量 难度 2 级 题目描述 要求 给你一个字符串 text\texttt{text}text,你需要…

无线通信信号传输模型

1. 概述 在移动通信网的规划阶段和网络优化期间,最重要的传播问题是路径损耗,它代表大尺度传播特性,具有幂定律的传播特征。路径损耗是移动通信系统规划设计的一个重要依据,对蜂窝设计中的覆盖范围、信噪比、远近效应都有影响。因…

css色彩主题适配思路

网站主题,之前一直考虑的是通过替换css文件来实现,这种方式虽然可以,但不够方便。毕竟要写两套css主题,需要花费足够多的时间来适配。 后来琢磨出了一点东西出来,发现通过修改root里的css变量来实现,比较优…

计算机研究生就业方向之去银行券商信息技术部门

我一直跟学生们说你考计算机的研究生之前一定要想好你想干什么,如果你只是转码,那么你不一定要考研,至少以下几个职位研究生是没有啥优势的: 1,软件测试工程师(培训一下就行) 2,前…

NR HARQ(一)概述

HARQ是MAC层的快速重传机制,5G部分HARQ相关内容分布在38.331,38.321,38.213,38.214,38.212,38.211等spec中,这篇仅仅针对NR HARQ 进行简单的概括梳理。 NR中上下行HARQ均为异步HARQ;NR中每个HARQ反馈信息可以针对一个上/下行 TB块&#xff0c…

PDF文件怎么打印?分享两种打印方法

如何将PDF文件打印出来呢?大家在使用PDF文件的时候,在确定一份文件没有问题的时候,会选择将文件打印出来使用,有很多小伙伴身边有打印设备,但是不知道怎么打印,今天小编给大家分享两种打印方法,…

Resolution-robust Large Mask Inpainting with Fourier Convolutions 阅读笔记

基于傅里叶卷积的鲁棒分辨率大Mask修补 WACV 2022 论文链接 代码链接 图1:本文提出的方法可成功修复大区域,并很好处理具有复杂重复结构的图像。该方法在256256低分辨率下训练也能泛化到高分辨率图像上。 摘要: 现代图像修复技术主要受阻于大…

基于intel平台车载M12网管交换机方案,13路网口,支持bypass功能

概述:XM-5130是二层网管型以太网交换机,该产品前面板提供13路100M自适应以太网接口、4路车辆间带链路聚合及bypass功能的以太网接口,接口通过M12端子形式提供。该产品适用于振动、温度、湿度、电源波动变化大、电磁干扰复杂的恶劣工作环境。设…

传统大型国企云原生转型,如何解决弹性、运维和团队协同等问题?

作者:王彬、杏祉尧、黄枫 项目背景 贵州酒店集团有限公司于 2019 年 2 月 28 日注册成立,是经贵州省人民政府批准并授权省国资委履行出资人职责的省管大一型企业,全资及控股子企业 23 家,自营及委管酒店(项目&#x…

Nacos的持久化和集群部署

###目前网络模式为:bridge 1.docker mysql:5.7的持久化存储及远程连接 1.下拉镜像 docker pull mysql/mysql-server:5.7 注:后面的mysql标签是版本号,可选择,有:5.5/5.6/5.7/8.0 2.在宿主机中相关目录&#…

单片机内部组成

目录 中央处理器(CPU) 内部数据存储器(128B RAM) 内部程序存储器(4KB ROM) 定时/计数器 可编程I/O口 串行接口 中断控制系统 时钟电路 中央处理器(CPU) 中央处理器是单片机的…