设为首页 加入收藏

TOP

19-数据持久化-Bind Mounting
2019-05-11 02:35:20 】 浏览:43
Tags:19- 数据 持久化 -Bind Mounting
版权声明:本文为博主原创文章,未经博主允许不得转载--------flywine。 https://blog.csdn.net/wf19930209/article/details/87381550

19-数据持久化-Bind Mounting

Bind Mounting 与 Data Volume区别

Data Volume 需要在 Dockerfile 内声明需要创建的 volume 目录。

Bind Mounting 则不需要在 Dockerfile 声明 volume,只需要在创建容器的时候,也就是 run 的时候声明即可。

如:

docker run -v /home/aaa:/root/aaa demo

上一节中 -v 参数是 mysql:/var/lib/mysql,冒号 “:” 左边是对 /var/lib/mysql 这个目录产生的volume起一个别名。

而在 Bind Mounting 中,-v 参数冒号 “:” 左边是本地的目录路径,右边是创建容器内的路径,做一个映射。

Bind Mounting

通过 Bind Mounting 创建的 volume,在我们修改本地的目录时,容器内对应的目录也会跟着修改,因为是同一个volume。

接下来我们通过一个实验来查看。

  1. 创建一个docker-nginx文件夹,并进入

    mkdir docker-nginx
    cd docker-nginx
    
  2. 创建Dockerfiile和index.html两个文件

    touch Dockerfile index.html
    

    修改Dockerfile文件如下:

    FROM nginx:latest
    
    WORKDIR /usr/share/nginx/html
    
    COPY index.html index.html
    

    修改index.html文件如下:

    <html>
    <body>
    
    <h1>Bind Mounting</h1>
    
    <p>This is a demo.</p>
    
    </body>
    </html>
    
  3. 创建镜像

    docker build -t vincent/my-nginx .
    
  4. 创建容器

    docker run -d -p 80:80 --name web vincent/my-nginx
    

    查看运行状态

    [vagrant@10 docker-nginx]$ docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
    190b2e296c54        vincent/my-nginx    "nginx -g 'daemon of…"   2 seconds ago       Up 1 second         0.0.0.0:80->80/tcp   web
    

    可以看到web容器是up的。

  5. 访问本机80端口获取web容器的内容

    [vagrant@10 docker-nginx]$ curl 127.0.0.1
    <html>
    <body>
    
    <h1>Bind Mounting</h1>
    
    <p>This is a demo.</p>
    
    </body>
    </html>
    

    curl使用http协议的时候默认是80端口,https默认是443,我们是可以不需要加端口号的。

    我们也可以在笔记本中去访问这台虚拟机的80端口服务

     vincent@dell-Inspiron-7559$: curl http://192.168.2.32
    <html>
    <body>
    
    <h1>Bind Mounting</h1>
    
    <p>This is a demo.</p>
    
    </body>
    </html>
    

    也可以通过浏览器访问查看,ip首先要在虚拟机内通过ip a获取。

  6. 重新创建web容器并指定volume

    删除web容器

    docker rm -f web
    

    这条命令会强制删除一个正在运行的容器,不推荐使用。

    重新创建容器,并指定挂载 /home/vagrant/docker-nginx/ 目录。

    docker run -d -p 80:80 -v /home/vagrant/docker-nginx/:/usr/share/nginx/html --name web vincent/my-nginx
    
  7. 查看被挂载的目录在容器内情况

    进入web容器

    docker exec -it web /bin/bash
    

    查看 /usr/share/nginx/html 目录下有哪些内容

    root@cb7e310d02fd:/usr/share/nginx/html# ls /usr/share/nginx/html
    Dockerfile  index.html
    

    我们发现在 /home/vagrant/docker-nginx/ 文件夹内的Dockerfile文件被映射进来了。

    那我们在 /usr/share/nginx/html 文件夹内创建一个 test.txt 文件,看看是否在 外部也能看到

    touch test.txt
    

    创建好之后退出web容器,进入/home/vagrant/docker-nginx/目录下查看

    exit
    [vagrant@10 docker-nginx]$ ls
    Dockerfile  index.html  test.txt
    

    我们发现同样被映射到了外面 docker-nginx 目录下。同样我们可以测试在容器内修改 test.txt 文件看看里外是否同步。

    进入web容器

    docker exec -it web /bin/bash
    

    修改test.txt文件

    root@cb7e310d02fd:/usr/share/nginx/html# echo "1234" >> test.txt 
    root@cb7e310d02fd:/usr/share/nginx/html# cat test.txt 
    1234
    

    完成后我们退出容器并查看这个文件是否同步了

    exit
    [vagrant@10 docker-nginx]$ cat test.txt 
    1234
    

    结果是同样发生了同步。因为我们修改的其实是同一个文件。

热更新

  1. 我们再次执行一次curl获取web内容

    [vagrant@10 flask-app]$ curl 127.0.0.1
    <html>
    <body>
    
    <h1>Bind Mounting</h1>
    
    <p>This is a demo.</p>
    
    </body>
    </html>
    
  2. 此时我们手动修改本机目录下的index.html文件

    nano docker-nginx/index.html
    

    修改如下:

    <html>
    <body>
    
    <h1>Bind Mounting</h1>
    
    <p>This is a app.</p>
    
    </body>
    </html>
    
  3. 验证在不重启nginx服务器的情况下是否web内容发生变化

    [vagrant@10 docker-nginx]$ curl 127.0.0.1
    <html>
    <body>
    
    <h1>Bind Mounting</h1>
    
    <p>This is a app.</p>
    
    </body>
    </html>
    

    我们可以看到web内容已经发生了变化。

这对于开发或后续更新来说是很好的。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇gsoap的用法总结 下一篇Singleton之C++部分一

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目