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 还是一样的回显 傻了,题目名称是文件包含,需要用到…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...