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

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 镜像,享受私有化的镜像仓库服务了。

 

相关文章:

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

构建镜像教程 步骤 1&#xff1a;安装 Docker #在安装 Docker 之前&#xff0c;建议先更新系统软件包。 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 表&#xff1a;mysqldump -h127.0.0.1 -P9030 -uroot --no-tablespaces --databases test --tables table1 导出 test 数据库中的 table1 表结构&am…...

OpenBMC:通过qemu-system-arm运行编译好的image

OpenBMC&#xff1a;编译_openbmc meson.build file-CSDN博客 讲述了如何编译生成openbmc的image 完成编译后可以通过qemu-system-arm进行模拟加载&#xff0c;以便在没有BMC硬件的情况下进行调试 1.下载qemu-system-arm 在openbmc的上级目录上执行 wget https://jenkins.op…...

STM32的HAL库开发---通用定时器(TIMER)---定时器脉冲计数

一、脉冲计数实验原理 1、 外部时钟模式1&#xff1a;核心为蓝色部分的时基单元&#xff0c;时基单元的时钟源可以来自四种&#xff0c;分别是内部时钟PCLK、外部时钟模式1&#xff0c;外部时钟模式2、内部定时器触发&#xff08;级联&#xff09;。而脉冲计数就是使用外部时钟…...

动态规划LeetCode-121.买卖股票的最佳时机1

给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。…...

网安三剑客:DNS、CDN、VPN

DNS&#xff08;网络地址转换系统&#xff09;的技术原理与安全应用 1. 网络地址转换系统的基本原理 DNS通过解析用户的访问URL&#xff08;超链接&#xff09;&#xff0c;将其映射到服务器上存储的信息。具体来说&#xff1a; 解析URL&#xff1a;DNS从URL中提取出 hostna…...

Linux在x86环境下制作ARM镜像包

在x86环境下制作ARM镜像包&#xff08;如qemu.docker&#xff09;&#xff0c;可以通过QEMU和Docker的结合来实现。以下是详细的步骤&#xff1a; 安装QEMU-user-static QEMU-user-static是一个静态编译的QEMU二进制文件&#xff0c;用于在非目标架构上运行目标架构的二进制文…...

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、显示或隐藏书签边栏&#xff1a;Control-Command-1 2、选择下一个书签或文件夹&#xff1a;向上头键或向下头键 3、打开所选书签&#xff1a;空格键 4、打开所选文件夹&#xff1a;空格键或右箭头键 5、关闭所选文件夹&#xff1a;空格键或左箭头键 6、更…...

Git登录并解决 CAPTCHA

修改公司域账户密码之后&#xff0c;导致今天pull代码时显示&#xff1a;remote error: CAPTCHA required 本文将介绍如何解决 Git 中的常见错误“fatal: Authentication failed for git”。该问题通常出现在尝试访问远程 Git 仓库时&#xff0c;表示身份验证失败。以下是几种常…...

Websocket从原理到实战

引言 WebSocket 是一种在单个 TCP 连接上进行全双工通信的网络协议&#xff0c;它使得客户端和服务器之间能够进行实时、双向的通信&#xff0c;既然是通信协议一定要从发展历史到协议内容到应用场景最后到实战全方位了解 发展历史 WebSocket 最初是为了解决 HTTP 协议在实时…...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_get_options函数

声明 就在 main函数所在的 nginx.c 中&#xff1a; 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&#xff0c;可以使用以下方法&#xff1a; 查看默认Shell: 打开“终端”应用程序&#xff0c;然后输入以下命令&#xff1a; echo $SHELL这将显示当前默认使用的Shell。例如&#xff0c;如果输出是/bin/zsh&#xff0c;则说明您使用的是Z…...

Centos执行yum命令报错

错误描述 错误&#xff1a;为仓库 ‘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实现订单超时实时关闭功能 准备工作实现步骤解释注意事项&#xff08;重点&#xff09; 使用Redis实现订单超时实时关闭功能&#xff0c;可以利用Redis的延时队列&#xff08;使用Sorted Set实现&#xff09;和过期键&#xff08;使用TTL和Keyspace Notifications…...

485网关数据收发测试

目录 1.UDP SERVER数据收发测试 使用产品&#xff1a; || ZQWL-GW1600NM 产品||【智嵌物联】智能网关型串口服务器 1.UDP SERVER数据收发测试 A&#xff08;TX&#xff09;连接RX B&#xff08;RX&#xff09;连接TX 打开1个网络调试助手&#xff0c;模拟用户的UDP客户端设…...

RabbitMQ快速上手及入门

概念 概念&#xff1a; publisher&#xff1a;生产者&#xff0c;也就是发送消息的一方 consumer&#xff1a;消费者&#xff0c;也就是消费消息的一方 queue&#xff1a;队列&#xff0c;存储消息。生产者投递的消息会暂存在消息队列中&#xff0c;等待消费者处理 exchang…...

4种架构的定义和关联

文章目录 **1. 各架构的定义****业务架构&#xff08;Business Architecture&#xff09;****应用架构&#xff08;Application Architecture&#xff09;****数据架构&#xff08;Data Architecture&#xff09;****技术架构&#xff08;Technology Architecture&#xff09;*…...

109,【1】攻防世界 web 题目名称-文件包含

进入靶场 直接显示源代码 提示我们通过get方式传递名为filename的参数&#xff0c;同时给出了文件名check.php filenamecheck.php 显示使用了正确的用法&#xff0c;错误的方法 filename./check.php 还是一样的回显 傻了&#xff0c;题目名称是文件包含&#xff0c;需要用到…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

【C++】纯虚函数类外可以写实现吗?

1. 答案 先说答案&#xff0c;可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...

如何在Windows本机安装Python并确保与Python.NET兼容

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

Qt的学习(一)

1.什么是Qt Qt特指用来进行桌面应用开发&#xff08;电脑上写的程序&#xff09;涉及到的一套技术Qt无法开发网页前端&#xff0c;也不能开发移动应用。 客户端开发的重要任务&#xff1a;编写和用户交互的界面。一般来说和用户交互的界面&#xff0c;有两种典型风格&…...

车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...

C++ 类基础:封装、继承、多态与多线程模板实现

前言 C 是一门强大的面向对象编程语言&#xff0c;而类&#xff08;Class&#xff09;作为其核心特性之一&#xff0c;是理解和使用 C 的关键。本文将深入探讨 C 类的基本特性&#xff0c;包括封装、继承和多态&#xff0c;同时讨论类中的权限控制&#xff0c;并展示如何使用类…...

python打卡day49@浙大疏锦行

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 一、通道注意力模块复习 & CBAM实现 import torch import torch.nn as nnclass CBAM(nn.Module):def __init__…...

生产管理系统开发:专业软件开发公司的实践与思考

生产管理系统开发的关键点 在当前制造业智能化升级的转型背景下&#xff0c;生产管理系统开发正逐步成为企业优化生产流程的重要技术手段。不同行业、不同规模的企业在推进生产管理数字化转型过程中&#xff0c;面临的挑战存在显著差异。本文结合具体实践案例&#xff0c;分析…...