[每周一更]-(第45期):Docker私有镜像仓库配置并打通阿里云OSS
Docker Registry 2 官方镜像创建一个私有镜像仓库,将Docker 镜像上传到 OSS 相应的路径中。
参考:
- BatchCompute Docker支持:https://help.aliyun.com/document_detail/143334.html?spm=a2c4g.143333.0.0.4a6f8752ls18FR
- Docker Registry:https://docs.docker.com/registry
- 基于OSS搭建私有 Docker Registry:https://developer.aliyun.com/article/57310
- http://static-aliyun-doc.oss-cn-hangzhou.aliyuncs.com/download%2Fpdf%2F60721%2F%25E5%25B8%25B8%25E8%25A7%2581%25E9%2597%25AE%25E9%25A2%2598_cn_zh-CN.pdf
- 容器镜像常见问题:https://help.aliyun.com/document_detail/312336.html?spm=a2c4g.60761.0.0.330c6b62i2y0df
- 配置注册表:https://dockerdocs.cn/registry/configuration/
- ossfs的配置:https://help.aliyun.com/document_detail/153893.htm?spm=a2c4g.405812.0.0.4b854b78kph4DE 这种方式,将OSS挂载到指定宿主机目录下,指定对应挂载目录作为 -v 映射 。
自定义制作一个 Docker镜像,上传到阿里云的容器镜像服务仓库中或者使用 registry 工具上传到阿里云 OSS
使用 registry 工具上传到阿里云 OSS
一、Docker 镜像制作
- Dockerfile 制作镜像
本例中我们采用 Dockerfile的形式制作一个 Ubuntu 镜像,内置 Python,镜像名称:myubuntu。
新建一个目录 dockerUbuntu,结构如下:
dockerUbuntu
|-- Dockerfile
文件 Dockerfile 的内容:
FROM ubuntu:14.04
# 这里要替换 your_name 为您的名字, 和your_email 为您的Email
MAINTAINER your_name <your_email>
# 更新源
RUN apt-get update
# 清除缓存
RUN apt-get autoclean
# 安装python
RUN apt-get install -y python
# 启动时运行这个命令
CMD ["/bin/bash"]
-----
From ubuntu:14.04
MAINTAINER wangruoyu <wangruoyu@genekang.com>
#更新源
RUN apt-get update
#清除缓存
RUN apt-get autoclean
#安装python
RUN apt-get install -y python
#启动时运行这个命令
CMD ["/bin/bash"]
运行以下命令,build 镜像:
cd dockerUbuntu #进入 dockerUbuntu 目录
docker build -t myubuntu ./ #正式build, 命名为 myubuntu
注意:docker 命令在 ubuntu 中默认需要加 sudo 才能运行,而在 Mac/Windows 中,需要从 “Docker Quickstart Terminal” 中启动的命令行工具中运行。
build 完成后, 运行以下命令查看:
docker images
二、安装 OSS Docker Registry 2
假设 docker 存储到 OSS 的目录路径为oss://your-bucket/dockers/,利用 Docker Registry 2 官方镜像创建一个私有镜像仓库,需要配置了 OSS 的 Access Key ID, Access Key Secret,Region,Bucket 等信息。
具体安装步骤如下:
i. 在当前目录生成文件 config.yml
version: 0.1
log:
level: debug
storage:
oss:
accesskeyid: your_access_key_id
accesskeysecret: your_access_key_secret
region: oss-cn-shenzhen
bucket: your-bucket
rootdirectory: dockers
secure: false
internal: false
http:
addr: 0.0.0.0:5000
-- 实际栗子(推荐yml文件) --
version: 0.1
log:
level: debug
storage:
oss:
accesskeyid: xxx
accesskeysecret: xxx
region: oss-cn-shenzhen
bucket: genekangshenzhen
rootdirectory: dockers
secure: false
internal: false
http:
addr: 0.0.0.0:5000
- **直接运行的方式**
- 1、启动容器
docker run -d -p 5000:5000 \
-e "REGISTRY_STORAGE=oss" \
-e "REGISTRY_STORAGE_OSS_REGION=oss-cn-shenzhen" \
-e "REGISTRY_STORAGE_OSS_BUCKET=genekangshenzhen" \
-e "REGISTRY_STORAGE_OSS_PREFIX=/registry" \
-e "REGISTRY_STORAGE_OSS_ACCESSKEYID=xxx" \
-e "REGISTRY_STORAGE_OSS_ACCESSKEYSECRET=xxx" \
registry:2
- 2、创建Dockerfile并写入生成镜像
FROM nginx
COPY index.html /usr/share/nginx/html/index.html
RUN echo 'hello world' > /usr/share/nginx/html/hello.txt
RUN echo 'this is a sample docker image' > /usr/share/nginx/html/description.txt
CMD ["nginx", "-g", "daemon off;"]
# 构建镜像
docker build -t nginx-image:v1 .
docker build -t localhost:5000/nginx-image:latest .
docker build -t 127.0.0.1:5000/nginx-image:latest .
- docker tag myubuntu(旧) localhost:5000/myubuntu(新)
docker tag nginx-image:v1 localhost:5000/nginx-image:v1
# 推送到 Docker Registry
docker push localhost:5000/nginx-image:latest
docker push 127.0.0.1:5000/nginx-image:latest
docker push localhost:5000/nginx-image:v1
docker push nginx-image:v1
- 3、拉取 Docker 镜像
docker pull localhost:5000/nginx-image:latest
- 4、删除 Docker 镜像
docker rmi localhost:5000/nginx-image:latest
其中的变量需要替换:
参数 | 描述 |
---|---|
your_access_key_id | 阿里云的 access key id |
your_access_key_secret | 阿里云的 access key secret |
your-bucket | 阿里云的 bucket |
oss-cn-shenzhen | bucket 所在的 region |
关于 OSS 配置的详细信息请参见 Docker 官方文档。
两种配置的方式上传镜像到OSS路径中
- 将OSS目录挂载到宿主机,先配置好了挂载目录,在进行-v 指定目录名称映射
- 以上案例是docker存储驱动调用OSS接口管理
ii. 运行命令安装
docker pull registry:2
docker run -v `pwd`/config.yml:/etc/docker/registry/config.yml -p 5000:5000 --name registry -d registry:2
# **17服务器**
## 1、指定yml,registry:2.6.0 failed - 权限问题,版本2.6可pull+管理对象存储服务(OSS)权限
docker run -it -d -p 5000:5000 -v `pwd`/config.yml:/etc/docker/registry/config.yml --restart=always --privileged=true --name registry04 registry:2.6.0
## 2、无指定yml,registry:2.6.0 success
docker run -it -d -p 5000:5000 -v /BioDB2/wangruoyu/dockerUbuntu:/var/lib/registry/docker/registry --restart=always --privileged=true --name registry01 registry:2.6.0
# **232服务器**
## 1、指定yml,registry:2.6.0 failed - 权限不足,push 500报错,也可能是 registry:2,建议用最新版或2.6.0
docker run -v /home/humx/config.yml:/etc/docker/registry/config.yml -p 5000:5000 --name registry2.6.0 -d registry:2.6.0
## 2、指定yml,registry:latest success (第一种yml)
docker run -it -d -v `pwd`/config.yml:/etc/docker/registry/config.yml -p 5000:5000 --restart=always --privileged=true --name registry01 registry:latest
## 3、无指定yml,registry:2.6.0 success (第二种挂载方式)
**(1)需要挂载操作**
echo genekangshenzhen:xxx:xxx > /etc/passwd-ossfs
chmod 640 /etc/passwd-ossfs
mkdir /tmp/ossfs-1
ossfs genekangshenzhen /tmp/ossfs-1 -ourl=http://oss-cn-shenzhen.aliyuncs.com
**(2)运行容器**
docker run -it -d -p 8080:5000 -v /tmp/ossfs-1:/var/lib/registry/docker/registry --restart=always --privileged=true --name registry02 registry:2.6.0
-v参数 : /tmp/ossfs-1(宿主机本地目录):/var/lib/registry/docker/registry (docker 内pod 目录)(这里的目录是进入到容器启动的pod内查看到的目录路径)
注意:region 使用 oss-cn-shenzhen, 表示使用华南1(深圳)region 的 OSS,而后面提交作业也需要提交到相应的 region 才能正常工作。
iii.查看结果
docker ps #查看运行的container
如果成功安装,可以看到 registry:2
镜像上传 OSS
docker push localhost:5000/nginx-image:v1
docker push localhost:8080/nginx-image-01:v1
docker push localhost:5000/myubuntu
docker push myubuntu
说明
要用 localhost:5000/ 作为前缀,用其他的字符串无法上传。5000 端口是第(1)步中 -p 5000:5000 中(冒号前的5000)指定的。 您制作的镜像名称为 localhost:5000/myubuntu,而不是 myubuntu。
检验镜像上传是否成功, 可以使用 OSS 控制台查看是否有这个目录:oss://your-bucket/dockers/docker/registry/v2/repositories/myubuntu/,
使用 Docker 时,对应参数填写如下: BATCH_COMPUTE_DOCKER_REGISTRY_OSS_PATH:oss://your-bucket/dockers BATCH_COMPUTE_DOCKER_IMAGE:localhost:5000/myubuntu:xxxx(xxxx 为 myubuntu 的版本号)。
错误信息
推送镜像到ACR报错received unexpected HTTP status: 500 Internal Server Error
可以按照如下信息排查
- 1 docker 客户端不要设置代理。docker info 查看一下proxy相关配置
- 2 企业版本默认是存放到oss里面的,可以看下对应的bucket 是否被删除了
- 3 ram问题,可以查下AliyunContainerRegistryDefaultRole 的授权信息,如果为空就代表是异常的,还有管理对象存储服务(OSS)权限;
docker push localhost:5000/myubuntu
The push refers to a repository [localhost:5000/myubuntu]
53ca46d8cc11: Pushing [==================================================>] 23.62 MB/23.62 MB
89dc10ae098b: Pushing 1.536 kB
9a6f576cf0d3: Pushing [==================================================>] 15.85 MB/15.85 MB
83109fa660b2: Pushing [==================================================>] 3.584 kB
30d3c4334a23: Pushing [==================================================>] 209.9 kB
f2fa9f4cf8fd: Retrying in 5 seconds
Received unexpected HTTP status: 500 Internal Server Error
问题找到了,是oss子账户的秘钥的权限不足;导致push报错,但是提示的不够明显;
(1)yml配置,OSS镜像路径
oss://genekangshenzhen/dockers_test/docker/registry/v2/repositories/nginx-image
oss://genekangshenzhen/dockers/docker/registry/v2/repositories/multipseq2
(2)目录挂载,OSS镜像路径在:oss://genekangshenzhen/v2/repositories/nginx-image-01/
通过yml挂载成功的情况:
docker push localhost:5000/nginx-image:v1
The push refers to repository [localhost:5000/nginx-image]
36c17e634752: Pushed
a8540037937b: Pushed
9b3a4aefa712: Pushed
d47e4d19ddec: Pushed
8e58314e4a4f: Pushed
ed94af62a494: Pushed
875b5b50454b: Pushed
63b5f2c0d071: Pushed
d000633a5681: Pushed
v1: digest: sha256:e242f22dd1661c68238b5d084357ac1f74841d839801c98a26528a3181f98448 size: 2191
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!