问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Docker容器存储架构:bind mount详解

创作时间:
作者:
@小白创作中心

Docker容器存储架构:bind mount详解

引用
1
来源
1.
http://m.blog.itpub.net/291614/viewspace-3050242/

三、docker存储持久化-bind mount

bind mount是将宿主机上已有的目录或文件mount到容器中

bind mount也使用-v挂载

3.1 将 /root/htdocs 目录下的 index.html 文件挂载给一个 httpd 容器

[root@docker ~]# docker run --name web01 -dit -p 8080:80 -v /root/htdocs:/usr/local/apache2/htdocs httpd:2.4

示例:

[root@docker ~]
# docker ps -a           

CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS      NAMES

[root@docker ~]
#

[root@docker ~]
# docker run --name web01 -dit -p 8080:80 -v /root/htdocs:/usr/local/apache2/htdocs httpd:2.4

1937ef7c0be2e17861eacb19a61320fba065b265db0a7c22d15689834a4d55c3

[root@docker ~]
# 

3.2 更新宿主机上的 index.html 文件内容,并查看容器中的内容

[root@docker ~]
# echo "bind mount" > /root/htdocs/index.html

[root@docker ~]
# curl 127.0.0.1:8080

示例:

[root@docker ~]
# echo "bind mount" > /root/htdocs/index.html

[root@docker ~]
# 

[root@docker ~]
# curl 127.0.0.1:8080

bind mount

[root@docker ~]
# 

3.3 查看挂载类型

[root@docker ~]# docker inspect 1937ef7c0be2

示例:

[root@docker ~]
# docker ps -a

CONTAINER ID   IMAGE       COMMAND              CREATED          STATUS          PORTS                                            NAMES

1937ef7c0be2   httpd:2.4   "httpd-foreground"   2 minutes ago    Up 2 minutes    0.0.0.0:8080->80/tcp, :::8080->80/tcp   web01

[root@docker ~]
# 

[root@docker ~]
# docker inspect 1937ef7c0be2

......

        "Mounts": [
  
                {
  
                        "Type": "bind",
  
                        "Source": "/root/htdocs",
  
                        "Destination": "/usr/local/apache2/htdocs",
  
                        "Mode": "",
  
                        "RW": true,
  
                        "Propagation": "rprivate"
  
                }
  
        ],
  
......
  
[root@docker ~]
# 

3.4 创建基于 docker volume 的 container 镜像

[root@docker ~]# docker commit web01 httpd_bind:1.0

示例:

[root@docker ~]
# docker images

REPOSITORY        TAG        IMAGE ID        CREATED        SIZE

httpd_volume      1.0        496faa1c6595    2 weeks ago    144MB

httpd_superman    1.0        f0d394fd69d5    3 months ago   144MB

tomcat            latest     fb5657adc892    2 years ago    680MB

httpd             2.4        dabbfbe0c57b    2 years ago    144MB

httpd             latest     dabbfbe0c57b    2 years ago    144MB

alpine            latest     c059bfaa849c    2 years ago    5.59MB

[root@docker ~]
# 

[root@docker ~]
# docker commit web01 httpd_bind:1.0  

sha256:c2556c7b0ea4753a45afb57b246391f882e28990ea1a2387dc0505a1408bde78

[root@docker ~]
# 

[root@docker ~]
# docker ps -a

CONTAINER ID   IMAGE       COMMAND              CREATED          STATUS          PORTS                                            NAMES

1937ef7c0be2   httpd:2.4   "httpd-foreground"   8 minutes ago    Up 8 minutes    0.0.0.0:8080->80/tcp, :::8080->80/tcp   web01

[root@docker ~]
# 

[root@docker ~]
# docker images

REPOSITORY        TAG        IMAGE ID        CREATED          SIZE

httpd_bind        1.0        c2556c7b0ea4    19 seconds ago   144MB

httpd_volume      1.0        496faa1c6595    2 weeks ago      144MB

httpd_superman    1.0        f0d394fd69d5    3 months ago     144MB

tomcat            latest     fb5657adc892    2 years ago      680MB

httpd             2.4        dabbfbe0c57b    2 years ago      144MB

httpd             latest     dabbfbe0c57b    2 years ago      144MB

alpine            latest     c059bfaa849c    2 years ago      5.59MB

[root@docker ~]
# 

3.5 删除容器,销毁容器后,volume 依旧存在,其数据可持久化保存

[root@docker ~]# docker rm -f web01

示例:

[root@docker ~]
# docker ps -a

CONTAINER ID   IMAGE       COMMAND              CREATED          STATUS          PORTS                                            NAMES

1937ef7c0be2   httpd:2.4   "httpd-foreground"   11 minutes ago   Up 11 minutes   0.0.0.0:8080->80/tcp, :::8080->80/tcp   web01

[root@docker ~]
# 

[root@docker ~]
# docker rm -f web01

web01

[root@docker ~]
# 

[root@docker ~]
# docker ps -a       

CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

[root@docker ~]
# 

[root@docker ~]
# ls /root/htdocs/index.html  

/root/htdocs/index.html

[root@docker ~]
# 

[root@docker ~]
# cat /root/htdocs/index.html  

bind mount

[root@docker ~]
# 

3.6 删除 docker bind mount 卷

[root@docker ~]# rm -rf /root/htdocs/

示例:

[root@docker ~]
# rm -rf /root/htdocs/

[root@docker ~]
# 

[root@docker ~]
# ls /root/htdocs/index.html  

ls: 无法访问/root/htdocs/index.html: 没有那个文件或目录

[root@docker ~]
# 

3.7 重新使用 volume 容器镜像部署容器

[root@docker-node1 _data]# docker run -dit --name web01_bind -p 8080:80 httpd_bind:1.0

示例:

[root@docker ~]
# docker ps -a

CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

[root@docker ~]
# 

[root@docker ~]
# docker run -dit --name web01_bind -p 8080:80 httpd_bind:1.0

20114a50cd49e56210c5e729486c878424b6c0c88211f4aa658b947220226d29

[root@docker ~]
# 

[root@docker ~]
# docker ps -a

CONTAINER ID   IMAGE            COMMAND              CREATED          STATUS          PORTS                                            NAMES

20114a50cd49   httpd_bind:1.0   "httpd-foreground"   2 seconds ago    Up 2 seconds    0.0.0.0:8080->80/tcp, :::8080->80/tcp   web01_bind

[root@docker ~]
# 

[root@docker ~]
# curl 127.0.0.1:8080

# It works!  
[root@docker ~]
# 

文件并没有封装到镜像当中

Linux绑定挂载(bind mount)主要作用是允许将一个目录或者文件(不是整个设备)挂载到一个指定的目录上。

在该挂载点上进行的任何操作,只是发生在被挂载的目录或者文件上,而原挂载点的内容则会被隐藏起来且不受影响。

容器运行过程中,对bind mount目录中改动的数据,将被保存。删除容器后,bind mount中的数据仍然存在。

bind mount可以挂载一个目录到容器,也可以挂载一个文件到容器。但必须要指定目录或文件的路径,即mount源,当然也必须指定mount point。这也限制了容器的可移植性。

若将bind mount绑定到容器上的某非空目录下,则会隐藏容器目录下的现有内容。若不希望容器的整个目录被覆盖,可单独挂载某个文件。

若mount源指向的文件或目录在宿主机上不存在。则会自动创建。

使用bind mount时,可通过ro参数将容器对数据的权限设置为只读。(设置ro参数后,容器无法对数据进行修改,但宿主机依旧有权限修改其内容。)

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号