[每周一更]-(第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 镜像制作

  1. Dockerfile 制作镜像
    本例中我们采用 Dockerfile的形式制作一个 Ubuntu 镜像,内置 Python,镜像名称:myubuntu。

新建一个目录 dockerUbuntu,结构如下:

dockerUbuntu
|-- Dockerfile

文件 Dockerfile 的内容:

FROM ubuntu:14.04

# 这里要替换 your_name 为您的名字, 和your_email 为您的Email
MAINTAINER your_name 

# 更新源
RUN apt-get update

# 清除缓存
RUN apt-get autoclean

# 安装python
RUN apt-get install -y python

# 启动时运行这个命令
CMD ["/bin/bash"]

-----

From ubuntu:14.04

MAINTAINER wangruoyu 

#更新源
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

你可能感兴趣的:(每周一更,docker,阿里云,数据库)