发布时间:2025-01-11 人气:177次
虚拟机的安装及docker容器的安装使用
什么是私有镜像仓库
1.1 Docker镜像仓库分两类:公用仓库和私有仓库
1.2 公用镜像仓库:DockerHub、网易云镜像仓库、DaoCloud镜像仓库、阿里云镜像仓库等
1.3 私有镜像仓库:本地搭建,局部范围内使用的仓库
为什么需要私人镜像仓库
2.1 企业镜像大多带有商业机密,不希望对外公开
2.2 镜像操作(例如上传、下载),效率更高
这段内容解释了私有镜像仓库的概念和为什么企业需要使用私有镜像仓库。私有镜像仓库是企业内部使用的,可以保护商业机密,并且提高镜像操作的效率。
实现私人镜像仓库
3.0 准备工作,需要准备两台虚拟机,大家可以自行克隆上章节所用的虚拟机
为了方便大家可以给虚拟机改名sudo vi /etc/hostname后重启sudo reboot
111.168.56.134 -> docker-registry 私人镜像仓库服务器
111.168.56.133 -> docker 测试镜像 push 和 pull 的工作站
3.1 Docker Registry
Docker 官方的 Docker Registry 是一个基础版的镜像仓库,具备仓库管理的完整功能,但是没有图形化 UI 界面
官网文档:https://docs.docker.com/registry/
-> docker pull registry:latest -> mkdir -p registry/data && cd registry -> docker run -d --restart=always --name registry -p 5000:5000 -v ./data:/var/lib/registry registry:latest # 测试 http://私有仓库IP:5000/v2/_catalog # 查看镜像仓库中所有的镜像
这段内容是关于如何搭建一个私有 Docker 镜像仓库的命令行步骤:
使用 docker pull registry:latest 命令拉取 Docker Registry 的最新镜像。
使用 mkdir -p registry/data && cd registry 创建并进入 registry 目录,同时创建一个 data 子目录用于存储镜像数据。
使用 docker run 命令启动一个 Docker Registry 容器,设置为守护进程模式(-d),始终重启(--restart=always),并映射端口 5000将宿主机的5000端口映射到容器上(-p 5000:5000),使用docker inspect registry(查看镜像的详细信息)命令查看registry容器暴露的端口是不是5000。同时,将主机的 ./data 目录挂载到容器的 /var/lib/registry 目录(-v ./data:/var/lib/registry),并指定容器名称为 registry。
测试私有镜像仓库是否搭建成功,可以通过访问 http://私有仓库IP:5000/v2/_catalog 来查看仓库中所有的镜像。这里的 私有仓库IP 需要替换为实际的服务器 IP 地址。
注意:在CentOS 8系统中,管理防火墙通常使用firewalld服务。以下是如何在firewalld中开放5000端口的步骤:
使用firewall-cmd命令开放5000端口
firewall-cmd是firewalld的命令行工具,用于管理防火墙规则。要开放5000端口,可以使用以下命令:
sudo firewall-cmd --zone=public --add-port=5000/tcp --permanent
这里的参数解释如下:
--zone=public:指定防火墙区域,通常使用public区域。如果你有其他特定的区域配置,可以相应地修改。
--add-port=5000/tcp:添加5000端口,协议为TCP。如果你需要开放UDP端口,可以使用5000/udp。
--permanent:使规则永久生效,即在防火墙重启后仍然有效。
3. 重新加载防火墙配置
添加规则后,需要重新加载firewalld的配置,以使规则生效:
sudo firewall-cmd --reload
4. 验证端口是否开放
为了确保5000端口已经成功开放,可以使用以下命令查看防火墙状态和规则:
sudo firewall-cmd --list-all
这个命令会列出当前防火墙的所有规则,包括开放的端口。你应该能在输出中看到5000端口已经开放。
使用netstat命令查看监听的端口:
sudo netstat -tuln | grep 5000
如果5000端口已经开放,你应该能看到类似以下的输出:
tcp 0 0 0.0.0.0:5000 0.0.0.0:* LISTEN
通过以上步骤,你可以在CentOS 8系统中成功开放5000端口。
直接关闭防火墙firewalld服务,可以使用以下命令:
sudo systemctl stop firewalld
禁用firewalld服务的开机自启
sudo systemctl disable firewalld
查看防火墙的状态
sudo systemctl status firewalld
私人镜像仓库常用操作
4.0 配置 Docker 客户端以使用 HTTP
docker私有仓库默认是基于https传输的,需要在客户端做相关设置不使用https传输=ErrorInfo Error response from daemon:Get "https://111.168.56.134:5000/v2/": http: server gave HTTP response to HTTPS client
Solve:
vim /etc/docker/daemon.json # 修改客户端docker配置 "insecure-registries": ["私有仓库IP:5000"] systemctl daemon-reload && systemctl restart docker # 重新加载配置,重启docker
"insecure-registries": ["111.168.56.134:81"]
这个配置项指定了 Docker 守护进程允许访问的“不安全”镜像仓库。
insecure-registries 允许 Docker 守护进程访问那些没有启用 HTTPS 或者使用自签名证书的私有仓库。在这种情况下,111.168.56.134:81 是一个不使用 HTTPS 的本地或私有 Docker 镜像仓库。
如果没有这个配置,Docker 默认只允许访问使用 HTTPS 协议的仓库,以保证安全性。通过设置 insecure-registries,你可以让 Docker 访问使用 HTTP 的私有仓库或自签名证书的仓库。
在这种配置下,Docker 会忽略 SSL 证书验证,直接与指定的仓库进行通信。
4.1 推送镜像
4.1.0重做镜像Tag
docker pull alpine 这个镜像很小方便拉取,我这里使用这个演示
docker tag images:tag 私有仓库IP:5000/images:tag docker tag alpine 111.168.56.134:5000/myalpine
制作镜像难免有制作错误的,下面讲解一下怎么删除镜像,了解一下即可
需要要删除镜像 111.168.55.133:5000/myalpine,可以使用以下命令:
docker rmi 111.168.55.134:5000/myalpine 如果该镜像被其他容器使用,删除时会遇到错误。在这种情况下,可以使用 -f 强制删除: docker rmi -f 111.168.56.133:5000/myalpine 删除后,使用 docker images 命令可以验证该镜像是否已被移除。
4.1.1推送镜像
docker push 私有仓库IP:5000/images:tag docker push 111.168.56.134:5000/myalpine
4.1.2测试
ls data/docker/registry/v2/repositories/ # 私有仓库服务器上执行 http://私有仓库IP:5000/v2/catalog # 客户端上执行
这段内容描述了如何将 Docker 镜像推送到私有仓库的步骤:
使用 docker tag 命令为本地镜像打上新的标签,以匹配私有仓库的地址和镜像名称。
使用 docker push 命令将镜像推送到私有仓库。
测试镜像是否成功推送,可以通过列出私有仓库服务器上的镜像存储目录或通过浏览器访问私有仓库的 catalog 接口来检查。
请注意,这里的 私有仓库IP:5000 需要替换为实际的私有仓库服务器 IP 地址和端口号。
在客户机中拉取
打标签( docker tag)一个镜像时,实际上并没有创建新的镜像,而是为现有的镜像分配了一个新的标签。镜像的 ID 是唯一的,代表镜像的内容。
4.1.3拉取镜像:
方便演示使用myalpine操作,
先删除本地镜像
docker rmi 111.168.56.134:5000/myalpine
从私有仓库拉取
docker pull 111.168.56.134:5000/myalpine
图示:
Docker Registry UI的使用
带UI的Registry镜像是第三方基于官方镜像制作出来,因此构建后会涉及到2个镜像,建议采用docker-compose方式编排
GitHub官网: https://github.com/Joxit/docker-registry-ui
-> mkdir -p registry/data && cd registry 创建目录,我们上面已经创建好了 -> vi docker-compose.yml
创建docker-compose.yml 配置文件:
version: "3.8"
services:
registry:
image: registry
volumes:
- ./data:/var/lib/registry
registry-ui:
image: joxit/docker-registry-ui:1.5-static # static是静态接口版,还有个标准版不带static后缀
ports:
- 81:80
environment:
- REGISTRY_TITLE=不凋不败的私有仓库 # docker私有仓库的标题
- REGISTRY_URL=http://registry:5000 # docker私有仓库的url
- DELETE_IMAGES=true
- CATALOG_ELEMENTS_LIMIT=1000 # 必要
depends_on:
- registry
使用 docker-compose 来部署一个带有图形用户界面的 Docker Registry。它包括两个服务:一个是 Docker Registry 本身,另一个是第三方的 UI 界面。通过 docker-compose.yml 文件定义了服务的配置,包括使用的镜像、端口映射、环境变量等。最后,使用 docker compose up -d 命令启动服务,并通过浏览器访问 http://私有仓库IP:81 来查看 UI 界面。这里的 私有仓库IP 需要替换为实际的服务器 IP 地址。
配置 Docker registry UI:
REGISTRY_TITLE=不凋不败的私有仓库
REGISTRY_URL=http://registry:5000设置 Docker registry 的 URL,即 registry 服务的地址,registry 是 Docker Compose 服务的名称,它会解析为容器的 IP 地址。
DELETE_IMAGES=true
CATALOG_ELEMENTS_LIMIT=1000
启动服务
docker compose up -d http://私有仓库IP:81 # 测试
测试ok
修改测试机的http访问镜像端口,从5000改为81
# vi /etc/docker/daemo.json
{
"dns": ["8.8.8.8", "8.8.4.4"],
"registry-mirrors": [
"https://do.nark.eu.org",
"https://dc.j8.work",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.nju.edu.cn",
"https://registry.aliyuncs.com",
"https://mirror.ccs.tencentyun.com",
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com"
],
"insecure-registries": ["192.168.55.134:81"]
}
重新加载配置,重启docker:
systemctl daemon-reload && systemctl restart docker # 重新加载配置,重启docker
创建镜像:
[root@192 ~]# docker tag alpine 111.168.56.134:81/myalpine-ui
推送镜像到私有镜像仓库:
docker push 111.168.56.134:81/myalpine-ui
查看推送成功
大家可以测试一下删除了拉取pull操作,无疑肯定也是成功的