容器数据卷
将应用和环境打包成一个镜像
如果数据都在容器中,那我们容器删除了,数据就丢失了
容器直接可以有一个数据共享的技术,Docker容器中产生的数据,同步到本地
这就是卷技术~目录的挂在,将我们容器内的目录挂载到Linux上面
容器的持久化和同步操作。容器间也可以数据共享
使用数据卷
---------------------------
docker run -it -v 主机目录:容器内的目录 # 将容器的目录挂载到主机上了
---------------------------
docker run -it -v /home/test:/home centos /bin/bash # 这样就将容器内/home绑定到主机/home/test上了
这样就可以在主机上的/home/test目录下操作文件,都会影响到容器内的/home目录
实战:安装mysql
mysql的持久化问题
(1)下载mysql
[root@iZ2ze6yavnv9o6dx6owt41Z home]# docker pull mysql:5.7
5.7: Pulling from library/mysql
a076a628af6f: Already exists
f6c208f3f991: Pull complete
88a9455a9165: Pull complete
406c9b8427c6: Pull complete
7c88599c0b25: Pull complete
25b5c6debdaf: Pull complete
43a5816f1617: Pull complete
1831ac1245f4: Pull complete
37677b8c1f79: Pull complete
27e4ac3b0f6e: Pull complete
7227baa8c445: Pull complete
Digest: sha256:b3d1eff023f698cd433695c9506171f0d08a8f92a0c8063c1a4d9db9a55808df
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
(2)启动mysql
官网启动方法
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
由于要挂载目录所以
# -d 后台启动
# -p 设置端口
# -v 挂载卷
# -e 环境配置
# --name 容器名字
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
--- 使用一下方法进行mysql之间容器挂载,起来就断了,不知道什么原因(要查)
docker run -d -p 3311:3306 --volumes-from mysql01 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 a70d36bc331a
docker run -d -p 3312:3306 --volumes-from mysql02 -e MYSQL_ROOT_PASSWORD=123456 --name mysql03 a70d36bc331a
具名挂载和匿名挂载
# 这里是匿名挂载
[root@iZ2ze6yavnv9o6dx6owt41Z /]# docker run -d -P --name nginx001 -v /ect/nginx nginx
2d9ae497f4e8ffc0aac0662f293a1a4a800bba05797edfd9f50af99a00328c6b
[root@iZ2ze6yavnv9o6dx6owt41Z /]# docker volume --help
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\
#查看所有卷的名字
[root@iZ2ze6yavnv9o6dx6owt41Z /]# docker volume ls
DRIVER VOLUME NAME
local af4eb30481bff91d3e5c5cfdde18abc10a47c49f8e516b911779e50d85e9b141
# 这里是具名挂载
[root@iZ2ze6yavnv9o6dx6owt41Z /]# docker run -d -P --name nginx002 -v juming:/etc/nginx nginx
7cc2000d674cf1402564eee3c30d1b0a76dc90e2ec14e774f76b9f569d16ae3c
[root@iZ2ze6yavnv9o6dx6owt41Z /]# docker volume ls
DRIVER VOLUME NAME
local juming
[root@iZ2ze6yavnv9o6dx6owt41Z /]# docker volume inspect juming
[
{
"CreatedAt": "2021-02-27T22:17:14+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming/_data",
"Name": "juming",
"Options": null,
"Scope": "local"
}
]
-----------------------------------------
没有确定具体挂载的地址,默认挂载在/var/lib/docker/volumes/***/_data下
----------------------------------------
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /主机路径:容器路径 # 指定路径挂载
------------------------------
-v 容器内路径:ro #ro只读
-v 容器内路径:rw #rw可读可写
使用DockerFile做数据卷
1.新建脚本
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
2.build
[root@iZ2ze6yavnv9o6dx6owt41Z docker-test-volume]# docker build -f dockerfile1 -t centoswdd .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 300e315adb2f
Step 2/4 : VOLUME ["volume01","volume02"]
---> Running in 5f508f5c9aa7
Removing intermediate container 5f508f5c9aa7
---> 172a67896af5
Step 3/4 : CMD echo "----end----"
---> Running in e59d1681c354
Removing intermediate container e59d1681c354
---> 4225576b2bfc
Step 4/4 : CMD /bin/bash
---> Running in 6872daad70b6
Removing intermediate container 6872daad70b6
---> 650c9ed55753
Successfully built 650c9ed55753
Successfully tagged centoswdd:latest
# 看到已经构建了一个centoswdd的镜像
[root@iZ2ze6yavnv9o6dx6owt41Z docker-test-volume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centoswdd latest 650c9ed55753 57 seconds ago 209MB
tomcat02 1.0 d5e2afbcd2fb 25 hours ago 654MB
mysql 5.7 a70d36bc331a 5 weeks ago 449MB
tomcat 9.0 040bdb29ab37 6 weeks ago 649MB
tomcat latest 040bdb29ab37 6 weeks ago 649MB
nginx latest f6d0b4767a6c 6 weeks ago 133MB
centos latest 300e315adb2f 2 months ago 209MB
portainer/portainer latest 62771b0b9b09 7 months ago 79.1MB
elasticsearch 7.6.2 f29a1ee41030 11 months ago 791MB
3。启动并进入
[root@iZ2ze6yavnv9o6dx6owt41Z docker-test-volume]# docker run -it 650c9ed55753 /bin/bash
# 看到已经挂载了 volume01,volume02
[root@9fab59ec2e7a /]# ls -l
total 56
lrwxrwxrwx 1 root root 7 Nov 3 15:22 bin -> usr/bin
drwxr-xr-x 5 root root 360 Feb 27 14:56 dev
drwxr-xr-x 1 root root 4096 Feb 27 14:56 etc
drwxr-xr-x 2 root root 4096 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 4096 Dec 4 17:37 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 15:22 media
drwxr-xr-x 2 root root 4096 Nov 3 15:22 mnt
drwxr-xr-x 2 root root 4096 Nov 3 15:22 opt
dr-xr-xr-x 102 root root 0 Feb 27 14:56 proc
dr-xr-x--- 2 root root 4096 Dec 4 17:37 root
drwxr-xr-x 11 root root 4096 Dec 4 17:37 run
lrwxrwxrwx 1 root root 8 Nov 3 15:22 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 3 15:22 srv
dr-xr-xr-x 13 root root 0 Feb 24 14:38 sys
drwxrwxrwt 7 root root 4096 Dec 4 17:37 tmp
drwxr-xr-x 12 root root 4096 Dec 4 17:37 usr
drwxr-xr-x 20 root root 4096 Dec 4 17:37 var
drwxr-xr-x 2 root root 4096 Feb 27 14:56 volume01
drwxr-xr-x 2 root root 4096 Feb 27 14:56 volume02
[root@iZ2ze6yavnv9o6dx6owt41Z docker-test-volume]# docker inspect 9fab59ec2e7a
"Mounts": [
{
"Type": "volume",
"Name": "4b1a539b128a145afd7c17818f0ac0cf5676a27212ca595b2e76fb6fb2a854b0",
"Source": "/var/lib/docker/volumes/4b1a539b128a145afd7c17818f0ac0cf5676a27212ca595b2e76fb6fb2a854b0/_data",
"Destination": "volume02",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "0b25e7422d5306a10aaa44ae85ab10423a13aebf7c3fb61ee2231f5bd8c774d7",
"Source": "/var/lib/docker/volumes/0b25e7422d5306a10aaa44ae85ab10423a13aebf7c3fb61ee2231f5bd8c774d7/_data",
"Destination": "volume01",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
------------可以看到已经匿名挂载上了---------------------
4.多个容器之间的数据卷挂载
--volumes-from 实现容器之间的共享
(1)启动容器1
docker run -it --name docker01 650c9ed55753
(2)启动容器2 让容器2挂载到容器1上
docker run -it --name docker02 --volumes-from docker01 650c9ed55753
(3)启动容器3 让容器3挂载到容器2上
docker run -it --name docker03 --volumes-from docker02 650c9ed55753