本文是《Docker必知必会系列》第三篇,原文发布于个人博客:悟尘纪。
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 role
在 Privlleges
选项搜索 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
推送成功。在本地仓库即可看到新推送的镜像:
本地仓库新推送的镜像
网友评论