- 持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情
- Docker数据管理 ✨✨✨
- Docker端口映射 ✨✨✨
前言
由于docker容器的文件系统在宿主机上存在的方式很复杂,那么我们在宿主机上无法非常方便简单的访问容器的文件,而且容器销毁会导致容器产生的文件都将删除。
在生产环境中使用Docker,比如数据库容器,在我们删除容器的时候,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作,在容器中管理数据有两种方式:
- 数据卷(Data Volumes)
- 数据卷容器(Data Volume Containers)
数据卷(Data Volumes)
是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux中的mount行为。
👉:在容器运行一段时间会产生非常多的日志文件、数据库文件等等,都存在于容器层,当容器发生删除的时候对应文件都将被删除,如果使用数据卷可以将产生的数据持久化保存在我们的宿主机上。
操作数据卷
- 创建数据卷
// 创建一个名为test的数据卷
docker volume create test
- 查看所有数据卷,Windows可以使用Docker控制台
docker volumn ls
- 查询数据卷详情:Mountpoint为容器挂载点,即为
/var/lib/docker/volumes/卷名/_data
docker volume inspect test
- 其他操作prune(清理无用数据卷)、rm(删除数 据卷)
绑定数据卷
对数据卷相关的操作我们已经掌握了,那么如何在创建容器时绑定数据卷呢?
目前Docker提供了三种不同的方式将数据从宿主机挂载到容器中,-mount选项支持三种类型的数据卷:
- volume:普通数据卷,映射到主机/var/lib/docker/volumes路径下
- bind:绑定数据卷,映射到主机指定路径下
- tmpfs:临时数据卷,只存在于内存中
- 创建容器并且绑定数据卷
使用-v 挂载方式,有三个参数:
- 宿主机路径,如果路径不存在,会自动创建
- 容器内绑定的目录,使用绝对路径
- 容器对挂载目录的操作权限,ro 为只读,rw 为读写,默认具备读写权限
// 运行容器名称redis-dev 并且将容器的/data挂载到我本地D盘/redis文件夹 端口映射为6379
docker run -itd –-name redis-dev -v D:\datavolumes\redis:/data -p 6379:6379 redis
数据卷容器(Data Volume Containers)
数据卷容器是专门提供数据卷给其他容器挂载。
- 创建数据卷容器data,并创建一个数据卷挂载到/data
docker run -it -v /data --name data redis
- 可以使用--volumes-from来挂载data容器中的数据卷
docker run -it --volumes-from data --name data1 redis
注意:数所挂载数据卷的容器自身并不需要保持在运行状态,还需要注意的是如果删除了挂载的容器,数据卷不会被自动删除。
端口映射
在实践中,经常会碰到需要多个服务组件容器共同协作的情况,那么如何让容器能够互相访问对方的服务呢?
在启动容器的时候,需要-p参数来指定端口映射,如果不指定对应参数,在容器外部是无法通过网络来访问容器内的网络应用和服务。支持的格式有
- IP:HostPort:ContainerPort
- IP::ContainerPort
- HostPort:ContainerPort。
// 例如下面是使用HostPort:ContainerPort格式本地的6379端口映射到容器的6379
// 也可以多次使用-p绑定多个端口
docker run -itd --name redis-dev -p 6379:6379 redis
总结
数据卷机制为数据管理提供了方便的操作支持,通过这些机制,即使容器在运行中出现故障,用户也不必担心数据发生丢失,只需要重新创建容器即可。当不需要将数据持久化到宿主机或者容器中也可以使用tmpfs临时数据卷,产生的数据只会存在于内存中,意味着容器关闭,数据将会删除。