七、构建镜像,搭建镜像仓库

来源:互联网 发布:ipad儿童游戏 知乎 编辑:程序博客网 时间:2024/05/29 03:12

一、构建镜像

推荐方法:
1.创建你的dockerfile 最好是用sed修改配置 yum安装文件 另外推荐使用开源软件的官方yum源以及epel源来获取最新的软件包,这样可以避免一些版本漏洞
2.使用daocloud创建镜像,这样用的目的是为了加快速度,而且可以把镜像保存在公有云上面,避免下次跨机房或者跨地域迁移麻烦。
这里以php为例,使用daocloud构建一个项目php7镜像:

从服务器上登录到daocloud.io 拉取你的镜像

二、构建私有仓库

背景:
如果大量的docker宿主机从公网上拉取镜像,那么将会造成大量的网络负载,为了避免这种网络负载出现影响网速或者说对业务线造成影响。推荐在本地选择一台docker-master 建立一个镜像仓库。其他的docker宿主机从这里拉取,走内网网卡,不会影响到业务线。

1.关于Registry
官方的Docker hub是一个用于管理公共镜像的好地方,我们可以在上面找到我们想要的镜像,也可以把我们自己的镜像推送上去。但是,有时候,我们的使用场景需要我们拥有一个私有的镜像仓库用于管理我们自己的镜像。这个可以通过开源软件Registry来达成目的。Registry在github上有两份代码:老代码库和新代码库。老代码是采用python编写的,存在pull和push的性能问题,出到0.9.1版本之后就标志为deprecated,不再继续开发。从2.0版本开始就到在新代码库进行开发,新代码库是采用go语言编写,修改了镜像id的生成算法、registry上镜像的保存结构,大大优化了pull和push镜像的效率。官方在Docker hub上提供了registry的镜像(详情),我们可以直接使用该registry镜像来构建一个容器,搭建我们自己的私有仓库服务。
2.Registry的部署
运行下面命令获取registry镜像,
sudo docker pull registry
然后启动一个容器,
$ sudo docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 –restart=always –name registry registry
Registry服务默认会将上传的镜像保存在容器的/var/lib/registry,我们将主机的/opt/registry目录挂载到该目录,即可实现将镜像保存到主机的/opt/registry目录。
运行docker ps看一下容器情况,
看到run就可以说明OK
说明我们已经启动了registry服务,打开浏览器输入http://仓库ip:5000/v2,出现下面情况说明registry运行正常。

3.验证
现在我们通过将镜像push到registry来验证一下。
我的机器上有个training/webapp的镜像,我们要通过docker tag将该镜像标志为要推送到私有仓库,

$ sudo docker tag training/webapp localhost:5000/webapp

接下来,我们运行docker push将hello-world镜像push到我们的私有仓库中,
sudo docker push localhost:5000/webapps
现在我们可以查看我们本地/opt/registry目录下已经有了刚推送上来的webapp。我们也在浏览器中输入http://Docker本地仓库ip/v2/_catalog

现在我们可以先将我们本地的localhost:5000/webapp和training/webapp先删除掉,
sudo docker rmi localhost:5000/webapp
$ sudo docker rmi training/webapp
然后使用docker pull从我们的私有仓库中获取hello-world镜像,
sudo docker pull localhost:5000/webapp

4.可能问题
可能会出现无法push镜像到私有仓库的问题。这是因为我们启动的registry服务不是安全可信赖的。这是我们需要修改docker的配置文件/etc/default/docker(若不存在,则在/lib/systemd/system/docker.service ),添加下面的内容, DOCKER_OPTS=”–insecure-registry xxx.xxx.xxx.xxx:5000”
然后重启docker后台进程,
systemctl daemon-reload
systemctl restart docker
sudo service docker restart
这时再push即可。