Docker学习系列(三)——操作篇:容器数据卷

卷技术:目录挂载,将容器的目录挂载到虚拟机或者Linux上。
用于
容器的持久化和同步操作。

方式1:docker run -it -v 主机目录:容器目录

挂载例1

# 终端1
root@localhost testdocker]# cd /home/
[root@localhost home]# ls
fancy

# 以交互的方式启动centos镜像,主机的/home/test 目录挂载到容器的/home目录
[root@localhost home]# docker run -it -v /home/test:/home centos /bin/bash
[root@e33a865fb14b /]# cd /home/
[root@e33a865fb14b home]# ls
[root@e33a865fb14b home]# [root@localhost home]# 

# 退出在容器,
[root@e33a865fb14b home]# [root@localhost home]# 
[root@localhost home]# docker inspect e33a865fb14b
# 可以找到如下信息:
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/home/test",
                "Destination": "/home",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

两个目录的数据是关联的。

案例2:启动mysql容器

参考官网说明:
https://hub.docker.com/_/mysql

# 获取镜像
# 运行容器并挂载
# 安装启动mysql需要配置密码!
[root@localhost home]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

	-d 后台运行
	-p 端口映射
	-v 卷挂载
	-e 环境配置
	--name 容器名
	
	 -v, --volume list                     Bind mount a volume
	      --volume-driver string           Optional volume driver for the container
	      --volumes-from list              Mount volumes from the specified container(s)


[root@localhost home]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
648c6059388c766f98e3bc1263cf89c887dc2671e546332605d44627c6648d89
[root@localhost home]# docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS         PORTS                                            NAMES
648c6059388c   mysql:5.7              "docker-entrypoint.s…"   12 seconds ago   Up 7 seconds   33060/tcp, 0.0.0.0:3310->3306/tcp                mysql01
e33a865fb14b   centos                 "/bin/bash"              12 hours ago     Up 12 hours                                                     cranky_curie
fad98b763f87   portainer/portainer    "/portainer"             14 hours ago     Up 14 hours    0.0.0.0:8088->9000/tcp                           epic_hodgkin
c372a55412cb   elasticsearch:7.10.1   "/tini -- /usr/local…"   14 hours ago     Up 14 hours    0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   elasticsearch02
63f607c6c6ba   tomcat:9.0             "catalina.sh run"        15 hours ago     Up 15 hours    0.0.0.0:3355->8080/tcp                           tomcat01
e22746833eea   nginx                  "/docker-entrypoint.…"   16 hours ago     Up 16 hours    0.0.0.0:8000->80/tcp                             nginx01
[root@localhost home]# 
# 此时可以看到,刚才启动的mysql容器运行起来了,此时通过navicat,填入对应主机和端口,以及刚才设置的mysql账户密码就可以链接容器。

启动后,主机的home目录下多出一个mysql目录,这就是从刚才设置的容器挂载映射的。

[root@localhost home]# ls
fancy  mysql  test
[root@localhost home]# cd mysql/
[root@localhost mysql]# ls
conf  data
[root@localhost mysql]# cd data/
# 此时,data文件夹下内容如下:
[root@localhost data]# ls
auto.cnf    ca.pem           client-key.pem  ibdata1      ib_logfile1  mysql               private_key.pem  server-cert.pem  sys
ca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile0  ibtmp1       performance_schema  public_key.pem   server-key.pem

在gui界面下添加一个名为mydemo的数据库
在这里插入图片描述
再次查看data文件夹下的内容,多出来一个mydemo目录:

[root@localhost data]# ls
auto.cnf    ca.pem           client-key.pem  ibdata1      ib_logfile1  mydemo  performance_schema  public_key.pem   server-key.pem
ca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile0  ibtmp1       mysql   private_key.pem     server-cert.pem  sys
[root@localhost data]# 

删除容器不影响挂载的主机数据,数据不会丢失!

# 查看运行中的容器
[root@localhost data]# docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS          PORTS                                            NAMES
648c6059388c   mysql:5.7              "docker-entrypoint.s…"   49 minutes ago   Up 49 minutes   33060/tcp, 0.0.0.0:3310->3306/tcp                mysql01
e33a865fb14b   centos                 "/bin/bash"              13 hours ago     Up 13 hours                                                      cranky_curie
fad98b763f87   portainer/portainer    "/portainer"             14 hours ago     Up 14 hours     0.0.0.0:8088->9000/tcp                           epic_hodgkin
c372a55412cb   elasticsearch:7.10.1   "/tini -- /usr/local…"   15 hours ago     Up 15 hours     0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   elasticsearch02
63f607c6c6ba   tomcat:9.0             "catalina.sh run"        16 hours ago     Up 16 hours     0.0.0.0:3355->8080/tcp                           tomcat01
e22746833eea   nginx                  "/docker-entrypoint.…"   16 hours ago     Up 16 hours     0.0.0.0:8000->80/tcp                             nginx01

# 删除mysql01容器
[root@localhost data]# docker rm -f mysql01
mysql01

# 查看,容器确实被干掉了
[root@localhost data]# docker ps -a
CONTAINER ID   IMAGE                  COMMAND                  CREATED        STATUS                      PORTS                                            NAMES
e33a865fb14b   centos                 "/bin/bash"              13 hours ago   Up 13 hours                                                                  cranky_curie
5813036629c5   tomcat                 "catalina.sh run"        14 hours ago   Exited (130) 13 hours ago                                                    tomcat02
fad98b763f87   portainer/portainer    "/portainer"             14 hours ago   Up 14 hours                 0.0.0.0:8088->9000/tcp                           epic_hodgkin
c372a55412cb   elasticsearch:7.10.1   "/tini -- /usr/local…"   15 hours ago   Up 15 hours                 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   elasticsearch02
14b32a1562dc   elasticsearch:7.10.1   "/tini -- /usr/local…"   15 hours ago   Exited (143) 15 hours ago                                                    elasticsearch
63f607c6c6ba   tomcat:9.0             "catalina.sh run"        16 hours ago   Up 16 hours                 0.0.0.0:3355->8080/tcp                           tomcat01
e22746833eea   nginx                  "/docker-entrypoint.…"   16 hours ago   Up 16 hours                 0.0.0.0:8000->80/tcp                             nginx01
e7a7549e34f3   centos                 "/bin/bash"              17 hours ago   Exited (0) 17 hours ago                                                      priceless_golick

# 再次在主机查看数据库数据,仍然在
[root@localhost data]# ls
auto.cnf  ca-key.pem  ca.pem  client-cert.pem  client-key.pem  ib_buffer_pool  ibdata1  ib_logfile0  ib_logfile1  ibtmp1  mydemo  mysql  performance_schema  private_key.pem  public_key.pem  server-cert.pem  server-key.pem  sys
[root@localhost data]# 

具名挂载和匿名挂载

匿名挂载(不建议使用)

# -v 容器内路径
[root@localhost data]# docker run -d -P --name nginx01 -v /etc/nginx nginx
f15ebee747b686995ff8ab691915331e4acd566b0abdcc8379f519014afd6444
[root@localhost data]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                   NAMES
f15ebee747b6   nginx     "/docker-entrypoint.…"   8 seconds ago   Up 6 seconds   0.0.0.0:49154->80/tcp   nginx01
[root@localhost data]# docker volume --help

Usage:  docker volume COMMAND

Manage volumes

Commands:
  create      Create a volume
  inspect     Display detailed information on one or more volumes
  ls          List volumes
  prune       Remove all unused local volumes
  rm          Remove one or more volumes

Run 'docker volume COMMAND --help' for more information on a command.

# 查看所有volume的情况
# 这就是匿名挂载,只写了容器内路径,没写容器外路径
[root@localhost data]# docker volume ls
DRIVER    VOLUME NAME
local     2bf7b8b20c492f412e85232d0aea0ecfae26a5aadbce1743843b3f5d92ae7809
local     0288a199540a4b5ae81ff6cabf95722adfa86da6c89cc03d7c92879ddcf089aa
local     clsn
local     f8ab0be1b0b4abeafda994ad4b1378bc361aa40de69cc0d04ff94166f76e7617
[root@localhost data]# 
# 查看目录地址
# 挂载到主机的位置是:/var/lib/docker/volumes/2bf7b8b20c492f412e85232d0aea0ecfae26a5aadbce1743843b3f5d92ae7809/_data
[root@localhost data]# docker volume inspect 2bf7b8b20c492f412e85232d0aea0ecfae26a5aadbce1743843b3f5d92ae7809
[
    {
        "CreatedAt": "2021-02-26T16:09:02+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/2bf7b8b20c492f412e85232d0aea0ecfae26a5aadbce1743843b3f5d92ae7809/_data",
        "Name": "2bf7b8b20c492f412e85232d0aea0ecfae26a5aadbce1743843b3f5d92ae7809",
        "Options": null,
        "Scope": "local"
    }
]
[root@localhost data]# 

所有匿名挂载的位置都在:/var/lib/docker/volumes目录下

[root@localhost volumes]# pwd
/var/lib/docker/volumes
[root@localhost volumes]# ls
0288a199540a4b5ae81ff6cabf95722adfa86da6c89cc03d7c92879ddcf089aa  2bf7b8b20c492f412e85232d0aea0ecfae26a5aadbce1743843b3f5d92ae7809  backingFsBlockDev  clsn  f8ab0be1b0b4abeafda994ad4b1378bc361aa40de69cc0d04ff94166f76e7617  jumingguazai  metadata.db
[root@localhost volumes]# 

具名挂载(推荐)

# -v 卷名:容器内路径
[root@localhost data]# docker run -d -P --name nginx02 -v jumingguazai:/etc/nginx nginx
368c649239cbfc011f0ee494193f1e3579e0b118de1b933c50ed5f0b4f5b8993
[root@localhost data]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS         PORTS                   NAMES
368c649239cb   nginx     "/docker-entrypoint.…"   10 seconds ago   Up 8 seconds   0.0.0.0:49155->80/tcp   nginx02
f15ebee747b6   nginx     "/docker-entrypoint.…"   8 minutes ago    Up 8 minutes   0.0.0.0:49154->80/tcp   nginx01
[root@localhost data]# docker volume ls
DRIVER    VOLUME NAME
local     2bf7b8b20c492f412e85232d0aea0ecfae26a5aadbce1743843b3f5d92ae7809
local     0288a199540a4b5ae81ff6cabf95722adfa86da6c89cc03d7c92879ddcf089aa
local     clsn
local     f8ab0be1b0b4abeafda994ad4b1378bc361aa40de69cc0d04ff94166f76e7617
local     jumingguazai
[root@localhost data]#

# 查看目录地址
# 挂载到主机的位置是:/var/lib/docker/volumes/jumingguazai/_data
[root@localhost data]# docker volume inspect jumingguazai
[
    {
        "CreatedAt": "2021-02-26T16:17:27+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/jumingguazai/_data",
        "Name": "jumingguazai",
        "Options": null,
        "Scope": "local"
    }
]
[root@localhost data]# 

总结:

# 匿名挂载
-v 容器内路径
# 具名挂载			
-v 卷名:容器内路径
# 指定路径挂载		
-v /宿主机路径:容器内路径  
通过 -v 容器内路径, ro rw 改变读写权限
#	ro			read only(这个路径只能通过宿主机操作,容器内无法操作!)
#	rw			read write

# 一旦设定了容器权限,容器对我们挂载出来的内容就有限定了
docker run -d -P --name nginx01 nginx-01:/etc/nginx:ro nginx
docker run -d -P --name nginx01 nginx-01:/etc/nginx:rw nginx

挂载方式2:dockerfile

dockerfile用来构建docker镜像的构建文件,是一种命令脚本。
镜像是一层一层的,每个命令是一层

创建一个dockerfile文件

文件中的内容,指令大写

[root@localhost testdocker]# vi Dockerfile
[root@localhost testdocker]# cat Dockerfile 
FROM centos

VOLUME ["volume01","volume02"]

CMD echo "----------done-----------"
CMD /bin/bash
[root@localhost testdocker]# 
[root@localhost testdocker]# pwd
/home/fancy/Desktop/Test_demo/testdocker
[root@localhost testdocker]# docker build -f /home/fancy/Desktop/Test_demo/testdocker/Dockerfile -t fancyos:1.0 .
Sending build context to Docker daemon  3.072kB
Step 1/4 : FROM centos
 ---> 300e315adb2f
Step 2/4 : VOLUME ["volume01","volume02"]
 ---> Running in dfd65c02804c
Removing intermediate container dfd65c02804c
 ---> 6a7a06df33c6
Step 3/4 : CMD echo "----------done-----------"
 ---> Running in 3d9defa67632
Removing intermediate container 3d9defa67632
 ---> 2fbcb5939edb
Step 4/4 : CMD /bin/bash
 ---> Running in f67795fcd7cc
Removing intermediate container f67795fcd7cc
 ---> 912cef2f7a9a
Successfully built 912cef2f7a9a
Successfully tagged fancyos:1.0
[root@localhost testdocker]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
fancyos               1.0       912cef2f7a9a   12 seconds ago   209MB
tomcat02              1.0       e7c9683ae525   15 hours ago     672MB
nginx                 latest    35c43ace9216   8 days ago       133MB
tomcat                9.0       bf4709e77b18   2 weeks ago      667MB
tomcat                latest    bf4709e77b18   2 weeks ago      667MB
mysql                 5.7       5f47254ca581   2 weeks ago      449MB
centos                latest    300e315adb2f   2 months ago     209MB
elasticsearch         7.10.1    558380375f1a   2 months ago     774MB
portainer/portainer   latest    62771b0b9b09   7 months ago     79.1MB
[root@localhost testdocker]# docker run -it 912cef2f7a9a /bin/bash
[root@6070138582f1 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume01	volume02
[root@6070138582f1 /]# ls -l
total 0
lrwxrwxrwx.   1 root root   7 Nov  3 15:22 bin -> usr/bin
drwxr-xr-x.   5 root root 360 Feb 26 09:16 dev
drwxr-xr-x.   1 root root  66 Feb 26 09:16 etc
drwxr-xr-x.   2 root root   6 Nov  3 15:22 home
lrwxrwxrwx.   1 root root   7 Nov  3 15:22 lib -> usr/lib
lrwxrwxrwx.   1 root root   9 Nov  3 15:22 lib64 -> usr/lib64
drwx------.   2 root root   6 Dec  4 17:37 lost+found
drwxr-xr-x.   2 root root   6 Nov  3 15:22 media
drwxr-xr-x.   2 root root   6 Nov  3 15:22 mnt
drwxr-xr-x.   2 root root   6 Nov  3 15:22 opt
dr-xr-xr-x. 360 root root   0 Feb 26 09:16 proc
dr-xr-x---.   2 root root 162 Dec  4 17:37 root
drwxr-xr-x.  11 root root 163 Dec  4 17:37 run
lrwxrwxrwx.   1 root root   8 Nov  3 15:22 sbin -> usr/sbin
drwxr-xr-x.   2 root root   6 Nov  3 15:22 srv
dr-xr-xr-x.  13 root root   0 Feb 22 10:39 sys
drwxrwxrwt.   7 root root 145 Dec  4 17:37 tmp
drwxr-xr-x.  12 root root 144 Dec  4 17:37 usr
drwxr-xr-x.  20 root root 262 Dec  4 17:37 var
drwxr-xr-x.   2 root root   6 Feb 26 09:16 volume01
drwxr-xr-x.   2 root root   6 Feb 26 09:16 volume02
[root@6070138582f1 /]# 

# 观察上面的文件目录,发现有两个出现在写的Dockerfile中,它们被挂载到了容器的文件系统。
# 进入并创建一个文件
[root@6070138582f1 /]# cd volume01/
[root@6070138582f1 volume01]# touch container.txt

打开另一终端:

# 查看运行的容器
[root@localhost volumes]# docker ps 
CONTAINER ID   IMAGE          COMMAND                  CREATED             STATUS             PORTS                   NAMES
6070138582f1   912cef2f7a9a   "/bin/bash"              9 minutes ago       Up 9 minutes                               sharp_black
368c649239cb   nginx          "/docker-entrypoint.…"   About an hour ago   Up About an hour   0.0.0.0:49155->80/tcp   nginx02
f15ebee747b6   nginx          "/docker-entrypoint.…"   About an hour ago   Up About an hour   0.0.0.0:49154->80/tcp   nginx01
[root@localhost volumes]# docker inspect --help 

Usage:  docker inspect [OPTIONS] NAME|ID [NAME|ID...]

Return low-level information on Docker objects

Options:
  -f, --format string   Format the output using the given Go template
  -s, --size            Display total file sizes if the type is container
      --type string     Return JSON for specified type

# 查看容器信息 
[root@localhost volumes]# docker inspect 6070138582f1
[
。。。
        "Mounts": [
            {
                "Type": "volume",
                "Name": "7aaeb684389f6099d6300509e7b281903a94086e84d9ef719b736a781690041e",
                "Source": "/var/lib/docker/volumes/7aaeb684389f6099d6300509e7b281903a94086e84d9ef719b736a781690041e/_data",
                "Destination": "volume01",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "57361775b609b9c825814059059ffd082d076dd7b93d073de10107bbd8d16db5",
                "Source": "/var/lib/docker/volumes/57361775b609b9c825814059059ffd082d076dd7b93d073de10107bbd8d16db5/_data",
                "Destination": "volume02",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
。。。
[root@localhost volumes]# 
# 找到文件在宿主机的位置
[root@localhost volumes]# cd /var/lib/docker/volumes
[root@localhost volumes]# ls
0288a199540a4b5ae81ff6cabf95722adfa86da6c89cc03d7c92879ddcf089aa  clsn
2bf7b8b20c492f412e85232d0aea0ecfae26a5aadbce1743843b3f5d92ae7809  f8ab0be1b0b4abeafda994ad4b1378bc361aa40de69cc0d04ff94166f76e7617
57361775b609b9c825814059059ffd082d076dd7b93d073de10107bbd8d16db5  jumingguazai
7aaeb684389f6099d6300509e7b281903a94086e84d9ef719b736a781690041e  metadata.db
backingFsBlockDev
[root@localhost volumes]# cd 7aaeb684389f6099d6300509e7b281903a94086e84d9ef719b736a781690041e
[root@localhost 7aaeb684389f6099d6300509e7b281903a94086e84d9ef719b736a781690041e]# ls
_data
[root@localhost 7aaeb684389f6099d6300509e7b281903a94086e84d9ef719b736a781690041e]# cd _data/
# 发现这里的数据也多了一个container.txt文件
[root@localhost _data]# ls
container.txt
[root@localhost _data]# 

数据卷容器

# 查看镜像fancyos,是我们上面写的那个dockerfile生成的
[root@localhost testdocker]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED        SIZE
fancyos               1.0       912cef2f7a9a   2 hours ago    209MB
tomcat02              1.0       e7c9683ae525   17 hours ago   672MB
nginx                 latest    35c43ace9216   8 days ago     133MB
tomcat                9.0       bf4709e77b18   2 weeks ago    667MB
tomcat                latest    bf4709e77b18   2 weeks ago    667MB
mysql                 5.7       5f47254ca581   2 weeks ago    449MB
centos                latest    300e315adb2f   2 months ago   209MB
elasticsearch         7.10.1    558380375f1a   2 months ago   774MB
portainer/portainer   latest    62771b0b9b09   7 months ago   79.1MB
[root@localhost testdocker]# 

# 启动一个名为fancy01的容器, 
[root@localhost testdocker]# docker run -it --name fancy01 fancyos:1.0
[root@d73011ed82bc /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume01	volume02
[root@d73011ed82bc /]# cd volume01/
[root@d73011ed82bc volume01]# ls
# 在volume01目录下创建一个文件 test.txt
[root@d73011ed82bc volume01]# touch test.txt

# 退出上面的容器, 重新启动一个容器,从fancy01处挂载
# --volumes-from list              Mount volumes from the specified container(s)
[root@d73011ed82bc volume01]# [root@localhost testdocker]# docker run -it --name fancy02 --volumes-from fancy01 fancyos:1.0
[root@b8cc2867093b /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume01	volume02
# 进入并查看,发现在fancy02的,volume01/目录也有 test.txt,说明两个容器关联了起来(数据共享)
[root@b8cc2867093b /]# cd volume01/
[root@b8cc2867093b volume01]# ls
test.txt
[root@b8cc2867093b volume01]#

数据共享中,删除被关联的容器,其他容器间数据共享不会受影响
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器为止
但是持久到了本地,本地的数据是不会被删除的!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值