容器数据卷

135 阅读4分钟

docker的理念

将应用和环境打包乘一个镜像

[root@docker ~]# docker run -it -v 主机目录:容器目录

[root@docker ceshi]# docker run -it -v /home/ceshi/:/home centos /bin/bash

例:

 

双向过程,在容器内修改东西,宿主机内数据是同步的,反之

 

 

实战:Mysql安装

问题:Mysql的数据持久化问题

 

 

官方启动方法

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

 

 

 

启动mysql

[root@docker ~]# 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

c751aa1f8c74ff58c5551e8bb62f2c90b58bbab90f7044b296a47fbef8569638

 

-d 后台运行

-p 端口映射

-v 卷挂载

-e 环境配置

--name 容器的名字

 

 

 

[root@docker 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.

 

 

 

匿名挂载

[root@docker data]# docker run -d -P --name nginx02 -v /etc/nginx nginx


2a51a0e9b09a4358d94784ba13ba6176d14e57672affee96c2f517930a1b351f

 

[root@docker data]# docker volume ls

DRIVER              VOLUME NAME

local               9666e6bffa6452578375314c5e7be127d7819661019c2ad45338ac2be5f0155e

 

 

具名挂载

[root@docker data]# docker run -d -P --name nginx01 -v xiaoming-nginx:/etc/nginx nginx

050eb7bf1fe98d95056e3892a3fdba21e86a277f041ce150cd5fac74205c363c

 

[root@docker data]# docker volume ls

DRIVER              VOLUME NAME

local               xiaoming-nginx

 

docker volume inspect volumename

 ```
 
 



真实位置

[root@docker data]# docker volume inspect xiaoming-nginx

[

    {

        "CreatedAt": "2020-11-21T21:07:10-05:00",

        "Driver": "local",

        "Labels": null,

        "Mountpoint": "/var/lib/docker/volumes/xiaoming-nginx/_data",

        "Name": "xiaoming-nginx",

        "Options": null,

        "Scope": "local"

    }

]


 

查看容器元数据

docker inspect 容器ID

 

所有docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxx/_data

 


通过具名挂载,可以方便找到卷







[root@docker ~]# mkdir ./docker-test-file

[root@docker ~]# cd docker-test-file/

[root@docker docker-test-file]# vim dockerfile01

 

FROM centos

 

VOLUME ["volume01","volume02"]

 

CMD echo "---HHHHHHHHHHAAAAAAAHHHHHHHHH---"

 

CMD /bin/bash

 

 

 

 

[root@docker docker-test-file]# docker build -t caq/centos:1.0 -f ./dockerfile01 ./

Sending build context to Docker daemon  2.048kB

Step 1/4 : FROM centos

 ---> 0d120b6ccaa8

Step 2/4 : VOLUME ["volume01","volume02"]

 ---> Running in a73113d7e8a3

Removing intermediate container a73113d7e8a3

 ---> c711b3f50a7d

Step 3/4 : CMD echo "---HHHHHHHHHHAAAAAAAHHHHHHHHH---"

 ---> Running in 1fb3a0ddd9e4

Removing intermediate container 1fb3a0ddd9e4

 ---> 3af9104bbb1a

Step 4/4 : CMD /bin/bash

 ---> Running in 2e403b7bdf30

Removing intermediate container 2e403b7bdf30

 ---> d31239b293f0

Successfully built d31239b293f0

Successfully tagged caq/centos:1.0

 

 

[root@docker docker-test-file]# docker images

REPOSITORY                      TAG                 IMAGE ID            CREATED              SIZE

caq/centos                      1.0                 d31239b293f0        About a minute ago   215MB

 

 

进入容器会发现建造dockerfiles时挂载的卷,这种挂载属于匿名挂载

 

![]()

 

 

 

![]()

 

 

测试卷同步

[root@docker docker-test-file]# docker run -it d31239b293f0

[root@76da58168b21 /]# ls

bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume01        volume02

[root@76da58168b21 /]# cd volume01

[root@76da58168b21 volume01]# mkdir 11.22

 

 

如果不指定宿主机文件,那么docker会自动分配给宿主机一个位置,通过docker inspect 容器id 可查看到

[root@docker volumes]# cd /var/lib/docker/volumes/3a29756c59c1f5755802283e024f1fec3fa32ed1f3986f663c0326df48950380/_data

[root@docker _data]# ls

11.22

 

实现容器间卷同步

[root@docker ]# docker run -it --name docker01 caq/centos:1.0 /bin/bash

 

[root@docker _data]# docker run -it --name docker02 --volumes-from docker01 caq/centos:1.0

[root@docker _data]# docker exec -it docker01 /bin/bash

[root@b2bf96149e27 /]# cd volume01

[root@b2bf96149e27 volume01]# ls

docker01

 

 

[root@docker _data]# docker exec -it docker02 /bin/bash

[root@5a79420489d3 /]# cd volume01

[root@5a79420489d3 volume01]# ls

docker01