写点什么

docker 学习笔记(二)

作者:Studying_swz
  • 2022-10-19
    天津
  • 本文字数:2899 字

    阅读完需:约 1 分钟

docker学习笔记(二)

1.容器数据卷

什么是容器数据卷?

  • docker 的理念回顾:将应用和环境打包一个镜像!数据?如果数据都在容器里,那么我们删除容器后,数据就会丢失! <font color="red">需求:数据可以持久化</font>MYSQL,容器删除了,删库跑路! <font color="red">需求:Mysql 数据可以存储在本地!</font>容器之间可以有一个数据共享的技术!Docker 容器中产生的数据,同步到本地!这就是卷技术!目录的挂载,将我们的容器内的目录,挂载到 linux 上面!

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

使用数据卷

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


docker run -it -v 主机目录:容器内目录 
#启动挂载[root@iZ2zefiis08efdip3nlhu2Z home]# docker run -it -v /home/ceshi:/home centos /bin/bash# 查看是否启动成功[root@iZ2zefiis08efdip3nlhu2Z ceshi]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES53e9c84aff7b centos "/bin/bash" 3 minutes ago Up 3 minutes vibrant_jepsen421ea9e0d6df portainer/portainer "/portainer" 2 hours ago Up About an hour 0.0.0.0:8088->9000/tcp eloquent_pascal016c9b95a02d tomcat "catalina.sh run" 2 weeks ago Up 2 weeks 0.0.0.0:3355->8080/tcp tomcat011442a7fbd27f nginx "/docker-entrypoint.…" 2 weeks ago Up 2 weeks 0.0.0.0:3344->80/tcp nginx01[root@iZ2zefiis08efdip3nlhu2Z ceshi]# docker inspect 53e9c84aff7b
复制代码


注:出现以下,则挂载成功



  • 挂载测试 1:主机和 centos 中,其中一个改变,另一个直接同步,即就是双向绑定

  • 挂载测试 2:1.停止容器 2.宿主机上修改文件 3.启动容器 4.容器内的数据依旧是同步的

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

2.实战:MYSQL 同步数据

思考:MYSQL 的数据持久化的问题!


# 获取镜像[root@iZ2zefiis08efdip3nlhu2Z ~]# docker pull mysql:5.75.7: Pulling from library/mysql72a69066d2fe: Pull complete 93619dbc5b36: Pull complete 99da31dd6142: Pull complete 626033c43d70: Pull complete 37d5d7efb64e: Pull complete ac563158d721: Pull complete d2ba16033dad: Pull complete 0ceb82207cd7: Pull complete 37f2405cae96: Pull complete e2482e017e53: Pull complete 70deed891d42: Pull complete Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94Status: Downloaded newer image for mysql:5.7docker.io/library/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@iZ2zefiis08efdip3nlhu2Z ~]# 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.7fd3057d7ebb70b982ad9cd83058ebd90e5ac6c0036a28a5c844f96530a577fd0
#启动成功后,我们在本地使用nvicat 来测试一下#nvicat - 连接到服务器的3310 -----3310和容器内的3306端口映射,这个时候我们就可以连接上了#在本地测试创建一个数据库,查看一下我们映射的路径是否ok
复制代码


假如我们将容器删除



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

3.具名挂载和匿名挂载(了解)

3.1 匿名挂载

#匿名挂载:我们在-v 只写了容器内的路径,没有写主机的路径-v 容器内路径!  #不指定主机路径docker run -d -P --name nginx01 -v /etc/nginx  nginx
#查看所有的volume的情况docker volume ls
复制代码

3.2 具名挂载(推荐)

#具名挂载:docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx  nginx
复制代码

3.3 保存的路径

#上面两个默认都是在/var/lib/docker 路径下,区别有没有具体的名字


3.4 总结👀

4.初始 Dockerfile

  • 挂载方式 2:在生成镜像的同时,镜像脚本命令挂载 Dockerfile 就是用来构建 docker 镜像的构建文件!命令脚本!先体验一下通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层!


[root@iZ2zefiis08efdip3nlhu2Z home]# mkdir docker-test-volume[root@iZ2zefiis08efdip3nlhu2Z docker-test-volume]# pwd/home/docker-test-volume[root@iZ2zefiis08efdip3nlhu2Z docker-test-volume]# vim dockerfile1
#1.创建一个dockerfile文件,名字可以随机,但是最好是Dockerfile#1.文件中的内容: 指令(大写) 参数#1.这里的每个命令,就是镜像的一层[root@iZ2zefiis08efdip3nlhu2Z docker-test-volume]# cat dockerfile1 FROM centos
VOLUME ["volume01","volume02"]
CMD echo "-----end----"
CMD /bin/bash
#2.创建自己的镜像-命令如下,并实现挂载(挂载方式2)[root@iZ2zefiis08efdip3nlhu2Z docker-test-volume]# docker build -f dockerfile1 -t swz/centos .
复制代码



# 3.启动自己生成的容器[root@iZ2zefiis08efdip3nlhu2Z docker-test-volume]# docker run -it e1e7359dcbfa /bin/bash
复制代码



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



查一下卷挂载的路径:



测试一下是否同步:同步成功



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

5.数据卷容器

多个 mysql 同步数据!



  • 启动三个容器,通过刚才我们自己写的镜像启动

  • 启动 docker01


  • 启动 docker02 并实现同步挂载注意:--volume-from 后面是 docker01 容器的 <font color="red">名字 和 镜像 id</font>


  • 启动 docker03 并实现同步挂载


  [root@iZ2zefiis08efdip3nlhu2Z docker-test-volume]# docker run -it --name docker03  --volumes-from docker01 e1e7359dcbfa  [root@b8cc35577dbe /]# ls   bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume01  volume02  [root@b8cc35577dbe /]# cd volume01  [root@b8cc35577dbe volume01]# ls  docker01  [root@b8cc35577dbe volume01]# touch docker03
复制代码


![在这里插入图片描述](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/8ab0bcb3b5f743088420da128d8523c6~tplv-k3u1fbpfcp-zoom-1.image)
复制代码


  • 测试:可以删除 docker01,查看 docker02 和 docker03 是否还可以访问这个文件?答:依旧可以访问

  • 多个 mysql 实现数据共享

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


<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">学习视频:https://www.bilibili.com/video/BV1og4y1q7M4?p=17&spm_id_from=pageDriver

发布于: 刚刚阅读数: 5
用户头像

Studying_swz

关注

还未添加个人签名 2020-12-23 加入

还未添加个人简介

评论

发布
暂无评论
docker学习笔记(二)_Docker_Studying_swz_InfoQ写作社区