使用Docker将容器目录挂载到主机上的实现方法

目录
  • 一、基本介绍
  • 二、将容器目录挂载到主机

一、基本介绍

这里我们主要介绍 Docker 里的一个命令,叫做 --mount,其本质上来说和 --volume 命令并没有太大区别,因为这两个命令都是用来给容器提供一个挂载目录。唯一的区别便是,容器的挂载类型不同,那么效果也会有所不同。

容器的挂载类型:

  • bind:将宿主机的指定目录挂载到容器的指定目录,以覆盖的形式挂载(这也就意味着,容器指定目录下的内容也会随着消失)
  • volume在宿主机的 Docker 存储目录下创建一个目录,并挂载到容器的指定目录(并不会覆盖容器指定目录下的内容)

在有些时候,由于容器内的目录有着特殊作用,并不能以覆盖的形式进行挂载。但又想挂载到宿主机上,这时我们便可以使用 volume 类型的挂载方式。像我们上面所说的 --mount--volume 命令都是支持以这两种类型的方式挂载,无非就是配置稍有不同。

两种命令使用 bind 类型挂载区别:当宿主机上指定的目录不存在时,我们使用 --volume 命令挂载时,便会自动的在宿主机上创建出相应目录,而我们要是使用 --mount 命令来挂载,便会输出 `` 报错信息。

二、将容器目录挂载到主机

1)使用 --volume 命令实现 bind 类型的挂载

[root@k8s-master01 ~]# docker run -d -it --name zhangsan \
-v /zhangsan:/usr/share/nginx/html \
nginx:1.21.0
[root@k8s-master01 ~]# echo "Hello World" > /zhangsan/index.html
[root@k8s-master01 ~]# docker exec -it zhangsan /bin/bash
root@3cad299c93aa:/# cd /usr/share/nginx/html/
root@3cad299c93aa:/usr/share/nginx/html# ls
index.html
root@3cad299c93aa:/usr/share/nginx/html# curl 127.0.0.1

可以看到,当我们使用 bind 类型的挂载时,容器内指定的目录原有内容会被覆盖。

2)使用 --mount 命令实现 bind 类型的挂载

[root@k8s-master01 ~]# docker run -d -it --name wangwu \
--mount type=bind,source=/zhangsan,destination=/usr/share/nginx/html \
nginx:1.21.0
[root@k8s-master01 ~]# docker exec -it wangwu /bin/bash
root@474cf5ddd29f:/# cd /usr/share/nginx/html/
root@474cf5ddd29f:/usr/share/nginx/html# ls
index.html
root@474cf5ddd29f:/usr/share/nginx/html# curl 127.0.0.1

我们上面指定 type=bind 类型的原因是因为 --mount 命令默认挂载的类型就是 volume 类型,所以需要指定。

--mount 命令挂载格式:

  • bind 挂载类型:--mount [type=bind] source=/path/on/host,destination=/path/in/container[,...]
  • volume 挂载类型:--mount source=my-volume,destination=/path/in/container[,...]

3)使用 --volume 命令实现 volume 类型的挂载

[root@k8s-master01 ~]# docker run -d -it --name volume \
-v zhangsan:/usr/share/nginx/html \
nginx:1.21.0
[root@k8s-master01 ~]# docker exec -it volume /bin/bash
root@dced26ccb8f0:/# cd /usr/share/nginx/html/
root@dced26ccb8f0:/usr/share/nginx/html# ls
50x.html  index.html

4)使用 --mount 命令实现 volume 类型的挂载

[root@k8s-master01 ~]# docker run -d -it --name mount \
--mount source=mount,destination=/usr/share/nginx/html \
nginx:1.21.0
[root@k8s-master01 ~]# docker exec -it mount /bin/bash
root@7e63ca69f135:/# cd /usr/share/nginx/html/
root@7e63ca69f135:/usr/share/nginx/html# ls
50x.html  index.html

查看宿主机的挂载目录

其实,使用 bind 或是 mount 类型的挂载方式,区别主要就是在于有 / 和没 /,有 / 就会挂载到宿主机的指定目录,没有 / 则是会挂载到宿主机 Docker 所在的目录中。

到此这篇关于使用Docker将容器目录挂载到主机上的实现方法的文章就介绍到这了,更多相关Docker将容器目录挂载到主机上内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • docker 查看容器的挂载目录操作

    只显示Docker容器挂载目录信息 docker inspect --format "{{.Config.Volumes}}" 369a1376f78c 显示Docker容器和物理主机挂载目录信息 方法一 docker inspect -f "{{.Mounts}}" 369a1376f78c 方法二 docker inspect 369a1376f78c | grep Mounts -A 50 补充:Docker 显示某个容器所有的挂载目录 docker insp

  • docker容器挂载宿主主机目录的操作方法

    有一项重要的参数 -v 目录挂载,就是让容器内部目录和宿主主机目录关联起来,这样就可以直接操作宿主主机目录而不用再操作具体容器了 比如在2中,我们要发布一个war包,是通过 sudo docker cp demo.war tomcat_xiao:/usr/local/tomcat/webapps 来发布的,有没有更快捷的方式呢? 肯定有, 没有 我就不会在这里写这些玩意儿了 sudo docker run -p 8822:8080 --name tomcat_xiao_volume -v /ho

  • Docker容器中挂载NFS共享目录的实现

    之前在https://www.jb51.net/article/205922.htm 介绍过使用Dockerfile构建ubuntu 16.04镜像,并在容器中编译执行Messy_Test项目.这里介绍下如何在容器中挂载NFS服务器上的共享目录. Dockerfile内容如下: FROM ubuntu:16.04 LABEL maintainer="FengBingchun fengbingchun@163.com" \ version="1.0" \ descri

  • docker-修改容器挂载目录的3种方法小结

    方式一:修改配置文件(需停止docker服务) 1.停止docker服务 systemctl stop docker.service(关键,修改之前必须停止docker服务) 2.vim /var/lib/docker/containers/container-ID/config.v2.json 修改配置文件中的目录位置,然后保存退出 "MountPoints":{"/home":{"Source":"/docker",&qu

  • docker挂载本地目录和数据卷容器操作

    1.docker挂载本地目录 docker可以支持把一个宿主机上的目录挂载到镜像里. 交互模式运行 docker run -it -v /home/dock/Downloads:/usr/Downloads ubuntu64 /bin/bash 后台运行 docker run -d -v /home/dock/Downloads:/usr/Downloads --name ubuntu1 ubuntu64 通过-v参数,冒号前为宿主机目录,必须为绝对路径,冒号后为镜像内挂载的路径. 现在镜像内就

  • 使用Docker将容器目录挂载到主机上的实现方法

    目录 一.基本介绍 二.将容器目录挂载到主机 一.基本介绍 这里我们主要介绍 Docker 里的一个命令,叫做 --mount,其本质上来说和 --volume 命令并没有太大区别,因为这两个命令都是用来给容器提供一个挂载目录.唯一的区别便是,容器的挂载类型不同,那么效果也会有所不同. 容器的挂载类型: bind:将宿主机的指定目录挂载到容器的指定目录,以覆盖的形式挂载(这也就意味着,容器指定目录下的内容也会随着消失) volume:在宿主机的 Docker 存储目录下创建一个目录,并挂载到容器

  • 详解docker nginx 容器启动挂载到本地

    首先nginx容器内部的结构: 进入容器: docker exec -it b511b6049f57 bash 查看容器的结构目录:其实每一个容器就相当于一个独立的系统. root@b511b6049f57:/# ls bin dev home lib64 mnt proc run srv tmp var boot etc lib media opt root sbin sys usr nginx的结构目录在容器中: 日志位置:/var/log/nginx/ 配置文件位置:/etc/nginx/

  • docker windows10 共享目录挂载失败的解决方案

    起因 在执行docker脚本的时候,出现不能创建容器的错误. 如下所示: Cannot create container for service xxx: b'Drive has not been shared' 上了Stack Overflow,查看解决方法是通过Setting->Shared Drives,接着勾选自己想要用于docker挂载镜像的磁盘地址. 但是,无论你怎么勾选,Rest credentials,Apply,甚至Reset,出厂化都无济于事.每一次输入用户密码后,docke

  • docker运行容器远程挂载卷的方法

    docker容器中卷的使用 创建卷,卷本身有多种方式例如下面创建的几种: 下面是官方的基本步骤: 创建一个卷: $ docker volume create my-vol 查看: $ docker volume ls local my-vol 查看卷的详情: $ docker volume inspect my-vol [ { "Driver": "local", "Labels": {}, "Mountpoint": &qu

  • asp.net Urlrewriter在虚拟主机上的使用方法

    第一,HttpHandle是实现不了urlrewrite的;第二Server.Transfer是标准的重定向,根本不是urlrewrite. 其实,实现urlrewrite不用自己HttpHandle,也不用自己实现HttpModule,用几行代码就可以轻松实现. 我这里介绍的是在虚拟主机上,虚拟主机不同于自己的服务器,你是没有权限去修改IIS,也没有权限去安装iis rewrite之类的IIS插件.但是我们仍然可以轻松完成需要的功能. 具体做法如下:打开global.asax.cs,定位到pr

  • Docker创建容器时目录权限踩坑

    昨天写项目时需要用到Mysql的衍生版本percona, 就想用Doker来安装.结果踩了一晚上坑, 今早终于解决. 现记录在此. 这个坑原因是我对linux的目录权限问题不敏感导致的. 我的系统是ubuntu16.04, 运行 docker pull percona 拉取镜像时一切正常. 拉取完后,输入 docker images查看所有镜像, 显示正常: 然后我创建容器,命令为(执行时不要有换行): docker create --name percona -v /data/mysql-da

  • Docker中容器数据卷详解

    目录 什么是容器数据卷 数据的覆盖问题 使用数据卷 方式一:直接使用命令挂载 -v 测试挂载卷 方式二:Dockerfile文件 数据卷命令 查看数据卷 方式一:docker inspect 容器ID 方式二:docker volume inspect juming-nginx 挂载三种方式 扩展 什么是容器数据卷 从docker的理念说起,docker将应用和环境打包成一个镜像,运行镜像(生成容器)就可以访问服务了. 如果数据都存在容器中,那么删除容器,数据就会丢失!需求:数据可以持久化 My

随机推荐