容器数据卷

容器数据卷

什么是容器数据卷?

容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!

这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面

总结一句话:容器的持久化和同步操作!容器间也是可以数据共享的

使用数据卷


方式一:直接使用命令来挂载 -v

docker run -it -v -p 主机端口:容器内端口

测试

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

启动起来之后通过docker inspect 容器id查看

[root@localhost ceshi]# docker inspect e7dc3c1e9c64
 "Mounts": [
 {
 "Type": "bind",
 "Source": "/home/ceshi",
 "Destination": "/home",
 "Mode": "",
 "RW": true,
 "Propagation": "rprivate"
 }
​</pre>
# 容器内

[root@e7dc3c1e9c64 home]# touch test
​
#容器外

[root@localhost ceshi]# ls
test</pre>

# 先停止容器

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS                      PORTS                                            NAMES
e7dc3c1e9c64        centos:7              "/bin/bash"              10 minutes ago      Exited (0) 10 seconds ago                                                    pedantic_wilbur
# 向test中写入内容
[root@localhost ceshi]# pwd
/home/ceshi
[root@localhost ceshi]# echo "hello" > test
​
# 启动容器
[root@localhost ~]# docker start e7dc3c1e9c64 
​
# 进入容器并查看test
[root@localhost ~]# docker attach e7dc3c1e9c64 
[root@e7dc3c1e9c64 /]# cat /home/test 
hello</pre>

好处:以后修改只需要在本地修改即可,容器内会自动同步

安装MySQL


下载MySQL镜像

[root@localhost ~]# docker pull mysql:5.7

启动

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=123.com --name mysql mysql:5.7

进入MySQL

[root@localhost ~]# mysql -uroot -p123.com -h 192.168.1.103 -P 3310
Welcome to the MySQL monitor.  Commands end with ; or \g.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

​
# 本地测试,创建一个数据库,查看一下映射的路径是否ok
mysql> create database haha;
Query OK, 1 row affected (0.00 sec)
​
mysql> exit
Bye
[root@localhost data]# ls
auto.cnf    client-cert.pem  ib_buffer_pool  ib_logfile1  performance_schema  server-cert.pem
ca-key.pem  client-key.pem   ibdata1         ibtmp1       private_key.pem     server-key.pem
ca.pem      haha             ib_logfile0     mysql        public_key.pem      sys
[root@localhost data]# pwd
/home/mysql/data

删除容器不会影响本地数据

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

具名和匿名挂载


匿名挂载

-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx

查看所有volume的情况

[root@localhost ~]# docker volume ls
DRIVER              VOLUME NAME
local               5513654d3cfe440b5e23ce130360a0d576a223575dfb6af64b16cd1337cfb288
local               aeaf22bf51240ce60016769d2429bf2c024afad44cf12dbafb2fb609e8c46c13

这就是匿名挂载,我们在-v的时候只写了一个容器内的路径,没有写容器外的路径


具名挂载

[root@localhost ~]# docker  run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
dfaa350f5e1e93888e2b3357b3709c0fbb5f5c80c0ec3be123a971439d90c600
[root@localhost ~]# docker volume ls
DRIVER              VOLUME NAME
local               juming-nginx
# 通过-v 卷名:容器内路径
​
# 查看一下这个卷
[root@localhost ~]# docker volume inspect juming-nginx
[
 {
 "CreatedAt": "2020-06-26T04:41:43-04:00",
 "Driver": "local",
 "Labels": null,
 "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
 "Name": "juming-nginx",
 "Options": null,
 "Scope": "local"
 }

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

[root@localhost _data]# cd /var/lib/docker/volumes/juming-nginx/_data/
[root@localhost _data]# ls
conf.d          koi-utf  mime.types  nginx.conf   uwsgi_params
fastcgi_params  koi-win  modules     scgi_params  win-utf

我们通过具名挂载可以方便的找一个卷,大多数情况在使用具名挂载

如何确定时具名还是匿名挂载,还是指定路径挂载

-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v 宿主机路径:容器内路径 #指定路径挂载</pre>

容器权限

通过 -v 容器内路径:ro 或者 rw 改变读写权限

ro readonly
rw readwrite

一旦设置了这个权限,容器对我们挂在出来的内容就有了限定

docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx

ro,只能通过宿主机来操作,容器内部无法进行操作</pre>

初识Dockerfile


Dockerfile就是用来构建docker镜像的构建文件,命令脚本

通过这个脚本可以生成一个镜像,镜像是一层一层的,每个命令就是一层

cat dockerfile
-----------------
FORM centos:7
VOLUME ["volume01","volume02"]

CMD echo "---end---"
CMD /bin/bash
-----------------
# 执行
[root@localhost dockerfile]# docker build -f dockerfile -t cy:centos .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos:7
 ---> b5b4d78bc90c
Step 2/4 : VOLUME ["volume01","volume02"]
 ---> Running in 7e64cf37069f
Removing intermediate container 7e64cf37069f
 ---> 5a2b2b84f315
Step 3/4 : CMD echo "---end---"
 ---> Running in 65e0770322a8
Removing intermediate container 65e0770322a8
 ---> a4777869f575
Step 4/4 : CMD /bin/bash
 ---> Running in 37a77b45d374
Removing intermediate container 37a77b45d374
 ---> 020321bf380c
Successfully built 020321bf380c
Successfully tagged cy:centos
# 运行容器并查看
[root@localhost dockerfile]# docker run -it 020321bf380c /bin/bash
[root@91bd3d6bd038 /]# ls
anaconda-post.log  dev  home  lib64  mnt  proc  run   srv  tmp  var       volume02
bin                etc  lib   media  opt  root  sbin  sys  usr  volume01
# volume01 和 02 就是我们挂载的卷,它一定和宿主机的一个目录有关联

# 创建一个文件
[root@91bd3d6bd038 /]# cd volume01
[root@91bd3d6bd038 volume01]# touch container

# 查看容器名
[root@localhost dockerfile]# docker ps -a
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS                        PORTS                                            NAMES
91bd3d6bd038        020321bf380c          "/bin/bash"              2 minutes ago       Exited (0) 18 seconds ago 

# 查看卷挂载路径
[root@localhost dockerfile]# docker inspect 91bd3d6bd038
        "Mounts": [
            {
                "Type": "volume",
                "Name": "e135d4091081cef9650c5554b0a266060bd2c37f9d9aea808ae61596a11845e7",
                "Source": "/var/lib/docker/volumes/e135d4091081cef9650c5554b0a266060bd2c37f9d9aea808ae61596a11845e7/_data",
                "Destination": "volume02",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "87f6e9edec09e5814eb38dce55547a9ccae4485c38d33bc6dad0dbdd08945c51",
                "Source": "/var/lib/docker/volumes/87f6e9edec09e5814eb38dce55547a9ccae4485c38d33bc6dad0dbdd08945c51/_data",
                "Destination": "volume01",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],</pre>

# 查看是否同步
[root@localhost _data]# pwd
/var/lib/docker/volumes/87f6e9edec09e5814eb38dce55547a9ccae4485c38d33bc6dad0dbdd08945c51/_data
[root@localhost _data]# ls
container</pre>

数据卷容器


多个MySQL同步数据!

# 启动三个容器
[root@localhost ~]# docker run -it --name docker01 cy:centos 
[root@5428ba1bd072 /]# ls
anaconda-post.log  dev  home  lib64  mnt  proc  run   srv  tmp  var       volume02
bin                etc  lib   media  opt  root  sbin  sys  usr  volume01

# 运行另外一个容器并进入volume01创建一个文件
[root@localhost ~]# docker run -it --name docker02 --volumes-from docker01 cy:centos
[root@f15b2f0783c7 /]# [root@localhost ~]# docker exec -it docker01 /bin/bash
[root@5428ba1bd072 /]# cd volume01/
[root@5428ba1bd072 volume01]# ls
[root@5428ba1bd072 volume01]# touch docker01

# 可以进行同步
[root@localhost ~]# docker exec -it docker02 /bin/bash
[root@f15b2f0783c7 /]# cd volume01/
[root@f15b2f0783c7 volume01]# ls
docker01

# docker03 同样也可以
[root@localhost ~]# docker run -it --name docker03 --volumes-from docker01 cy:centos
[root@bba06d653920 /]# cd volume01/
[root@bba06d653920 volume01]# ls
docker01

# docker03创建文件也可以同步到其他docker
[root@bba06d653920 volume01]# touch docker03
[root@bba06d653920 volume01]# ls
docker01  docker03
[root@bba06d653920 volume01]# exit
exit
[root@localhost ~]# docker exec -it docker01 /bin/bash
[root@5428ba1bd072 /]# cd volume01/
[root@5428ba1bd072 volume01]# ls
docker01  docker03

# 即使删除docker01 docker02和docker03也不会丢失数据
# 但是不能删除文件,一旦一台主机删除文件,其余的两台也会删除
[root@localhost ~]# docker stop docker01
docker01
[root@localhost ~]# docker rm -f docker01
docker01
[root@localhost ~]# docker exec -it docker02 /bin/bash
[root@f15b2f0783c7 /]# cd volume01/
[root@f15b2f0783c7 volume01]# ls
docker01  docker03

多个MySQL实现目录共享

[root@localhost ~]# docker run -d -p 3310:3306 -v /docker_mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123.com --name mysql01 mysql:5.7
e9d860aa63bdf10a7b7994c794905a324aa4ba4118ea69559b4f0e9af0b87141
[root@localhost ~]# docker run -d -p 3312:3306 -e MYSQL_ROOT_PASSWORD=123.com --volumes-from mysql01 --name mysql02 mysql:5.7
7c646c44e0ed2eec0207e79b640894c2d7a67b5eec0a13cb9ae318b8bbfce796</pre>
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容