Docker--搭建私有镜像中心Harbor

公网镜像中心

Docker Hub 和阿里云都是Docker 的公网镜像中心,用户可以将镜像push到镜像中心的镜像仓库里,可以将仓库设为私有库,他人无法访问,保证镜像安全。

但是,实际工作中,一般在公司内部搭建一个私有镜像中心。

发布镜像到阿里云

  1. 注册一个阿里云账号,并完成实名认证

  2. 创建镜像中心实例

    登录阿里云后搜索"容器镜像服务",然后进入并创建个人实例

    设置Registry登录密码。

  3. 创建命名空间

    阿里云在镜像中心和镜像仓库之间增加了一层"命名空间",可以将镜像仓库分类到不同的命名空间中,所以要先创建命名空间。

  4. 创建镜像仓库,先选择好命名空间

这里选择本地仓库。

  1. 登录阿里云镜像中心

    sh 复制代码
    docker login --username=dt_5224810793 crpi-8nnmc9aojy1lrfpp.cn-chengdu.personal.cr.aliyuncs.com
  2. 复制并重命名镜像

    sh 复制代码
    docker tag hello-my-world crpi-8nnmc9aojy1lrfpp.cn-chengdu.personal.cr.aliyuncs.com/ali_1/ali_1_ck:1.0
  3. 推送镜像

    sh 复制代码
    docker push crpi-8nnmc9aojy1lrfpp.cn-chengdu.personal.cr.aliyuncs.com/ali_1/ali_1_ck:1.0

    此时就推送成功了!

  4. 登出阿里云仓库

sh 复制代码
docker logout crpi-8nnmc9aojy1lrfpp.cn-chengdu.personal.cr.aliyuncs.com

私有镜像中心

htpasswd命令

registry 私有镜像中心默认没有用户认证功能,可通过htpasswd来实现用户认证!

htpasswd用于创建、更新http基本认证的密码文件。

  1. 安装httpd-tools

    htpasswd 需要先安装httpd-tools 工具包

    sh 复制代码
    yum install -y httpd-tools
  2. 创建文件并添加用户

    创建/root/auth 目录并进入。在其中存放生成的认证文件

    sh 复制代码
    # 指定用户zhangsan 密码123 并写入到auth目录中的htpasswd.user文件中
    htpasswd -Bbc htpasswd.user zhangsan 123
    # 再创建两个用户,此时无需选项-c
    htpasswd -Bb htpasswd.user lisi 123
    htpasswd -Bb htpasswd.user wangwu 123
  3. 修改密码

    sh 复制代码
    # 若指定用户不存在,则添加用户;若存在,就修改密码
    htpasswd -Bb htpasswd.user wangwu 456
  4. 删除用户名和密码

    sh 复制代码
    htpasswd -D htpasswd.user wangwu
  5. 使用-n选项创建文件

    sh 复制代码
    # -n选项和重定向符可将密码写入到文件,比如将用户名和密码写入当前目录的authfile中
    htpasswd -Bbn wangwu 456 > authfile
    # 这种情况下修改密码可通过追加重定向符来完成
    htpasswd -Bbn Tom 456 >> authfile

容器的退出状态码

退出状态码可以向用户反馈容器中应用的退出方式!

状态码分类

容器退出状态码是【0,255】范围内的整数,分为三类:0、【1,128】、【129,255】

  • 状态码0:表示容器中应用正常退出。
  • 【1,128】:非正常退出,容器内部运行错误引发的容器无法启动或应用运行出错。
  • 【129,255】:非正常退出,表示容器接收到终止信号而退出。

常见状态码如下:

  • 状态码1:表示程序内部错误(比如:分母为0,内存溢出)或Dockerfile中的无效引用(比如引用了不存在的文件)
  • 状态码125:容器启动后要执行【command】,但是【command】没运行成功,原因一般是【command】引用了未定义的变量或者执行了没权限的目录。
  • 状态码126:容器启动后要执行【command】,但是【command】没运行成功,原因是缺少依赖。
  • 状态码127:容器启动后要执行【command】,但是【command】没运行成功,原因是引用了不存在的文件或目录。
  • 状态码128:当自己开发的容器内的代码引发退出命令,但是给出的状态码不再0-255范围内,就会返回128
  • 状态码130:容器中的应用接收到来自操作系统的终止信号,应用立即退出,返回130.
  • 状态码137:容器中的应用接收到来自docker的强制终止信号,应用立即退出,返回137.
  • 状态码143:容器中的应用接收到来自docker的优雅终止信号,如果没用户访问,容器会立即退出,并返回143;如果有用户访问,那么docker会等待10s,10s后向容器发送kill信号,返回137状态码

退出状态码的查看方式:docker ps -adocker inspect

容器重启策略

在生产环境下,容器退出后使用手动重启不现实,这时可以使用容器重启策略,在容器创建时指定--restart 选项 不同的值,达到不同的效果。

  • no:默认策略,退出时不重启。
  • on-failure:n: 容器非正常退出时(退出状态码非0)才重启容器,气候可以跟一个整数,表示重启次数。
  • always:只要退出就重启
  • unless-stopped:只要退出就重启,除非docker stop 或 docker kill 命令停止容器。

harbor私有镜像中心HTTP

一般私有镜像中心是一台换门的服务器,不用做平时Docker容器的运行管理。其他要对其进行push或pull操作的Docker主机称为Docker客户端。

Harbor 是Go语言开发的一款Registry server 开源项目,在Docker Registry 的基础上进行二次封装。作为一个企业级私有Registry服务器,Harbor提供更好的性能和安全,也提供了方便的web管理界面。

安装Harbor

  1. 下载安装包

    sh 复制代码
    wget https://github.com/goharbor/harbor/releases/download/v2.6.2/harbor-offline-installer-v2.6.2.tgz
  2. 解压安装包

    sh 复制代码
    tar -zxvf harbor-offline-installer-v2.6.2.tgz -C /opt/apps/
  3. 修改harbor.yml

    复制一份harbor解压包中的harbor.yml.tmpl 并重命名为harbor.yml

    sh 复制代码
    cp harbor.yml.tmpl harbor.yml

    修改harbor.yml三个地方:

    • 将hostname 指定为当前主机IP
    • 注释掉所有https相关配置
    • 修改admin用户的密码
  4. 运行prepare

    在harbor解压目录中运行prepare命令。该命令会先拉取prepare镜像,然后生成很多的配置文件。

    sh 复制代码
    ./prepare
  5. 运行 install.sh

    在harbor解压目录中运行install.sh命令,其会自动完成五步的安装过程,并最后启动很多容器。

    sh 复制代码
    ./install.sh
  6. 此时就可以通过http://IP 进行访问了。

Habor 的启停

Harbor是由10个容器同时运行完成的,而且是同福哦docker-compose完成的容器编排。

Harbor安装完后会在解压目录下生成docker-compose.yml文件,所以Harbor的启停命令都是由docker-compose完成的,且需要在Harbor的解压目录中完成

sh 复制代码
docker compose stop # 停止
docker compose up -d # 启动

Docker客户端操作

  1. 修改daemon.json文件

    Docker客户端默认采用https请求,但私有镜像中心不接收https请求。需要手动修改Docker客户端的/etc/docker/daemon.json文件。

  2. 重启Docker引擎

    sh 复制代码
    systemctl restart docker
  3. 登录私有镜像中心,输入用户名和密码

    sh 复制代码
    docker login 192.168.192.101
  4. 复制并重命名镜像

    通过docker tag 对镜像进行复制并重命名。

    重命名镜像的<repository>中采用<domain-name>/<project-name>/<software-name>

    如果要区分用户,也可以采用<domain-name>/<project-name>/<username>/<software-name>

    sh 复制代码
    docker tag hello-my-world 192.168.192.101/test/admin/hmyw:1.0
  5. 推送镜像

    sh 复制代码
    docker push 192.168.192.101/test/admin/hmyw:1.0

    此时镜像推送完成

  6. 登出私有镜像中心

    sh 复制代码
    docker logout 192.168.192.101
相关推荐
终将老去的穷苦程序员4 分钟前
基于SpringBoot的餐饮管理系统
java·spring boot·后端
心之伊始5 分钟前
Spring AI Tool Calling 实战:让 Java Agent 调用本地 Bean 工具方法
java·spring boot·agent·spring ai·tool calling
AI人工智能+电脑小能手10 分钟前
【大白话说Java面试题 第110题】【并发篇】第10题:CAS 存在哪些问题?
java·开发语言·面试
瀚高PG实验室28 分钟前
java中间件无法连接数据库
java·数据库·中间件·瀚高数据库
东南门吹雪32 分钟前
JAVA TCP socket编程框架
java·高并发·socket·tcp·nio
xingyuzhisuan32 分钟前
缓存命中率提升方案:从 30% 优化至 82% 全流程优化记录
java·开发语言·缓存·ai
一条泥憨鱼43 分钟前
Java开发效率神器:Lombok从入门到精通!
java·后端·学习·开发·lombok
Jinkxs44 分钟前
Python基础 - 初识内置函数 Python自带的便捷工具
android·java·python
奥利奥夹心脆芙1 小时前
零基础调试 Java 代码:Gemini 报错排查完整实操指南
java
西安邮电大学1 小时前
贪心算法详细讲解
java·后端·其他·算法·面试