第136天学习打卡(Docker 容器数据卷 安装MySQL 具名和匿名挂载 初识Dockerfile)

Posted doudoutj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第136天学习打卡(Docker 容器数据卷 安装MySQL 具名和匿名挂载 初识Dockerfile)相关的知识,希望对你有一定的参考价值。

容器数据卷

什么是容器数据卷

docker理念回顾

将应用和环境打包成一个镜像!
如果数据都在容器中,那么容器删除后,数据就会丢失!需求:数据可以持久化

mysql中, 容器删了,里面的数据也都没了!需求:MySQL数据可以存储在本地!

容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!(就是容器删了,数据在本地)

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

总结:卷技术就是容器的持久化和同步操作!容器间也是可以数据共享的!

使用数据卷

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

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

#测试
[root@kuangshen home]# docker run -it -v /home/ceshi:/home centos /bin/bash
#启动起来我们可以通过docker inspect 容器id

image-20210524152209930

image-20210524152131679

测试文件的同步:

image-20210524152725904

退出centos, 在容器外面修改test.java里面的内容。再启动centos ,发现里面的内容已经被修改了。

测试:

1.停止容器

2.宿主机上修改文件

3.启动容器

4.发现容器内的数据依旧是同步的!

image-20210524153517501

image-20210524153715036

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

实战: 安装MySQL

#获取镜像
[root@kuangshen home]# docker pull mysql:8.0.23

# 运行容器,需要做数据挂载!  # 安装启动mysql,需要配置密码,这是注意点
# 官方测试:$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
# 启动Mysql
-d 后台运行
-p 端口映射
-v 卷挂载 挂载多个就写多少个v
-e 环境配置
--name 容器名字
通过mysql:8.0.23启动起来
[root@kuangshen home]# 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:8.0.23
# 启动成功之后,我们在本地使用sqlyog 来测试一下
# sqlyog连接到服务器3310后   3310和容器内的3306映射, 这个时候我们就可以连接上了。

这里的MySQL Host Address是阿里云公网ip地址

image-20210524162322935

# 在本地测试创建一个数据库,查看一下我们映射的路径是否OK!

image-20210524163412529

image-20210524163534395

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

image-20210524163917654

image-20210524164010157

具名和匿名挂载

#匿名挂载
-v 容器内路径
docker run -d -P(随机映射端口) --name nginx02 -v /etc/nginx nginx

# 查看所有的volume 的情况
[root@kuangshen home]# docker volume ls
DRIVER    VOLUME NAME
local     4f89067d8f1a80c82c9676fe82d04b08d5ef8d5063f5e71f1dba141bbde1ed2c
local     6425e3dc346db62730d42057c66d3f34a9adc16f8d3bca6742613c14a2a99cd9
# 这里发现,这种就是匿名挂载,我们在 -v时只写了容器内的路径,没有写容器外的路径!

#具名挂载
[root@kuangshen home]# docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx nginx
e499872b362e90b2471b36d174d969205675e21da3b5a7321c7742a7864b89f5
[root@kuangshen home]# docker volume ls
DRIVER    VOLUME NAME
local     juming-nginx
# 通过 -v 卷名:容器内路径
#查看一下这个卷
[root@kuangshen home]# docker volume inspect juming-nginx

image-20210524170120031

image-20210524170854545

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

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

image-20210524171437365

# 如何确定是具名挂载还是匿名挂载,还是指定路径挂载!
-v 容器内路径  #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径 : 容器内路径 # 指定路径挂载!

拓展:

# 通过 -v 容器内路径: ro rw 改变读写权限
ro readonly #只读
rw readwrite #可读可写
# 一旦设置了容器权限,容器对我们挂载出来的内容就有限定了
docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx:ro nginx
 docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx:rw nginx
 
 # ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内是无法操作的!
#  默认是rw

初识Dockerfile

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

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

#创建一个dockerfile文件,名字可以随机  建议使用Dockerfile
# 文件中的内容 指令(大写)参数
FROM centos

VOLUME ["volume01", "volume02"]  #这个是匿名挂载
 
CMD echo "----end----"

CMD /bin/bash

#这里的每个命令,就是镜像的一层。

image-20210524184215509

image-20210524183618668

image-20210524183652015

image-20210524183952121

上面的图片是几个步骤分开的,下面这个图片是上面的命令都在一起的

image-20210524184421138

#启动一下自己写的容器

image-20210524185138318

这个卷和外部一定有一个同步的目录!

查看一下卷挂载的路径:

image-20210524190302912

image-20210524190210063

测试一下刚才的文件是否同步出去了!

image-20210524190754385

这种方式使用的十分多,因为我们通常会构建自己的镜像!
假设构建镜像时候没有挂载卷,要手动镜像挂载 -v卷名:容器内路径!

B站学习网址:【狂神说Java】Docker最新超详细版教程通俗易懂_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili

以上是关于第136天学习打卡(Docker 容器数据卷 安装MySQL 具名和匿名挂载 初识Dockerfile)的主要内容,如果未能解决你的问题,请参考以下文章

第134天学习打卡(Docker 容器命令 常用其他命令 Docker安装Nginx )

第142天学习打卡(Docker yaml规则 开源项目 Docker Swarm)

第139天学习打卡(Docker 发布自己的镜像 Docker网络)

第149天学习打卡(Kubernetes 部署nginx 部署Dashboard)

第139天学习打卡(Docker 发布自己的镜像 Docker网络)

第135天学习打卡(Docker 可视化 镜像讲解 分层理解 commit镜像)