目录
镜像分层概念
Docker 支持通过扩展现有镜像,创建新的镜像。
最大的一个好处就是 - 共享资源。
自定义镜像
拉下来的Ubuntu系统是不带vim(一个编辑器)的。
但是我们常用vim,如果每次都要下载会很麻烦的
所以我们就要构建一个新的Ubuntu镜像天生自带vim
- 我们先在本容器中更新包管理器apt-get update
- 在本容器中下载vim:apt-get -y install vim(可以测试一下是否可用)
- 在容器外部执行命令docker commit -m "add vim" -a "lt" 423233962f3c ubuntu/vim:0.0.1,
- 查看镜像
- 停止之前启动的容器并用此镜像运行一个容器,并使用vim,发现可以使用
分层和自定义镜像之间的关联
如果多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
修改会被限制在单个容器内。
这就是的容器 Copy-on-Write 特性。
- 新数据会直接存放在最上面的容器层。
- 修改现有数据会先从镜像层将数据复制到容器层,修改后的数据直接保存在容器层中,镜像层保持不变。
- 如果多个层中有命名相同的文件,用户只能看到最上面那层中的文件。
当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。
容器层保存的是镜像变化的部分,不会对镜像本身进行任何修改。
发布镜像到阿里云
首先在容器镜像服务创建一个个人实例
点击个人实例的镜像仓库
进入管理页面跟着步骤来
会显示success
之后修改tag并且提交到远程
可以在阿里云看到
拉取阿里云的镜像
docker pull registry.cn-hangzhou.aliyuncs.com/lt_123/lt:0.0.1
并使用vim发现可以使用成功。
容器数据卷
卷的设计目的就是数据的持久化,完全独立与容器的生命周期,因此Docker不会在容器删除时删除其挂载的数据卷。
特点:
1. 数据卷可以在容器之间共享和重用数据。
2. 卷的更改可以直接生效。
3. 数据卷的更改不会包含在镜像的更新中。
4. 数据卷的生命周期一直持续到没有容器使用它为止。
容器的持久化
容器间继承+共享数据
很简单一个实例:如果你开启一个mysql容器,别人把容器给你-f强制删除了,你容器里边的数据就全部丢了。为了防止这种情况,我们可以让容器的文件和本地文件共享,即使删除了容器,数据仍然保存。
案例:Ubuntu容器某个/tmp/docker_data和我本地/tmp/host_data互通
docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_data ba6acccedd29 bash
我们在/tmp/docker_data创建一个a.txt:
root@80e2ec097324:/tmp/docker_data# touch a.txt
就会发现本地/tmp/host_data目录下也会有a.txt
假如容器停了,本地文件写入b.txt,容器开启后会同步吗?
答案是:可以。自己试去吧。
如果要限定容器内只能读不能写:(默认读写是rw)
docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_data:ro ba6acccedd29 bash
容器卷之间有继承机制:(案例)
docker run -it --privileged=true --valumes-from [name] ubuntu bash