[每周一更]-(第45期):Docker私有镜像仓库配置并打通阿里云OSS

Docker Registry 2 官方镜像创建一个私有镜像仓库,将Docker 镜像上传到 OSS 相应的路径中。

参考:

自定义制作一个 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 <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

相关推荐
胡小禾14 分钟前
mongoDB-1
数据库·mongodb
天冬忘忧20 分钟前
MongoDB在Linux系统中的安装与配置指南
数据库·mongodb·datax
___波子 Pro Max.2 小时前
Docker镜像和容器
docker
睡不醒的小泽2 小时前
VSCode环境下连接 MySQL 8.0 数据库 (C++)
数据库·windows·vscode
藓类少女4 小时前
正则表达式
数据库·python·mysql·正则表达式
魏 无羡5 小时前
pgsql 分组查询方法
java·服务器·数据库
szcsd1234567895 小时前
简单有效关于msvcp140.dll丢失的解决方法,msvcp140.dll修复的方法原理及步骤
数据库·dll文件·dll修复工具·dll修复·dll丢失
江凡心5 小时前
Qt 每日面试题 -1
服务器·数据库·qt
好记忆不如烂笔头abc5 小时前
db2恢复数据库
数据库
Counter-Strike大牛6 小时前
MySQL迁移达梦报错,DMException: 第1 行附近出现错误: 无效的表或视图名[ACT_GE_PROPERTY]
java·数据库