docker创建私有镜像仓库搭建教程
我的环境相关设置如下
环境:centos7
IP地址:10.211.55.30
dockere版本:1.10.3
镜像仓库:v2
首先在10.211.55.30机器上下载registry镜像
$dockerpullregistry
也可以进行镜像导入的方法进行离线的安装。可以去我的网盘中下载:https://pan.baidu.com/s/1jHZlz2u
然后进入Docker中进行导入
$dockerload-iregistry.tar
下载完之后我们通过该镜像启动一个容器
$dockerrun-d-p5000:5000registry
默认情况下,会将仓库存放于容器内的/tmp/registry目录下,这样如果容器被删除,则存放于容器中的镜像也会丢失,所以我们一般情况下会指定本地一个目录挂载到容器内的/tmp/registry下,我将/opt/data/registry目录挂载到/tmp/registry目录下,如果你本地没有这个目录需要新创建,同时需要给/opt/data/registry目录扩大权限
chmod+777/opt/data/registry
此处有坑:默认情况下是在容器内的/tmp/registry目录下,但是我的容器镜像是存放在容器中的/var/lib/registry 这个位置。
我是搭建完毕之后,上传一个镜像之后然后使用find/-name***查到的位置
[root@server01~]#dockerrun-d-p5000:5000-v/opt/data/registry:/var/lib/registryregistry 55c60589cb0e2d094d5371c4dd650127cfeae1b361477d50cfe48552e6308830
可以看到我们启动了一个容器,地址为:10.211.55.30:5000。
测试
接下来我们就要操作把一个本地镜像push到私有仓库中。首先在10.211.55.30机器下pull一个比较小的镜像来测试(此处使用的是busybox)
$sudodockerpullbusybox
接下来修改一下该镜像的tag,镜像的格式为 镜像仓库IP:端口/镜像名称
$sudodockertagbusybox10.211.55.30:5000/busybox
接下来把打了tag的镜像上传到私有仓库。
$sudodockerpush10.211.55.30:5000/busybox
可以看到push失败,具体错误如下:
2015/01/0511:01:17Error:Invalidregistryendpointhttps://192.168.112.136:5000/v1/:Gethttps://192.168.112.136:5000/v1/_ping:dialtcp192.168.112.136:5000:connectionrefused.IfthisprivateregistrysupportsonlyHTTPorHTTPSwithanunknownCAcertificate,pleaseadd`--insecure-registry192.168.112.136:5000`tothedaemon'sarguments.InthecaseofHTTPS,ifyouhaveaccesstotheregistry'sCAcertificate,noneedfortheflag;simplyplacetheCAcertificateat/etc/docker/certs.d/192.168.112.136:5000/ca.crt
因为Docker从1.3.X之后,与dockerregistry交互默认使用的是https,然而此处搭建的私有仓库只提供http服务,所以当与私有仓库交互时就会报上面的错误。为了解决这个问题需要在启动dockerserver时增加启动参数为默认使用http访问。修改docker启动配置文件(此处是修改10.211.55.30机器的配置)centos7下配置文件地址为:/usr/lib/systemd/system/docker.service,在其中增加–insecure-registry10.211.55.30:5000如下所示:
[Unit] Description=DockerApplicationContainerEngine Documentation=http://docs.docker.com After=network.targetrhel-push-plugin.socket Wants=docker-storage-setup.service [Service] Type=notify NotifyAccess=all EnvironmentFile=-/etc/sysconfig/docker EnvironmentFile=-/etc/sysconfig/docker-storage EnvironmentFile=-/etc/sysconfig/docker-network Environment=GOTRACEBACK=crash ExecStart=/usr/bin/docker-currentdaemon\ --exec-optnative.cgroupdriver=systemd\ --insecure-registry=10.211.55.30:5000\ $OPTIONS\ $DOCKER_STORAGE_OPTIONS\ $DOCKER_NETWORK_OPTIONS\ $ADD_REGISTRY\ $BLOCK_REGISTRY\ $INSECURE_REGISTRY LimitNOFILE=1048576 LimitNPROC=1048576 LimitCORE=infinity TimeoutStartSec=0 MountFlags=slave Restart=on-abnormal [Install] WantedBy=multi-user.target
修改完之后,重启Docker服务。
$restartdocker
重启完之后我们再次运行推送命令,把本地镜像推送到私有服务器上。
$sudodockerpush10.211.55.30:5000/busybox
可以看到镜像已经push到私有仓库中去了。
进行到这一步的时候也不一定能够成功,使用journalctl-f可以查看日志信息,通过日志信息可以查看到如下信息,关注标红的部分,显示的是SELinux的问题,我的处理方法是直接关闭SELinux
Jan2716:08:16server01docker-current[15241]:time="2017-01-27T08:08:16Z"level=errormsg="responsecompletedwitherror"err.code="blobunknown"err.detail=sha256:45a2e645736c4c66ef34acce2407ded21f7a9b231199d3b92d6c9776df264729err.message="blobunknowntoregistry"go.version=go1.7.3http.request.host="10.211.55.30:5000"http.request.id=a2dbff10-2937-4e9e-94f3-16275739ad61http.request.method=HEADhttp.request.remoteaddr="10.211.55.30:48256"http.request.uri="/v2/centos_20170127/blobs/sha256:45a2e645736c4c66ef34acce2407ded21f7a9b231199d3b92d6c9776df264729"http.request.useragent="docker/1.10.3go/go1.6.3git-commit/cb079f6-unsupportedkernel/3.10.0-327.36.3.el7.x86_64os/linuxarch/amd64"http.response.contenttype="application/json;charset=utf-8"http.response.duration=1.4262mshttp.response.status=404http.response.written=157instance.id=f9f97de9-15bc-41e3-9ec3-f1033e57a77evars.digest="sha256:45a2e645736c4c66ef34acce2407ded21f7a9b231199d3b92d6c9776df264729"vars.name="centos_20170127"version=v2.6.0 Jan2716:08:16server01docker-current[15241]:10.211.55.30--[27/Jan/2017:08:08:16+0000]"HEAD/v2/centos_20170127/blobs/sha256:45a2e645736c4c66ef34acce2407ded21f7a9b231199d3b92d6c9776df264729HTTP/1.1"404157"""docker/1.10.3go/go1.6.3git-commit/cb079f6-unsupportedkernel/3.10.0-327.36.3.el7.x86_64os/linuxarch/amd64" Jan2716:08:16server01docker-current[15241]:time="2017-01-27T08:08:16Z"level=errormsg="responsecompletedwitherror"err.code=unknownerr.detail="filesystem:mkdir/var/lib/registry/docker:permissiondenied"err.message="unknownerror"go.version=go1.7.3http.request.host="10.211.55.30:5000"http.request.id=158612a0-39f5-41f5-9985-c80db7da911fhttp.request.method=POSThttp.request.remoteaddr="10.211.55.30:48258"http.request.uri="/v2/centos_20170127/blobs/uploads/"http.request.useragent="docker/1.10.3go/go1.6.3git-commit/cb079f6-unsupportedkernel/3.10.0-327.36.3.el7.x86_64os/linuxarch/amd64"http.response.contenttype="application/json;charset=utf-8"http.response.duration=1.671997mshttp.response.status=500http.response.written=164instance.id=f9f97de9-15bc-41e3-9ec3-f1033e57a77evars.name="centos_20170127"version=v2.6.0 Jan2716:08:16server01docker-current[15241]:10.211.55.30--[27/Jan/2017:08:08:16+0000]"POST/v2/centos_20170127/blobs/uploads/HTTP/1.1"500164"""docker/1.10.3go/go1.6.3git-commit/cb079f6-unsupportedkernel/3.10.0-327.36.3.el7.x86_64os/linuxarch/amd64" Jan2716:08:16server01docker-current[15241]:time="2017-01-27T16:08:16.115997771+08:00"level=errormsg="Uploadfailed,retrying:ReceivedunexpectedHTTPstatus:500InternalServerError" Jan2716:08:16server01setroubleshoot[5771]:failedtoretrieverpminfofor/opt/data/registry Jan2716:08:16server01setroubleshoot[5771]:SELinuxispreventing/bin/registryfromwriteaccessonthedirectory/opt/data/registry.ForcompleteSELinuxmessages.runsealert-l748743d8-dd8a-4482-9771-94a403bccf18 Jan2716:08:16server01python[5771]:<strong>SELinuxispreventing/bin/registryfromwriteaccessonthedirectory/opt/data/registry.</strong> *****Plugincatchall_labels(83.8confidence)suggests******************* Ifyouwanttoallowregistrytohavewriteaccessontheregistrydirectory Thenyouneedtochangethelabelon/opt/data/registry Do #semanagefcontext-a-tFILE_TYPE'/opt/data/registry' whereFILE_TYPEisoneofthefollowing:cgroup_t,docker_var_lib_t,svirt_home_t,svirt_sandbox_file_t,virt_home_t. Thenexecute: restorecon-v'/opt/data/registry' *****Plugincatchall(17.1confidence)suggests************************** Ifyoubelievethatregistryshouldbeallowedwriteaccessontheregistrydirectorybydefault. Thenyoushouldreportthisasabug. Youcangeneratealocalpolicymoduletoallowthisaccess. Do allowthisaccessfornowbyexecuting: #grepregistry/var/log/audit/audit.log|audit2allow-Mmypol #semodule-imypol.pp
关闭方法如下
查看SELinux状态:
1、/usr/sbin/sestatus-v##如果SELinuxstatus参数为enabled即为开启状态 SELinuxstatus:enabled 2、getenforce##也可以用这个命令检查
关闭SELinux:
1、临时关闭(不用重启机器):
setenforce0##设置SELinux成为permissive模式setenforce1设置SELinux成为enforcing模式
2、修改配置文件需要重启机器:
修改/etc/selinux/config文件
将SELINUX=enforcing改为SELINUX=disabled
重启机器即可
接下来我们删除本地镜像,然后从私有仓库中pull下来该镜像。
$sudodockerpull10.211.55.30:5000/busybox
到此就搭建好了Docker私有仓库。上面搭建的仓库是不需要认证的。
管理仓库中的镜像
查询
在PrivateRegistry2中查看或检索Repository或images,将不能用dockersearch,会报下边的错误
$dockersearch10.211.55.30:5000/busybox/ Errorresponsefromdaemon:Unexpectedstatuscode404
但通过v2版本的API,我们可以实现相同目的,必须按照IP:port/v2/_catalog格式:
[root@server01~]#curlhttp://10.211.55.30:5000/v2/_catalog {"repositories":["centos"]} [root@server01~]#curlhttp://10.211.55.30:5000/v2/centos/tags/list {"name":"centos","tags":["latest"]}
拉取镜像如下
[root@server01~]#dockerpull10.211.55.30:5000/centos Usingdefaulttag:latest Tryingtopullrepository10.211.55.30:5000/centos... latest:Pullingfrom10.211.55.30:5000/centos Digest:sha256:7dfffa13a2addc317ac3bdfbddbd4604ea629decea19c271481e5c45245b7612 Status:Downloadednewerimagefor10.211.55.30:5000/centos:latest
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。