容器数据卷
什么是容器数据卷?
容器之间可以有一个数据共享的技术!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>