Docker核心(数据卷+实战用例)

容器数据卷

什么是容器数据卷(容器数据卷能做什么)

将应用和环境打包成一个镜像!

数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化

MySQL,容器删了,删库跑路!需求:MySQL数据可以存储在本地!

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

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

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

使用数据卷

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

docker run -it -v 主机目录:容器目录
[root@QCSJdeLinux ~]# docker run -it -v /home/ceshi:/home centos /bin/bash

请添加图片描述

测试文件的同步(在主机上改动,观察容器变化)

请添加图片描述

再来测试(测试通过)

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

实战:安装MySQL


# 获取镜像
[root@QCSJdeLinux ~]#  docker pull mysql:5.7
 
# 运行容器, 需要做数据挂载! # 安装启动mysql,需要配置密码(注意)
# 官方测试, docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
 
# 启动我们的
-d      # 后台运行
-p      # 端口隐射
-v      # 卷挂载
-e      # 环境配置
--name  # 容器的名字
[root@QCSJdeLinux ~]# docker run -d -p 3306: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
 
# 启动成功之后,我们在本地使用navicat链接测试一下
# navicat链接到服务器的3306 --- 3306 和 容器的3306映射,这个时候我们就可以连接上mysql喽!

具名和匿名挂载

# 匿名挂载
-v 容器内路径
docker run -d -P --name nginx01 -v /ect/nginx nginx

# 查看所有卷的情况
[root@QCSJdeLinux ~]# docker volume ls
DRIVER              VOLUME NAME
local               561b81a03506f31d45ada3f9fb7bd8d7c9b5e0f826c877221a17e45d4c80e096
local               36083fb6ca083005094cbd49572a0bffeec6daadfbc5ce772909bb00be760882
# 这里发现,这种情况就是匿名挂载,我们在-v 后面只写了容器内的路径,没有写容器外的路径!
 

# 具名挂载
 
[root@QCSJdeLinux ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx

[root@QCSJdeLinux ~]# docker volume ls
DRIVER              VOLUME NAME
local               juming-nginx


# 通过-v 卷名:容器内的路径
# 查看一下这个卷
docker volume inspect juming-nginx
 
[root@QCSJdeLinux ~]# docker volume inspect juming-nginx
[
  {
      "CreatedAt": "2020-08-12T18:15:21+08: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/xxx/_dat

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

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

拓展:

# 通过 -v 容器内路径:ro rw 改变读写权限
ro readnoly # 只读
rw readwrite #可读可写
# 一旦这个设置了容器权限,容器对我们挂载出来的内容就有限定了!
docker run -d -P --name nginx02 -v juming-niginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-niginx:/etc/nginx:rw nginx

# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作的!

Dockerfile

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

通过这个脚本可以生成镜像

# 创建一个dockerfile文件, 名字可以随机
# 文件的内容 指定(大写) 参数
 
FROM centos
 
VOLUME ["volume01", "volume02"]
 
CMD echo "----end----"
CMD /bin/bash
 
# 这里的每一个命令都是镜像的一层!

创建自己的镜像:

docker build -f dockerfile1 -t qcsj/centos

启动自己的容器

docker run -it qcsj/centos /bin/bash
ls -al
#这个时候下面会有两个目录,就是我们生成镜像的时候自动挂载数据卷目录
volume01
volume02
docker inspect 容器id

请添加图片描述

测试一下刚才的文件是否同步到主机上了!

这种方式我们未来使用的十分多, 因为我们通常会构建自己的镜像!

假设构建镜像时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径!

数据卷容器

实现数据同步就用--volumes-from就可以实现数据共享

# 启动三个容器,通过我们自己的镜像
docker run -it --name docker01 qcsj/centos
docker run -it --name docker02 --volumes-from docker01 qcsj/centos
# 这时候就做到容器间数据同步了,在docker02下也有两个volume01 和 volume02文件了

多个mysql之间实现数据共享

[root@QCSJdeLinux home]# docker run -d -p 3306:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
 
[root@QCSJdeLinux home]# docker run -d -p 3307:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7

结论:

  • 容器之间配置信息的传递, 数据卷容器的声明周期一直持续到没有容器使用为止。
  • 但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!

DockerFile

dockerFile是用来构建docker镜像的文件!命令参数脚本!

构建步骤

  • 编写一个dockerFile文件

  • docker build 构建成为一个镜像

  • docker run 运行镜像

  • docker push 发布镜像(DockerHub、阿里云镜像)

Dockerfile构建过程

基础知识:

  • 每个保留关键字(指令)都必须是大写字母
  • 执行从上到下顺序执行
  • #表示注释
  • 每一个指令都会创建提交一个新的镜像层,并提交!

请添加图片描述

dockerfile是面向开发的,我们以后发布项目,做镜像,就要编写dockerfile文件,这个文件十分简单

  • DockerFile:构建文件,定义了一切的步骤,源代码

  • DockerImages:通过Dockerfile构件生成的镜像,最终发布和运行的产品!

  • Docker容器:容器就是镜像运行起来提供服务器

DockerFile的指令说明

请添加图片描述

FROM 						# 基础镜像,一切从这里开始构建。比如centos
MAINTAINER 			# 镜像是谁写的,姓名+邮箱
RUN							# 镜像构建的时候需要运行的命令
ADD							# 步骤:tomcat镜像,这个tomcat压缩包!添加内容
WORKDIR					# 镜像的工作目录
VOLUME					# 挂载的目录
EXPOST					# 暴露端口的配置
CMD 						# 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT			# 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD					# 当构建一个被继承 DockerFile 这个时候就会运行 ONBUILD 的指令,触发指令。
COPY						# 类似ADD,将我们文件拷贝到镜像中
ENV 						# 构建的时候设置环境变量

创建一个自己的centos

# 1. 编写Dockerfile的文件
[root@QCSJdeLinux dockerfile]# cat mydockerfile-centos 
FROM centos
MAINTAINER QCSJ<1731691002@qq.com>
 
ENV MYPATH /usr/local
WORKDIR $MYPATH     # 镜像的工作目录
 
RUN yum -y install vim   # 添加 vim 命令
RUN yum -y install net-tools	
 
EXPOSE 80  # 暴露80端口
 
CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash
 
# 2. 通过这个文件构建镜像
# 命令 docker build -f dockerfile文件路径 -t 镜像名:[tag] .
 
[root@QCSJdeLinux dockerfile]# docker build -f mydockerfile-centos -t mycentos:0.1 .
 
Successfully build d2d9f0ea8cb2
Successfully tagged mycentos:0.1



# 我们在运行我们的镜像就有了ifconfig 和 vim命令了
docker run -it mycentos:0.1

CMD 和 ENTRYPOINT区别

CMD         # 指定这个容器启动的时候要运行的命令,只有最后一个会生效可被替代
ENTRYPOINT      # 指定这个容器启动的时候要运行的命令, 可以追加命令
  • 2
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页
评论

打赏作者

走,我们去吹风

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值