制作镜像(含centos上docker安装)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了制作镜像(含centos上docker安装)相关的知识,希望对你有一定的参考价值。
参考技术A------------------------------------预备:安装docker-ce------------------------------------------------------
1、安装依赖
docker依赖于系统的一些必要的工具,可以提前安装。
yum install -y yum-utils device-mapper-persistent-data lvm2
2、添加软件源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3、安装docker-ce
yum clean all
yum makecache fast
yum -y install docker-ce
4、启动服务
通过systemctl启动服务
systemctl start docker
------------------------------------开始制作镜像------------------------------------------------------
docker pull percona:5.7-centos
然后 创建 Dockerfile:
加上USER root以后,
继续build又报错:
只好重新把docker的deamon配置改了,放在新的磁盘上。这不是重点,这里掠过。
把以下配置放在docker-compose.yml中:(注意缩进和分隔,冒号后面必须有空格)
然后启动容器:(这句话要在compose文件所在的目录下执行)
直到有一步骤报错: Failed to get D-Bus connection: Operation not permitted
就是在systemctl 或 service 对mysql进行启停的时候,报的.
网上查到的解决方案是要重新用一种方式run:
然后一直报错说找不到systemctl,没有systemctl就不能方便得在docker内部启停mysql.百度基本上是如下方案:
1.启动(run)镜像时候 -v /sys/fs/cgroup:/sys/fs/cgroup:ro /usr/sbin/init
2.在dockerfile中添加cmd ["/usr/sbin/init"]
但各种尝试,都报错.最常见的是这个错误:
Failed to mount tmpfs at /run: Operation not permitted
[!!!!!!] Failed to mount API filesystems, freezing.
无数次尝试以后,终于得知在启动的时候,不用-it,改用-d成功.:
用下面的语句重新生成镜像:
centos7下安装docker(5镜像命令)
1.前面我制作了很镜像,利用docker images可以看到我自己制作的所有的镜像
第一列 是我利用docker build -t 镜像名 制作镜像指定的镜像名,但是它对应的是REPOSITORY
实际上一个镜像的名字是由2部分组成的:repostory+tag
但在之前的制作镜像的过程中,我并没有指定镜像的tag,所以使用的是默认的tag:latest
TAG可以用任何字符表示,通常用于描述版本信息,但其实没有任何的含义
每个repository可以有多个tag,而多个tag可能对应的是同一个镜像
TAG的制作
我们可以使用命令docker tag给镜像打tag
就是如此简单,并没体会出有什么用途:突然发现利用docker tag制作出来的镜像ID一致
下面介绍一下docker HUB
docker hub是docker公司维护的公共registry。用户可以将自己的镜像保存在docker hub免费的repository。如果不希望别人访问自己的镜像,可以购买私有的repository
quay.io是另一个公共的registry,提供与docker hub类似的服务
如何在docker hub上面获取镜像呢?
1.首先在docker hub上面注册一个账号:https://hub.docker.com/
2.在docker host上面登录:docker login -u 用户名,然后输入密码
3.docker hub为了区分不同用户的镜像,镜像的镜像名registry中要包含用户名,完整格式为:【username】/xxx:tag
例如
注:docker官方自己维护的镜像没有用户名
4.通过docker push将镜像上传到docker hub
docker 会上传镜像的每一层,但由于13051839892/cmd:test中只有这一层与官方镜像不一样,所以只上传这一层新的镜像,实际上传的数据很少。总结起来就是上传镜像的时候只有新增加的层会被上传
如果想上传同一镜像名(repository相同)不同tag的镜像,使用docker push 上传时省略tag的名字就可以了:如:docker push 13151839892/cmd
5.登录https://hub.docker.com,在public repository中就可以看到上传的镜像
如果要删除docker hub中上传的镜像,只能在docker hub上面删除
6。这个镜像可以被其他的Docker host下载使用
使用docker pull【username】/xxx:tag
Docker Hub虽然非常方便,但还是有些限制:
1.需要外网的连接,上传和下载的速度非常慢
2.上传到Docker Hub的镜像任何人都能访问,私有的repository并不是免费的
3.安全原因,很多组织不允许把镜像放到外网
我们可以通过搭建本地registry解决
搭建本地registry:学习这里的时候有坑有难点,下面我仔细的记录一下每一步的操作!!!
1.首先下载一个registry镜像(这里必须使用registry镜像)
2.后台启动一个registry容器,-d:后台运行,-p:将容器的5000的端口映射到 Host 主机上的5000的端口,-v:将容器的/var/lib/registry映射到Host的/myregistry上
docker ps看到registry这个容器是运行的状态
3.修改镜像的tag
4.上传镜像:可以看到push并没有成功,报错:http:server gave HTTP response to HTTPS client,
出现这个问题的原因是Docker自从1.3.X之后docker registry交互默认使用的是HTTPS,但是搭建私有镜像默认使用的是HTTP服务,所以与私有镜像交时出现以上错误。
解决办法是在docker server启动的时候增加启动参数默认使用http访问:
修改/usr/lib/systemd/system/docker.service中的第12行
将
修改为
然后重启docker:systemctl restart docker
5.重新上传镜像
我们发现还是不成功:connection refused
这是由于重启我们之前在后台启动的registry容器将会成为Exited状态,所以我们要再次在后台启动一个registry容器
6.这时我们再次重新上传镜像:能够成功上传
7.从私有仓库下载镜像
a。先将本地的镜像删除
b。重新pull镜像
当我重新pull完这个镜像之后,我很傻逼的想了一个问题:如何判断pull下来的这个镜像是在我私有仓库里面下载下来的呢?答案应该是:首先下载这个镜像的时候特别快,其次是应该不会有这么巧合的事情,别人上传的镜像和你上传的镜像名字一致吧。
以上是关于制作镜像(含centos上docker安装)的主要内容,如果未能解决你的问题,请参考以下文章