Docker 构建镜像并搭建私人镜像仓库教程

构建镜像教程

步骤 1:安装 Docker

#在安装 Docker 之前,建议先更新系统软件包。
sudo yum update -y

# 移除旧的Docker版本和Podman、runc软件包及其相关依赖。
yum remove -y docker docker-client docker-client-latest docker-ce-cli docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine podman runc

#清理旧缓存并重新生成
yum clean all
yum makecache

# 安装必要的依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2

# 添加Docker仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 指定版本安装Docker
yum install -y docker-ce-20.10.24 docker-ce-cli-20.10.24 containerd.io

# 启动并设置Docker开机自启
sudo systemctl start docker
sudo systemctl enable docker

#使用以下命令验证 Docker 是否安装成功:
docker --version

# 安装 wget工具
yum install -y wget

# 关闭并禁用防火墙
systemctl stop firewalld
systemctl disable firewalld

# 禁用SELinux 策略
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

#查看Docker服务的状态
sudo systemctl status docker

#添加镜像加速器
# 创建目录
mkdir -p /etc/docker
# 复制内容
tee /etc/docker/daemon.json <<-'EOF'
{
   "registry-mirrors": [
       "http://hub-mirror.c.163.com",
       "https://mirrors.tuna.tsinghua.edu.cn",
       "http://mirrors.sohu.com",
       "https://ustc-edu-cn.mirror.aliyuncs.com",
       "https://2yzmpomi.mirror.aliyuncs.com",
       "https://ccr.ccs.tencentyun.com",
       "https://docker.m.daocloud.io",
       "https://docker.awsl9527.cn",
       "https://do.nark.eu.org",
       "https://dc.j8.work",
       "https://dockerproxy.com",
       "https://docker.mirrors.ustc.edu.cn",
       "https://docker.nju.edu.cn",
       "https://docker.1panel.live/",
       "https://noohub.ru",
       "https://huecker.io",
       "https://dockerhub.timeweb.cloud",
       "http://hub.urlsa.us.kg",
       "http://hub.haod.eu.org",
       "http://hub.chxza.eu.org",
       "http://ccoc.eu.org"
   ]
}
{
  "dns": ["8.8.8.8", "8.8.4.4"]
}
EOF
# 重新加载配置
systemctl daemon-reload
# 重启Docker
systemctl restart docker

#通过运行hello-world 映像来验证是否正确安装了Docker Engine 。
sudo docker run hello-world

#显示 Docker 系统信息
docker info

步骤 2:编写 Dockerfile

#Dockerfile 是 Docker 镜像构建的核心文件,它包含了如何创建镜像的所有指令,一定要注意,该文件名必须是Dockerfile且无后缀。
#示例 Dockerfile,创建一个新的目录并进入:
mkdir mydockerapp
cd mydockerapp

#在该目录下创建 Dockerfile 文件:
vim Dockerfile

#然后你可以编辑 Dockerfile 内容。例如,下面的 Dockerfile 安装了一个简单的 Apache HTTP 服务器:

# 使用官方的 CentOS 镜像作为基础镜像
FROM centos:8# 更新软件包并安装 Apache HTTP 服务器
RUN yum -y update && yum install -y httpd# 将当前目录下的代码复制到容器的 /var/www/html 目录
COPY ./index.html /var/www/html/# 设置容器启动时运行 Apache 服务
CMD ["httpd", "-D", "FOREGROUND"]# 暴露容器的 80 端口
EXPOSE 80

#这个 Dockerfile 会:
#使用 CentOS 8 镜像作为基础镜像
#安装 Apache HTTP 服务器
#将当前目录下的 index.html 文件复制到容器中
#设置容器启动时运行 Apache HTTP 服务器
#暴露容器的 80 端口

步骤 3:构建 Docker 镜像

#在包含 Dockerfile 文件的目录下,使用以下命令构建 Docker 镜像:
docker build -t myapacheimage .

# -t myapacheimage 选项为你的镜像指定标签(即镜像的名字)。
# . 表示 Dockerfile 文件所在的当前目录。
#构建过程中,Docker 会逐步执行 Dockerfile 中的指令,并构建镜像。完成后,你可以使用以下命令查看镜像列表:
docker images
#你应该能够看到名为 myapacheimage 的新镜像。

步骤 4:运行 Docker 容器

#构建完成镜像后,你可以使用以下命令启动一个容器:
docker run -d -p 8080:80 myapacheimage

#-d 表示在后台运行容器。
#-p 8080:80 将主机的 8080 端口映射到容器的 80 端口。
#此时,你可以通过访问 http://localhost:8080 来查看 Apache 服务器是否成功启动并显示 index.html 页面。

步骤 5:管理 Docker 容器

#使用以下命令查看所有正在运行的容器:
docker ps

#要停止容器,可以使用以下命令:
docker stop <container_id>
#你可以通过 docker ps 命令获取容器的 ID。

#停止容器后,可以删除容器:
docker rm <container_id>
#如果你不再需要镜像,可以使用以下命令删除它:
docker rmi <image_id>

步骤 6:总结

在龙蜥操作系统 8.9 上构建 Docker 镜像的步骤主要包括:

1、安装 Docker。
2、编写 Dockerfile。
3、使用 docker build 命令构建镜像。
4、使用 docker run 命令运行容器。
5、使用 docker ps 和 docker stop 等命令管理容器。

Dockerfile 常见指令的总结表格:

指令描述示例
FROM指定基础镜像FROM centos:8
LABEL为镜像添加元数据LABEL maintainer="example@example.com"
RUN执行命令并在镜像中创建层RUN yum update -y && yum install -y httpd
COPY将文件或目录从构建上下文复制到容器内COPY ./myapp /usr/src/app
ADD类似 COPY,但支持解压 tar 文件和从 URL 下载文件ADD myapp.tar.gz /usr/src/app
WORKDIR设置工作目录WORKDIR /usr/src/app
CMD设置容器启动时默认执行的命令或程序CMD ["httpd", "-D", "FOREGROUND"]
ENTRYPOINT设置容器启动时执行的命令,常与 CMD 配合使用ENTRYPOINT ["python", "app.py"]
EXPOSE声明容器将要监听的端口(仅用于文档化,不会自动暴露端口)EXPOSE 8080
VOLUME创建挂载点以便共享或持久化数据VOLUME ["/data"]
ENV设置环境变量ENV APP_ENV=production
ARG定义构建时可用的变量ARG VERSION=1.0
USER设置容器内的用户USER appuser
SHELL更改 RUN 指令所用的 shellSHELL ["/bin/bash", "-c"]
STOPSIGNAL设置容器停止时使用的信号STOPSIGNAL SIGTERM

搭建私人镜像仓库

步骤 1:准备环境

确保已安装 Docker,如果尚未安装 Docker,请参考之前的教程安装 Docker。
确保你的服务器有公网 IP 或者是一个内网 IP 可访问的服务器
需要有一台能够访问的服务器来托管镜像仓库。如果是在公司内网搭建私有镜像仓库,确保相关的内网机器能够访问该仓库。

步骤 2:拉取并启动 Docker Registry 镜像

Docker 官方提供了一个 registry 镜像,帮助你快速搭建私有镜像仓库。我们可以通过以下命令拉取并启动它。
拉取官方 Registry 镜像
docker pull registry:2

运行 Docker Registry 容器
启动一个 Docker 容器来运行镜像仓库,通常会使用端口 5000 来暴露仓库服务:
docker run -d -p 5000:5000 --name registry registry:2

这条命令会:
在后台启动一个 Docker 容器(-d)。
将容器的 5000 端口映射到主机的 5000 端口,这样你就可以通过 http://<your_server_ip>:5000 来访问仓库。
使用 registry:2 镜像启动私有仓库。
验证仓库是否启动成功

你可以通过以下命令查看容器的状态:
docker ps
如果仓库容器运行正常,你应该看到类似如下输出:

CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                  NAMES
a1b2c3d4e5f6   registry:2     "/bin/registry serve …"   5 seconds ago   Up 4 seconds   0.0.0.0:5000->5000/tcp registry

步骤 3:配置客户端访问仓库

默认情况下,Docker 不允许使用 HTTP 访问私有仓库,因此我们需要配置 Docker 客户端以允许 HTTP 协议的访问。
编辑 Docker 配置文件
编辑 /etc/docker/daemon.json 配置文件,允许 Docker 客户端访问私有仓库。文件内容如下:
{
  "insecure-registries": ["<your_server_ip>:5000"]
}

其中,<your_server_ip> 是你搭建私有仓库的服务器 IP 地址。

重启 Docker 服务
修改完成后,重启 Docker 服务,使配置生效:
sudo systemctl restart docker

步骤 4:将镜像推送到私人仓库

构建 Docker 镜像
例如,构建一个简单的镜像:

docker build -t <your_server_ip>:5000/myimage .
这里的 <your_server_ip> 是你搭建仓库的服务器 IP 地址,myimage 是你自定义的镜像名称。

登录到私有仓库
你可能需要登录到私有仓库。使用以下命令进行登录:

docker login <your_server_ip>:5000

默认情况下,这个仓库不需要认证。如果你需要启用认证,可以参考 Docker 官方文档来配置用户名和密码。
推送镜像到私有仓库
使用以下命令将镜像推送到私有仓库:

docker push <your_server_ip>:5000/myimage
如果一切正常,Docker 会将镜像上传到你的私有仓库。

步骤 5:从私人仓库拉取镜像

从私有仓库拉取镜像
当你需要从私人仓库拉取镜像时,只需使用 docker pull 命令:

docker pull <your_server_ip>:5000/myimage
这样,你就能从你自己搭建的 Docker 私有仓库中拉取镜像。

步骤 6:配置 TLS (可选)

如果你希望通过 HTTPS 而不是 HTTP 来访问你的私有仓库,这里提供一个简单的配置方法。
生成 SSL 证书
如果你没有现成的 SSL 证书,可以通过以下命令生成自签名证书(只用于测试):

mkdir -p /certs
openssl req -newkey rsa:4096 -nodes -keyout /certs/domain.key -x509 -out /certs/domain.crt

更新 Registry 配置
停止当前的 Registry 容器:

docker stop registry
启动一个新的 Registry 容器,挂载 SSL 证书:

docker run -d -p 5000:5000 --name registry \
  -v /certs/domain.crt:/certs/domain.crt \
  -v /certs/domain.key:/certs/domain.key \
  -e REGISTRY_HTTP_SECRET=<secret> \
  -e REGISTRY_HTTP_HEADERS_X_FORWARDED_PROTO=https \
  registry:2

配置 Docker 客户端
确保你已经配置 Docker 客户端以支持 HTTPS(和证书),并按照之前的步骤更新了 /etc/docker/daemon.json 文件。

步骤 7:清理和管理镜像

查看私有仓库中的镜像
你可以查看仓库中的所有镜像。使用以下命令列出仓库中所有镜像:

curl http://<your_server_ip>:5000/v2/_catalog

删除镜像
如果你需要删除某个镜像,可以通过以下命令:
docker rmi <your_server_ip>:5000/myimage
你可能还需要在仓库中手动删除镜像数据,以释放存储空间。

总结

搭建 Docker 私有镜像仓库的步骤主要包括:
使用官方 registry 镜像启动私有仓库。
配置 Docker 客户端以访问私有仓库。
构建镜像并推送到私有仓库。
从私有仓库拉取镜像。
如果需要,还可以进一步配置 HTTPS 和认证。这样,你就可以在自己的服务器上管理 Docker 镜像,享受私有化的镜像仓库服务了。

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java/Kotlin双语革命性ORM框架Jimmer(一)——介绍与简单使用

概览 Jimmer是一个Java/Kotlin双语框架 包含一个革命性的ORM 以此ORM为基础打造了一套综合性方案解决方案&#xff0c;包括 DTO语言 更全面更强大的缓存机制&#xff0c;以及高度自动化的缓存一致性 更强大客户端文档和代码生成能力&#xff0c;包括Jimmer独创的远程异常 …

ASP.NET Core中Filter与Middleware的区别

中间件是ASP.NET Core这个基础提供的功能&#xff0c;而Filter是ASP.NET Core MVC中提供的功能。ASP.NET Core MVC是由MVC中间件提供的框架&#xff0c;而Filter属于MVC中间件提供的功能。 区别 中间件可以处理所有的请求&#xff0c;而Filter只能处理对控制器的请求&#x…

ASP.NET Core对JWT的封装

目录 JWT封装 [Authorize]的注意事项 JWT封装 NuGet 库 |Microsoft.AspNetCore.Authentication.JwtBearer 9.0.1https://www.nuget.org/packages/Microsoft.AspNetCore.Authentication.JwtBearerhttps://www.nuget.org/packages/Microsoft.AspNetCore.Authentication.JwtBea…

【Uniapp-Vue3】从uniCloud中获取数据

需要先获取数据库对象&#xff1a; let db uniCloud.database(); 获取数据库中数据的方法&#xff1a; db.collection("数据表名称").get(); 所以就可以得到下面的这个模板&#xff1a; let 函数名 async () > { let res await db.collection("数据表名称…

腾讯云TI平台×DeepSeek:开启AI超强体验,解锁部署秘籍

引言 在人工智能飞速发展的今天&#xff0c;AI技术的应用场景已经渗透到我们生活的方方面面。从智能客服到自动驾驶&#xff0c;从精准医疗到金融科技&#xff0c;AI的应用正在不断推动各行业的变革与创新。作为AI领域的领军企业&#xff0c;腾讯云一直以来都在致力于为开发者…

利用 IMU 估计人体关节轴向和位置 —— 论文推导

Title: 利用 IMU 估计人体关节轴向和位置 —— “Joint axis and position estimation from inertial measurement data by exploiting kinematic constraints” —— 论文推导 文章目录 I. 论文回顾II. 铰接关节的约束1. 铰接关节约束的原理2. 铰接关节约束的梯度3. 铰接关节约…

pushgateway指标聚合问题

一 问题现象 一个job有多个实例推送指标&#xff0c;但是从pushgateway上看这个job的instance字段&#xff0c;只显示一个实例的ip&#xff0c;而不是多个实例。导致在grafana上无法正常根据ip查看监控。 应用的prometheus的配置 management:metrics:tags:application: ${spr…

无界构建微前端?NO!NO!NO!多系统融合思路!

文章目录 微前端理解1、微前端概念2、微前端特性3、微前端方案a、iframeb、qiankun --> 使用比较复杂 --> 自己写对vite的插件c、micro-app --> 京东开发 --> 对vite支持更拉跨d、EMP 方案--> 必须使用 webpack5 --> 很多人感觉不是微前端 --> 去中心化方…

Vim 多窗口编辑及文件对比

水平分割 :split 默认使用水平分割的方式。 :split :sp 垂直分割 :vsplit :vs 带文件的分割 :split 文件名 :sp 文件名 在光标所在的窗口&#xff0c;输入分割窗口命令就会对那个窗口进行分割。 切换窗口 Ctrlw 切换正在编辑的窗口 快速分割窗口 Ctrlwn 快速分割当前…

yolov11模型在Android设备上运行【踩坑记录】

0) 参考资料: https://github.com/Tencent/ncnn?tabreadme-ov-file https://github.com/pnnx/pnnx https://github.com/nihui/ncnn-android-yolov5 https://github.com/Tencent/ncnn?tabreadme-ov-file 1) &#xff1a;将xxx.pt模型转化成 xxx.onnx ONNX&#xff08;Ope…

电商平台的设计与实现(代码+数据库+LW)

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统商品交易信息管理难度大&#xff0c;容错率低&#xff0…

学习笔记:机器学习中的数学原理(一)

1. 集合 集合分为有限集和无限集&#xff1b; 对于有限集&#xff0c;两集合元素数相等即为等势&#xff1b; 对于无限集&#xff0c;两集合元素存在一一映射关系即为等势&#xff1b; 无限集根据是否与正整数集等势分为可数集和不可数集。 2. sigmoid函数&#xff08;也叫…

【翻译+论文阅读】DeepSeek-R1评测:粉碎GPT-4和Claude 3.5的开源AI革命

目录 一、DeepSeek-R1 势不可挡二、DeepSeek-R1 卓越之处三、DeepSeek-R1 创新设计四、DeepSeek-R1 进化之路1. 强化学习RL代替监督微调学习SFL2. Aha Moment “啊哈”时刻3. 蒸馏版本仅采用SFT4. 未来研究计划 部分内容有拓展&#xff0c;部分内容有删除&#xff0c;与原文会有…

互联网分布式ID解决方案

业界实现方案 1. 基于UUID 2. 基于DB数据库多种模式(自增主键、segment) 3. 基于Redis 4. 基于ZK、ETCD 5. 基于SnowFlake 6. 美团Leaf(DB-Segment、zkSnowFlake) 7. 百度uid-generator() 基于UUID生成唯一ID UUID生成策略 推荐阅读 DDD领域驱动与微服务架构设计设计模…

使用Python实现PDF与SVG相互转换

目录 使用工具 使用Python将SVG转换为PDF 使用Python将SVG添加到现有PDF中 使用Python将PDF转换为SVG 使用Python将PDF的特定页面转换为SVG SVG&#xff08;可缩放矢量图形&#xff09;和PDF&#xff08;便携式文档格式&#xff09;是两种常见且广泛使用的文件格式。SVG是…

CV(11)-图像分割

前言 仅记录学习过程&#xff0c;有问题欢迎讨论 图像分割 语义分割不需要区分具体的个体&#xff0c;实例分割需要 反卷积/转置卷积&#xff1a; 它并不是正向卷积的完全逆过程。反卷积是一种特殊的正向卷积&#xff0c;先按照一定的比例通过补0 来扩大输入图像的尺寸&…

封装descriptions组件,描述,灵活

效果 1、组件1&#xff0c;dade-descriptions.vue <template><table><tbody><slot></slot></tbody> </table> </template><script> </script><style scoped>table {width: 100%;border-collapse: coll…

【Elasticsearch】terms聚合误差问题

Elasticsearch中的聚合查询在某些情况下确实可能存在误差&#xff0c;尤其是在处理分布式数据和大量唯一值时。这种误差主要来源于以下几个方面&#xff1a; 1.分片数据的局部性 Elasticsearch的索引通常被分成多个分片&#xff0c;每个分片独立地计算聚合结果。由于数据在分…

Android修行手册-五种比较图片相似或相同

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材…

2、k8s的cni网络插件和基本操作命令

kube-prxoy属于节点组件&#xff0c;网络代理&#xff0c;实现服务的自动发现和负载均衡。 k8s的内部网络模式 1、pod内的容器于容器之间的通信。 2、一个节点上的pod之间的通信&#xff0c;docker0网桥直接通信。 3、不同节点上的pod之间的通信&#xff1a; 通过物理网卡的…