前言
在使用docker部署时,我们如果要改变一些配置项目,不可能每次都进入容器中修改文件。所以需要用到目录挂载或者卷映射来简化操作。
修改容器内容
当我们需要修改容器中的内容,且不使用目录挂载或者卷映射时,可以使用docker exec命令来进入容器中修改。
docker exec -it 容器ID bash
例如:修改nginx容器中的index.html文件
目录挂载
在我们自己的机器上可以专门开辟一个目录,然后将这个目录和对应容器的目录做一个关联关系,这样一来,修改外部目录可以影响容器内部目录,容器内部目录的修改也可以影响外部目录,而且当容器销毁后用同样的命令重新建立,外部目录的内容不会丢失,可重新映射回容器内部的目录。
docker run -v 宿主机目录:容器目录 容器ID
如果宿主机目录不存在,会自动创建,后续即便删除了容器,宿主机目录也不会被删除,挂载之后,可直接在宿主机目录下操作. 注意:使用目录挂载时,是以主机目录为准,就是当主机目录与容器目录挂载后,会把容器目录清空,然后把主机目录的文件复制进去。
示例:
docker run -d -p 7777:80 -v /home/docker/nginxhtml:/usr/share/nginx/html --name app01 nginx
把主机目录/home/docker/nginxhtml与容器目录/usr/share/nginx/html做了一个映射,然后启动了一个nginx容器,并且把容器的80端口映射到了宿主机的7777端口。 则修改主机目录/home/docker/nginxhtml下的index.html文件,会影响容器内部的index.html文件。
卷映射
卷映射与我们目录挂载不同点在于,使用目录挂载的时候是将容器目录与我们外部目录同步,即刚开始时外部目录是什么样的,对应容器目录就是什么样的。而卷映射是说,在一开始我们会创建一个卷与我们需要关联的容器目录同步,即卷一开始就会有容器目录中的内容,与其保持一致! docker中卷默认路径/var/lib/docker/volumes/
docker run -v 卷名称:容器目录 容器ID
例如:
docker run -d -p 7788:80 -v /home/docker/nginxhtml:/usr/share/nginx/html -v ngconf:/etc/nginx --name app03 nginx
卷操作
docker volume ls #查看卷
docker volume create 卷名称 #创建卷
docker volume rm 卷名称 #删除卷
docker volume inspect 卷名称 #查看卷信息
目录挂载与卷映射的区别
目录挂载:
- 1、如果宿主机文件夹为空:容器内此路径的原有内容将不会显示,因为现在这个挂载点映射的是宿主机的空文件夹。
- 2、如果宿主机文件夹非空:容器将访问并显示宿主机文件夹中已存在的数据。容器内原有此路径的数据将被覆盖,但并非被删除,而是无法访问,因为挂载点上现在反映的是宿主机的文件夹内容。
卷映射:
- 1、如果Docker卷是新的:当一个新卷被首次挂载到容器的某个目录时,Docker会将该目录下的现有内容复制到卷中。这意味着容器的数据会初始化到卷中。
- 2、如果Docker卷非空:如果卷已包含数据,那么这些数据将会显示在容器的挂载点中,而容器该路径下原有的数据将被覆盖,但同样并非被删除。