三、基于 Docker-registry/Nexus3 搭建本地仓库

本文是《Docker必知必会系列》第三篇,原文发布于个人博客:悟尘纪

上一篇:Docker必知必会系列(二):基于 Dockerfile 构建并运行镜像

Docker 镜像仓库

Repository(仓库)是集中存放镜像的地方。一个 Docker Registry 中可以包含多个 Repository(仓库),每个仓库可以包含多个 Tag(标签),每个标签对应一个 Image(镜像)。

最常使用的 Registry 公开服务是官方的 Docker Hub,这也是默认的 Registry。用户也可以创建本地仓库方便内部使用。

1、官方公共仓库 Docker Hub

目前 Docker 官方维护了一个公共仓库 Docker Hub,其中已经包括了数量超过 2,650,000 的镜像。大部分需求都可以通过在 Docker Hub 中直接下载镜像来实现。

你可以在 https://hub.docker.com 免费注册一个 Docker 账号。通过执行 docker login 命令交互式的输入用户名及密码来完成在命令行界面登录 Docker Hub。

推送镜像

用户可以在登录后通过 docker push 命令来将自己的镜像推送到 Docker Hub。

以下命令中的 lxl823 请替换为你的 Docker 账号用户名。

docker tag nginx lxl823/nginx:1.17.9
docker image ls
REPOSITORY       TAG            IMAGE ID            CREATED             SIZE
nginx            latest          6678c7c2e56c        6 days ago          127MB
lxl823/nginx     1.17.9          6678c7c2e56c        6 days ago          127MB

docker push lxl823/nginx:1.17.9

登录 hub.docker.com ,可以看到镜像已经发布到仓库中。

Docker hub 镜像仓库

自动构建

Docker Hub 可以自动从外部存储库中的源代码构建镜像,并将生成的镜像自动推送到您的 Docker 存储库。

设置自动构建允许用户通过 Docker Hub 指定跟踪一个目标网站(支持 GitHub)上的项目,一旦项目发生新的提交 (commit)或者创建了新的标签(tag),Docker Hub 会自动构建镜像并推送到 Docker Hub 中。

要配置自动构建,包括如下的步骤:

  • 登录 Docker Hub;
  • 在 Docker Hub 点击右上角头像,在账号设置(Account Settings)中关联(Linked Accounts)目标网站;
  • 在 Docker Hub 中新建或选择已有的仓库,在 Builds 选项卡中选择 Configure Automated Builds
  • 选取一个目标网站中的项目(需要含 Dockerfile)和分支;
  • 指定 Dockerfile 的位置,并保存。

之后,可以在 Docker Hub 的仓库页面的 Timeline 选项卡中查看每次构建的状态。

进一步了解:Set up automated builds

2、基于 docker-registry 搭建本地仓库

docker-registry 是官方提供的工具,可以用于构建私有的镜像仓库。本文内容基于 docker-registry v2.x 版本。

安装运行 docker-registry

你可以通过获取官方 registry 镜像来运行。

docker run -d -p 5000:5000 --restart=always --name registry registry

这将使用官方的 registry 镜像来启动私有仓库。默认情况下,仓库会被创建在容器的 /var/lib/registry 目录下。你可以通过 -v 参数来将镜像文件存放在本地的指定路径。

创建好私有仓库之后,就可以使用 docker tag 来标记一个镜像,然后使用 docker push 推送它到仓库。

3、基于 Nexus3 搭建本地仓库

在企业中把内部的一些工具包放入 Nexus 中是比较常见的做法。 Nexus 不仅能够用于创建 Maven 私服,还可以用来创建 yum、pypi、npm、nuget、rubygems 等各种私有仓库。而且,Nexus 从 3.0 版本也开始支持创建 Docker 镜像仓库了!

拉取并启动 nexus 容器

docker run -d \
    --name nexus \
    -p 8085:8081 \
    -p 8086:8086 \
    -v nexus_data:/nexus-data \
    sonatype/nexus3:latest

等待 3-5 分钟,如果 nexus 容器没有异常退出,就可以使用浏览器打开 http://localhost:8085 访问 Nexus 了。

创建本地仓库

创建一个私有仓库的方法: Repository -> Repositories 点击右边菜单 Create repository 选择 docker (hosted)

  • Name:仓库的名称
  • HTTP:仓库单独的访问端口,如 8086
  • Hosted -> Deployment pollcy:请选择 Allow redeploy 否则无法上传 Docker 镜像。

还可以创建一个 docker (proxy) 类型的仓库连接到 DockerHub 上。再创建一个 docker (group) 类型的仓库把刚才的 hosted 与 proxy 添加在一起。主机在访问的时候默认下载私有仓库中的镜像,如果没有将连接到 DockerHub 中下载并缓存到 Nexus 中。

添加访问权限

菜单 Security -> Realms 把 Docker Bearer Token Realm 移到右边的框中保存。

添加用户规则:菜单 Security->Roles->Create rolePrivlleges 选项搜索 docker 把相应的规则移动到右边的框中然后保存。

Nginx 加密代理

部署 Nginx 时,我们先需要获得 SSL 证书。目前提供免费证书的云服务商很多,也可以使用 openssl 自行签发证书。我们还还需要 2 个域名,一个用来展示 nexus 前台,另一个用做 docker 仓库。Nginx 配置如下:

server {
    listen 80;
    server_name nexus3.lixl.cn;  # nexus 前台

    location / {
        proxy_pass http://local.lixl.cn:8085;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Via "nginx";
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

server {
    listen 443 ssl;
    server_name nexus.lixl.cn;  # docker 仓库

    ssl_certificate /etc/nginx/certs/nexus.lixl.cn.crt;
    ssl_certificate_key /etc/nginx/certs/nexus.lixl.cn.key;

    ssl_session_timeout  5m;

    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers   on;

    location / {
        proxy_pass http://local.lixl.cn:8086;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Via "nginx";
        client_max_body_size 1024M;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

server {
    listen 80;
    server_name nexus.lixl.cn;  # docker 仓库

    return 301 https://$server_name$request_uri;
}

登录本地仓库并推送镜像

使用 docker login 进行测试,用户名密码与 Nexus 账号一致。

docker login https://nexus.lixl.cn
Username: admin
Password:
Login Succeeded

通过 docker push 命令将自己的镜像推送到 Nexus:

docker tag nginx nexus.lixl.cn/nginx:20200326
docker image ls
REPOSITORY             TAG             IMAGE ID            CREATED             SIZE
nginx                  latest          6678c7c2e56c        6 days ago          127MB
nexus.lixl.cn/nginx    20200326        6678c7c2e56c        6 days ago          127MB

docker push nexus.lixl.cn/nginx:20200326

推送成功。在本地仓库即可看到新推送的镜像:

本地仓库新推送的镜像

相关文章

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355