云原生之容器技术 Docker 入门 (二)

88 阅读4分钟
  • 持续创作,加速成长!这是我参与「掘金日新计划 · 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

image.png

  • 查询数据卷详情:Mountpoint为容器挂载点,即为/var/lib/docker/volumes/卷名/_data
docker volume inspect test

image.png

  • 其他操作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临时数据卷,产生的数据只会存在于内存中,意味着容器关闭,数据将会删除。