- Docker镜像由多个只读层叠加而成,启动容器时Docker会加载只读镜像层并在镜像栈顶部添加一个读写层。
- 如果运行中的容器修改了现有的一个已存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件只读版本仍然存在。只是已经被读写层中该文件的副本所隐藏,此即“写时复制(COW)”机制。
Data Volume
关闭并重启容器其数据不受影响,但删除Docker容器则其更改将会全部丢失。
存在的问题:
- 存储于联合文件系统中,不易于宿主机访问;
- 容器间数据共享不便
- 删除容器其数据会丢失。
解决办法:卷(volume)
- 卷 是容器上的一个或多个目录,此类目录可绕过联合文件系统,与宿主机上的某种目录“绑定(关联)”
Volume types
- Bind-mount volume:宿主机和容器上2个已知路径建立联系,必须双方都指定。
- Docker-managed volume:指定容器挂载目录,存储上由docker自动指定挂载目录(/var/lib/docker/vfs/dir/<容器长id>),只用指定容器目录,但是宿主机上是随机生成的不能指定。
容器中使用volumes
- Bind-mount volume
- docker run -it -v HOSTDIR:VOLUMEDIR –name bbox1 busybox
- docker inspect -f
{ {.Mounts} }
bbox1 # 过滤数据
- Docker-managed volume
- docker run -it –name bbox2 -v /data busybox
- docker inspect -f
{ {.Mounts} }
bbox2 - docker inspect -f
{ {.NetworkSettings.IPAddress} }
bbox2
Sharing volumes
- 多个容器的卷使用同一个主机目录
- docker run -it –name c1 -v /data/volumes/v1:/data busybox
- docker run -it –name c2 -v /data/volumes/v1:/data busybox
- 复制使用其他容器的卷,为docker run 命令使用–volumes-from选项
- docker run -it –name b1 -v /data/volumes/v2:/data busybox
- docker run -it –name b2 –volumes-from b1 busybox