docker registry实现了docker镜像的管理和迁移,没有registry,docker的功能是不完整的。官方的registry直接拉取下来又不能使用, 必须制作我们自己mips64el架构的registry镜像,笔者进行了艰苦的摸索,开创了一种下述正确的新方法。 需要2台机器,为便于描述,下文中分别称为dscn1、dscn3。其中, dscn1(10.20.42.56):用于搭建docker的服务器 dscn3(10.20.42.189):用于最后拉取镜像时对docker-registry的测试
一、编译m2crypto依赖 docker-registry镜像的制作依赖m2crypto包,先编译好此包,待用。 下载m2crypto源码包,安装,编译 #wget ftp://ftp.pbone.net/mirror/archive.fedoraproject.org/fedora/linux/updates/21/SRPMS/m/m2crypto-0.22.5-2.fc21.src.rpm ;下载rpm源码包 #rpm -ivh m2crypto-0.22.5-2.fc21.src.rpm ;安装源码包 #cd ~/rpmbuild/SPECS ;进入SPECS目录 #rpmbuild -ba m2crypto.spec ;编译m2crypto文件 此时,会提示有依赖包错误 #yum install openssl swig ;安装依赖包 修改m2crypto.spec在global multilib_arches添加mips64el架构 %global multilib_arches mips64el 在48行处,添加如下三行 %ifarch %{mips64el} basearch=mips64el %endif 再次执行编译rpmbuild -ba m2crypto.spec,编译成功 #cd ~/rpmbuild/RPMS/mips64el/ ;进入RPMS目录,找到编译后的包 #rpm -ivh m2crypto-0.22.5-2.fc21.loongson.mips64el.rpm ;安装编译之后的包
二、制作registry镜像 首先你的确保已经安装了docker,且已经制作了mips64el下的基本镜像(具体可参看笔者写的《上篇:龙芯Fedora21推出docker方案》) #git clone https://github.com/docker/docker-registry/archive/0.9.1.tar.gz ;下载docker-registry-0.9.1的官方镜像tar包 #tar xvf 0.9.1.tar.gz -C /home ;解压tar包到home目录下 #cd /home/docker-registry-0.9.1 ;进入解压目录 #grep “x86” ./* -r ;查找上诉目录下含有x86的所有文件,将x86改成mips64el 笔者修改了如下三个文件 #vim ./contrib/golang_impl/fixtures/index/images/e0acc43660ac918e0cd7f21f1020ee3078fec7b2c14006603bbc21499799e7d5/json #vim ./contrib/golang_impl/fixtures/index/images/0e03f25112cd513ade7c194109217b9381835ac2298bd0ffb61d28fbe47081a8/json #vim ./tests/data/511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158/json #vim ./config/config.yml ;修改config.yml的dev(210行)处添加如下内容: storage:local storage_path:/home/data/dockerImag loglevel:debug #vim requirements/main.txt ;修改main.txt文件,删除带有m2crypto一行 [Dockerfile] # change to your base image FROM fedora-base # Install pip RUN yum install -y \ swig \ python-pip \ openssl \ openssl-devel RUN mkdir -p /docker-registry COPY . /docker-registry COPY ./config/boto.cfg /etc/boto.cfg #install pip RUN easy_install pip # Install core RUN pip install file:///docker-registry/depends/docker-registry-core # Install m2crypto registry ADD ./m2crypto-0.22.5-2.fc21.loongson.mips64el.rpm / RUN rpm -ivh /m2crypto-0.22.5-2.fc21.loongson.mips64el.rpm RUN pip install file:///docker-registry#egg=docker-registry[bugsnag,newrelic,cors] ENV DOCKER_REGISTRY_CONFIG /docker-registry/config/config_sample.yml ENV SETTINGS_FLAVOR dev EXPOSE 5000 CMD ["docker-registry"] #docker build -t fc21/registry . ;进行编译 #docker run -d -p 5000:5000 -v /home/data/dockerImg:/tmp/registry fc21/registry ;启动镜像fc21/registry镜像 #docker tag docker.io/hello-world 10.20.42.56:5000/hello-world ;修改hello-world镜像的tag,出现CA相关错误,看下面问题4解决 #docker push 10.20.42.56:5000/hello-world ;push上传到dscn1的注册服务器 如果上述操作成功,将会看到如下信息输出
push一个镜像到registry仓库
三、 验证registry仓库 方法1:在dscn1的浏览器中输入 http://127.0.0.1:5000/v1/search 将会看到
浏览器验证本地registry服务器是否成功
方法2:在测试机dscn3执行下述命令,pull拉取dscn1上传的hello-world镜像
- docker pull 10.20.42.56:5000/hello-world
将会看到类似下面的信息输出
dscn3客户机拉取dscn1上的hello-world镜像
四、错误总结 1.ValueError: ('Missing distribution spec', '/tmp/piyush/common_bundle') 因为pip install 必须指定类似http://的路径,如果是本地目录使用 file://+具体目录 2.swig -python -I/usr/include/python2.7 -I/usr/include -I/usr/include/openssl -includeall -modern -D__x86_64__ -o SWIG/_m2crypto_wrap.c SWIG/_m2crypto.i /usr/include/openssl/opensslconf.h:34: Error: Unable to find 'opensslconf-x86_64.h' error: command 'swig' failed with exit status 1 手动编译m2crypto,注销requirements/main.txt中的m2crypto,添加如下两行在dockerfile文件中 ADD ./m2crypto-0.22.5-2.fc21.loongson.mips64el.rpm / RUN rpm -ivh /m2crypto-0.22.5-2.fc21.loongson.mips64el.rpm 3.No non-localhost DNS nameservers are left in resolv.conf. Using default external servers : [nameserver 8.8.8.8 nameserver 8.8.4.4] 重启一下docker的服务。 4.Error response from daemon: v1 ping attempt failed with error: Get https://10.20.42.56:5000/v1/_ping: EOF. If this private registry supports only HTTP or HTTPS with an unknown CA certificate 编辑测试机的文件 vim /etc/sysconfig/docker 更改如下内容 在启动守护进程的时候加入参数 docker -d --insecure-registry=10.20.42.56:5000 ip得根据具体情况更改 5.failure: repodata/repomd.xml from dockerrepo: [Errno 256] No more mirrors to try. https://yum.dockerproject.org/repo/main/fedora/21/repodata/repomd.xml: [Errno 14] curl#77 - "<Unknown>" 执行命令rpm --query --file /etc/pki/tls/certs/ca-bundle.trust.crt 查看证书 //注销/etc/yum.repos.d/docker.repo里面所有的内容,重装证书,再恢复docker.repo内容yum reinstall ca-certificates-2014.2.1-1.5.fc21.loongson.noarch 6.FATA[0001] Get https://index.docker.io/v1/repositories/library/hello-world/images: x509: failed to load system roots and no roots provided 重装证书,重启docker服务 7.pull拉取官方镜像失败 添加docker的repo源 vim /etc/yum.repos.d/docker.repo [dockerrepo] name=Docker Repository baseurl=https://yum.dockerproject.org/repo/main/fedora/$releasever/ enabled=1 gpgcheck=1 gpgkey=https://yum.dockerproject.org/gpg 8.FATA[0000] Shutting down daemon due to errors: pid file found, ensure docker is not running or delete /var/run/docker.pid 删除/var/run/docker.pid ,重新执行docker -d 9.Error running DeviceCreate (createPool) dm_task_run failed 由于内核模块的缺失导致的,这也是自己编译内核来升级带来的风险,修改内核配置文件(./boot/config-3.10.84-8.fc21.loongson.mips64el)重新编译内核 CONFIG_DM_THIN_PROVISIONING=y