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 指令所用的 shell | SHELL ["/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 镜像,享受私有化的镜像仓库服务了。
相关文章:
Docker 构建镜像并搭建私人镜像仓库教程
构建镜像教程 步骤 1:安装 Docker #在安装 Docker 之前,建议先更新系统软件包。 sudo yum update -y # 移除旧的Docker版本和Podman、runc软件包及其相关依赖。 yum remove -y docker docker-client docker-client-latest docker-ce-cli docker-commo…...
doris:MySQL Dump
Doris 在 0.15 之后的版本已经支持通过 mysqldump 工具导出数据或者表结构 使用示例 导出 导出 test 数据库中的 table1 表:mysqldump -h127.0.0.1 -P9030 -uroot --no-tablespaces --databases test --tables table1 导出 test 数据库中的 table1 表结构&am…...
OpenBMC:通过qemu-system-arm运行编译好的image
OpenBMC:编译_openbmc meson.build file-CSDN博客 讲述了如何编译生成openbmc的image 完成编译后可以通过qemu-system-arm进行模拟加载,以便在没有BMC硬件的情况下进行调试 1.下载qemu-system-arm 在openbmc的上级目录上执行 wget https://jenkins.op…...
STM32的HAL库开发---通用定时器(TIMER)---定时器脉冲计数
一、脉冲计数实验原理 1、 外部时钟模式1:核心为蓝色部分的时基单元,时基单元的时钟源可以来自四种,分别是内部时钟PCLK、外部时钟模式1,外部时钟模式2、内部定时器触发(级联)。而脉冲计数就是使用外部时钟…...
动态规划LeetCode-121.买卖股票的最佳时机1
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。…...
网安三剑客:DNS、CDN、VPN
DNS(网络地址转换系统)的技术原理与安全应用 1. 网络地址转换系统的基本原理 DNS通过解析用户的访问URL(超链接),将其映射到服务器上存储的信息。具体来说: 解析URL:DNS从URL中提取出 hostna…...
Linux在x86环境下制作ARM镜像包
在x86环境下制作ARM镜像包(如qemu.docker),可以通过QEMU和Docker的结合来实现。以下是详细的步骤: 安装QEMU-user-static QEMU-user-static是一个静态编译的QEMU二进制文件,用于在非目标架构上运行目标架构的二进制文…...
Vue3+codemirror6实现公式(规则)编辑器
实现截图 实现/带实现功能 插入标签 插入公式 提示补全 公式验证 公式计算 需要的依赖 "codemirror/autocomplete": "^6.18.4","codemirror/lang-javascript": "^6.2.2","codemirror/state": "^6.5.2","cod…...
Lua中文语言编程源码-第十一节,其它小改动汉化过程
__tostring 汉化过程 liolib.c metameth[] {"__转换为字符串", f_tostring}, lauxlib.c luaL_callmeta(L, idx, "__转换为字符串") lua.c luaL_callmeta(L, 1, "__转换为字符串") __len 汉化过程 ltm.c luaT_eventname[] ltablib.c c…...
Safari常用快捷键
一、书签边栏 1、显示或隐藏书签边栏:Control-Command-1 2、选择下一个书签或文件夹:向上头键或向下头键 3、打开所选书签:空格键 4、打开所选文件夹:空格键或右箭头键 5、关闭所选文件夹:空格键或左箭头键 6、更…...
Git登录并解决 CAPTCHA
修改公司域账户密码之后,导致今天pull代码时显示:remote error: CAPTCHA required 本文将介绍如何解决 Git 中的常见错误“fatal: Authentication failed for git”。该问题通常出现在尝试访问远程 Git 仓库时,表示身份验证失败。以下是几种常…...
Websocket从原理到实战
引言 WebSocket 是一种在单个 TCP 连接上进行全双工通信的网络协议,它使得客户端和服务器之间能够进行实时、双向的通信,既然是通信协议一定要从发展历史到协议内容到应用场景最后到实战全方位了解 发展历史 WebSocket 最初是为了解决 HTTP 协议在实时…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_get_options函数
声明 就在 main函数所在的 nginx.c 中: static ngx_int_t ngx_get_options(int argc, char *const *argv); 实现 static ngx_int_t ngx_get_options(int argc, char *const *argv) {u_char *p;ngx_int_t i;for (i 1; i < argc; i) {p (u_char *) argv[i]…...
判断您的Mac当前使用的是Zsh还是Bash:echo $SHELL、echo $0
要判断您的Mac当前使用的是Zsh还是Bash,可以使用以下方法: 查看默认Shell: 打开“终端”应用程序,然后输入以下命令: echo $SHELL这将显示当前默认使用的Shell。例如,如果输出是/bin/zsh,则说明您使用的是Z…...
Centos执行yum命令报错
错误描述 错误:为仓库 ‘appstream’ 下载元数据失败 : Cannot prepare internal mirrorlist: Curl error (6): Couldn’t resolve host name for http://mirrorlist.centos.org/?release8&archx86_64&repoAppStream&infrastock [Could not resolve h…...
订单超时设计(1)--- 如何使用redis实现订单超时实时关闭功能
如何使用redis实现订单超时实时关闭功能 准备工作实现步骤解释注意事项(重点) 使用Redis实现订单超时实时关闭功能,可以利用Redis的延时队列(使用Sorted Set实现)和过期键(使用TTL和Keyspace Notifications…...
485网关数据收发测试
目录 1.UDP SERVER数据收发测试 使用产品: || ZQWL-GW1600NM 产品||【智嵌物联】智能网关型串口服务器 1.UDP SERVER数据收发测试 A(TX)连接RX B(RX)连接TX 打开1个网络调试助手,模拟用户的UDP客户端设…...
RabbitMQ快速上手及入门
概念 概念: publisher:生产者,也就是发送消息的一方 consumer:消费者,也就是消费消息的一方 queue:队列,存储消息。生产者投递的消息会暂存在消息队列中,等待消费者处理 exchang…...
4种架构的定义和关联
文章目录 **1. 各架构的定义****业务架构(Business Architecture)****应用架构(Application Architecture)****数据架构(Data Architecture)****技术架构(Technology Architecture)*…...
109,【1】攻防世界 web 题目名称-文件包含
进入靶场 直接显示源代码 提示我们通过get方式传递名为filename的参数,同时给出了文件名check.php filenamecheck.php 显示使用了正确的用法,错误的方法 filename./check.php 还是一样的回显 傻了,题目名称是文件包含,需要用到…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...
