Docker Registry
是 Docker 容器镜像的存储和分发服务,允许用户存储和管理 Docker 镜像。它可以是公共的,如 Docker Hub,也可以是私有的,如自建的 Docker Registry。
Registry
是一个非常简单的轻量级本地私有仓库,由于该镜像仓库比较单一,实际生产环境很少有公司使用。
一、安装 Docker
# 安装 yum 工具集
yum install -y yum-utils
# 添加阿里云docker-ce仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装docker-ce(社区版)软件包
yum -y install docker-ce
# 启用Docker Cgroup用于限制进程的资源使用量,如CPU、内存资源
mkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
# 启动docker并设置随机自启
systemctl enable docker ; systemctl start docker
二、部署 Registry
# 拉取私有镜像仓库到本地
docker pull registry
# 启动私有镜像仓库
docker run -d -p 5000:5000 --restart=always --name registry registry:latest
这里的参数解释:
-d: 后台运行容器。
-p 5000:5000: 将容器的 5000 端口映射到主机的 5000 端口,这是 Registry 默认的监听端口。
--restart=always: 设置容器自动重启,以确保即使系统重启或者 Docker 服务重启后,Registry 也能自动重新启动。
--name registry: 为容器指定一个名称,这里命名为 registry。
registry:latest: 使用 Docker Hub 上的 registry 镜像, latest表示使用的是 Registry 的版本 。
启动后,浏览器直接访问http://IP:5000端口,访问不到任何内容,正确的访问方式:http://IP:5000/v2/_catalog
看到 {"repositories":[]},说明 docker registry 已经部署成功,只是仓库中还没有存储镜像
# 编辑docker配置文件
需要配置 /etc/docker/daemon.json
添加
"insecure-registries": ["192.168.1.101:5000"]
注:配置信息除最后一行外,每行末尾都有一个英文的逗号,
默认情况下,Docker 只允许使用 HTTPS 协议(安全连接)来拉取和推送镜像。
如果需要在 Docker 中访问一个没有启用 HTTPS 的私有镜像仓库,
可以通过在 daemon.json 中添加 insecure-registries 字段来指定允许使用不安全的 HTTP 连接访问的镜像仓库。
systemctl daemon-reload # 重载配置文件
systemctl restart docker # 重启docker
如果是在当前部署 registry 的机器上,可以拉取 nginx 测试上传到 registry
docker pull nginx:latest
# 查看已有镜像
docker images
# 给 nginx 镜像打标签
docker tag nginx:latest 192.168.1.100:5000/mynginx:1.0
# 查看是否标记成功
docker images
# 上传镜像到私有仓库
docker push 192.168.1.100:5000/mynginx:1.0
http://192.168.1.100:5000/v2/_catalog
看到 {"repositories":["mynginx"]},说明镜像已经成功上传到 docker registry 私有仓库中。
docker tag
docker tag 命令用于给本地的一个镜像打上新的标签,这个标签可以是另一个镜像名称和标签的组合,或者只是一个新的标签。
docker tag SOURCE_IMAGE[:TAG] repository_name/TARGET_IMAGE[:TAG]
示例:
docker tag nginx:latest 192.168.1.100:5000/mynginx:1.0
参数解释:
SOURCE_IMAGE[:TAG]:要标记的本地镜像??梢园昵═AG),如果没有指定标签,默认为 latest。
TARGET_IMAGE[:TAG]:新标记的目标镜像??梢园昵═AG),如果没有指定标签,默认为 latest。
repository_name:私有镜像仓库地址
docker push
docker push repository_name/IMAGE[:TAG]
示例:
docker push 192.168.1.100:5000/mynginx:1.0
三、部署 docker-registry-web
docker-registry-web
是一个开源项目,它提供了一个简单的 Web 界面来管理和浏览 Docker Registry 中的镜像。
# 拉取docker-registry-web镜像
docker pull hyper/docker-registry-web
docker run -it -d --name registry-web \
-e REGISTRY_URL=http://192.168.1.100:5000/v2 \
-e REGISTRY_NAME=192.168.1.100:5000 \
-p 8000:8080 \
hyper/docker-registry-web
参数解释:
1、docker run:
这是 Docker 命令,用于运行一个新的容器。
2、-it:
-i 表示交互模式(interactive),允许你在容器中进行交互。
-t 表示分配一个伪终端(pseudo-TTY),通常与 -i 一起使用以便交互式操作。
在这个具体的命令中,-it 用于保持容器在前台运行,并能够在控制台上查看容器的输出和日志。
3、-d:
表示以后台(detached)模式运行容器,即使不指定 -it 也可以使容器在后台运行。
--name registry-web:
指定容器的名称为 registry-web,这样在后续的操作中可以通过这个名称来引用这个容器。
4、-e REGISTRY_URL=http://192.168.1.100:5000/v2:
设置环境变量 REGISTRY_URL,指定了要连接的 Docker Registry 的 URL。
在这个例子中,http://192.168.1.100:5000/v2 是 Docker Registry 的地址,后面的 /v2 表示 Docker Registry API 的版本。
5、-e REGISTRY_NAME=192.168.1.100:5000:
设置环境变量 REGISTRY_NAME,用于在 docker-registry-web 的界面上显示 Registry 的名称。
在这里,192.168.1.100:5000 是注册表的名称,将显示在 docker-registry-web 界面上,以便用户能够识别所连接的 Registry。
6、-p 8000:8080:
将容器的 8080 端口映射到宿主机的 8000 端口,允许通过 8000 端口访问 docker-registry-web 提供的 Web 界面。
这里宿主机上的 8000 端口是供外部访问用的,可以根据需要调整映射的端口号。
7、hyper/docker-registry-web:
指定要运行的 Docker 镜像,这里是 hyper/docker-registry-web,是 docker-registry-web 的镜像名称和标签(版本)。
# 访问 http://192.168.1.100:8000/,可以看到Docker Registry中存储的镜像信息
docker-registry-web 连接基于 HTTPS 的 Docker Registry
??
docker run -d -p 8000:8080 --name registry-web \
-e REGISTRY_URL=https://tt.dd.com:5000/v2 \
-e REGISTRY_NAME=192.168.1.100:5000 \
-e REGISTRY_STORAGE_DELETE_ENABLED=true \
-e REGISTRY_BASIC_AUTH="YWRtaW46MTIzNDU2" \
-v /securitit/registry/certs:/certs \
-e DOCKER_REGISTRY_WEB_HTTPS_KEY=/certs/domain.key \
-e DOCKER_REGISTRY_WEB_HTTPS_CERTIFICATE=/certs/domain.pem \
hyper/docker-registry-web
# master 节点创建docker registry secret
kubectl create secret docker-registry tt \
--docker-server=tt.dd.com:5000 \
--docker-username=admin \
--docker-password=123456 \
--docker-email=jcn@example.com
# 删除 secret
kubectl delete secret tt
四、 Registry配置 https 服务
1、确认目录存在并创建
mkdir -p /securitit/registry/auth
2、使用 htpasswd 生成文件
sudo yum install httpd-tools -y
htpasswd -Bbn admin 123456 > /securitit/registry/auth/htpasswd
3、 确认文件生成
执行完上述命令后,使用以下命令确认 htpasswd 文件已经成功生成并包含正确的账号密码:
cat /securitit/registry/auth/htpasswd
如果能够看到类似以下内容,表示文件已经成功创建:
admin:$2y$05$aQ2Pq/X.vzii61OzzE1oaOasjiH90f0SDjAPNrPIc3TvfoRxkI6eu
4、使用registry镜像启动容器,同时启用基于HTTP BASIC认证
docker run -d -p 5000:5000 --restart=always --name registry \
-v /securitit/registry/auth:/auth \
-v /securitit/registry/certs:/certs \
-e REGISTRY_HTTP_ADDR=0.0.0.0:5000 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/registry.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/registry.key \
-e REGISTRY_AUTH=htpasswd \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" \
registry:latest
5、访问 https://IP:5000/v2/_catalog,输入设置的用户名(admin)和密码(123456)后,可正常访问。