Docker深入理解(一)

551 阅读4分钟

这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战

Docker深入学习

1, 什么是容器数据卷?

​ Docker的理念就是将应用和环境打包成一个镜像,但是如果数据都在容器中,一旦将容器删除,所有的数据也都会被删除,那怎么才能让数据持久化。

​ 就比如:mySql,如果容器删除了,数据库也会被删除,那怎么才能让数据可以存储在本地,容器之间可以有一个数据共享的技术。Docker容器中产生的数据同步到本地。,这就是卷技术,目录的挂载, 就是将容器内的目录挂载到Linux上面。

总结: 容器的持久化和同步操作,容器间也是可以数据共享的。

2, 使用数据卷?

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

docker run -it -v 主机目录: 容器内目录

docker run -it -v /root/ceshi:/root centos /bin/bash

然后新开窗口执行下面的命令,查看详细的内容

# docker inspect 容器ID
docker inspect 69ac47116170

1637592928327.png

3,测试数据是否能同步

在容器的 /root目录下面新增一个文件,同时在主机内也会同步出现这个文件

注意:可理解双向绑定原理

下图是: 在容器中新增一个test.java文件,可以在主机内查看到该文件。

1637593337306.png

注意: 也可以反向操作。在主机的目录下修改文件内容,然后会主动同步到容器的目录下面

# 首先查看之前运行的容器
   docker ps  -a
   
# 然后运行指定的容器
   docker start 上面的容器ID
   
# 进入刚才运行的容器里面
   docker attach 上面的容器ID
   
# 进入容器后输出文件内容
cat test.java

1637593976466.png

总结:

1,停止容器
2,宿主机上修改文件
3,启动容器
4,容器内的数据依旧是同步的

挂载的好处:

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

4, 实战MySql挂载

目的:MySql的数据持久化问题

# 查找mySql
docker search mysql

# 获取mysql镜像
docker pull mysql:5.7

# 查看现有的镜像
docker images

# 启动镜像,并暴露端口号      
# 注意:mysql要配置密码
# 官方:docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pd-d mysql:tag
 -d:是后台运行
 -p: 端口映射
 -v: 数据卷挂载
 -e: 环境配置
 --name:  容器名字
[root@VM-0-7-centos home]# docker run -d -p 3310:3306  -v /root/mysql/conf:/etc/mysql/conf.d -v 
/root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql001 mysql:5.7
9d369f3b4189dd8da8787a3c636352f660ece9d72b40c883592152eb7da2884e

# 启动成功之后,在本地使用navicat来测试一下
 服务器的3310:映射容器的3306

1, 下载MySql完成

1637594528501.png

2, 启动不挂载

1637595241429.png

3, 本地通过navicat测试

1637595418482.png

1637595458766.png

总结: 假设我们删除了容器,可以发现挂载到本地的数据卷依旧没有丢失。这就实现了容器数据持久化功能。

5, 具名和匿名挂载

#1 匿名挂载
-v 容器内路径

docker run -d -P --name nginx01 -v /etc/nginx  nginx

[root@VM-0-7-centos mysql]# docker run -d -P --name nginx02 -v /etc/nginx  nginx
ac5891eb1c0badc9d79fbe45ae78912cc25611f1a15c4f9898c68ffbac71c5d3


# 查看所有的volume的情况
docker volume ls

[root@VM-0-7-centos mysql]# docker volume ls
DRIVER    VOLUME NAME
local     3b7e44aa46407ac1605d87751f71bf02c2de919ef1a830cb919c7a6a83b04d56
local     a37fb05f90347ef7cc9c83e005f0e8eb0ba9a2a869b5c878f9a70191b76f7ea2
[root@VM-0-7-centos mysql]# 


#2 具名挂载
docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx nginx


# 通过 -v  卷名:容器内路径

# 查看这个卷
docker volume inspect 具名

匿名挂载:

1637595973880.png

具名挂载:

1637596139163.png

查看指定具名:

1637596272326.png

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

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

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

拓展:

# 通过 -v容器内路径: ro rw 改变读写权限
ro    readonly # 只读
rw    readwrite #可读可写

# 一旦这个设置了容器权限,就无法修改了

docker run -d -P --name nginx01 -v juming-nginx:;etc/nginx:ro nginx

docker run -d -P --name nginx01 -v juming-nginx:;etc/nginx:rw nginx