容器数据卷

什么是容器数据卷

docker:将应用和环境打包成一个镜像。 但数据?若数据都在容器中,若容器删除,数据就会丢失! 需求:数据可持久化 MySQL容器,删了,删库跑路! 需求:MySQL数据可以存储本地 容器之间可以有一个数据共享的技术! Docker容器中产生的数据,同步到本地!

卷技术!目录的挂在,将容器内的目录,挂在到外部linux文件系统中
image.png
功能:容器的持久化和同步操作!容器间也可数据共享!

使用数据卷

1. 使用命令挂载-v [主机目录]:[容器目录]

docker run -it -v [主机目录]:[容器目录] -p ....

  • 查看数据卷是否挂在成功

docker inspect [容器Id]
image.png

实战:MySQL

数据持久化问题?

  1. docker pull mysql:5.7
  2. #启动
  3. docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d \
  4. -v /home/mysql/data:/var/lib/mysql \
  5. --name shared_mysql \
  6. -e MYSQL_ROOT_PASSWORD=123456 \
  7. mysql:5.7 \
  8. #测试
  9. 启动成功后,开启阿里云服务器安全组。
  10. #进入mysql容器查看是否成功运行
  11. docker exec -it [mysql容器id] /bin/bash
  12. mysql -uroot -ppasswd
  13. >service mysql status
  14. >use mysql
  15. >select host,user from user
  • 本地登陆navicat,连接阿里云服务器的mysql容器

image.png

  • 在navicat创建新的数据库,查看远端Linux本地文件系统与容器中的文件系统更新

    显然同步成功

image.png

  • 关闭并删除容器

发现阿里云linux本地文件系统仍在,故删除容器不会影响外部linux文件

具名和匿名挂载

  1. # 匿名挂载 -v [容器内路径]
  2. docker run -d -p --name nginx01 -v /etc/nginx nginx
  3. # 无需指定容器外路径!
  4. # docker inspect可查看具体映射信息
  5. #具名挂载 -v [卷名]:[容器内路径]
  6. docker run -d -p --name nginx01 -v juming-nginx:/etc/nginx nginx
  7. docker volume ls
  8. DRIVER VOLUME NAME
  9. local juming-nginx
  10. #查看卷
  11. docker volumn inspect juming-nginx

docker inspect [volume_name]效果 image.png

设置权限

  1. # -v [容器内路径]:ro 或 rw 改变读写权限
  2. # ro readonly
  3. # rw readwrite

数据卷容器--volumes-from

1. 新建dockerfile

```dockerfile

dockerfile 1

FROM centos

VOLUME [“volumen01”]

CMD echo “———end———“ CMD /bin/bash

  1. <a name="of7cL"></a>
  2. #### 2. 生成镜像
  3. `docker build -f [Dockerfile文件地址] -t [生成文件名]:[TAG] [镜像存放路径]`<br />`docker build -f ./dockerfile1 -t kylin/centos:0.1 .`
  4. <a name="Ned08"></a>
  5. #### 3. 运行镜像
  6. 可观察到volumen01是生成镜像时自动挂载的。<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2728415/1628838291728-7c5ce661-2a33-482d-ba6b-69bc614fa9d3.png#align=left&display=inline&height=277&margin=%5Bobject%20Object%5D&name=image.png&originHeight=554&originWidth=802&size=68690&status=done&style=none&width=401)
  7. <a name="7b6gs"></a>
  8. #### 4. 查看数据卷volumen01[匿名挂载]
  9. > docker inspect 查看
  10. 可查询到volumen01对应外部环境映射的位置<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2728415/1628838504025-bd1a52d2-594e-49c6-af3e-9590cf4c921a.png#align=left&display=inline&height=151&margin=%5Bobject%20Object%5D&name=image.png&originHeight=301&originWidth=1377&size=33434&status=done&style=none&width=688.5)
  11. <a name="qpOzS"></a>
  12. #### 5. 数据卷容器`--volumns-from`
  13. > 多个mysql同步数据
  14. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/2728415/1628838842942-ef0af8ba-bf43-4990-ae2c-d2a57ba5d728.png#align=left&display=inline&height=201&margin=%5Bobject%20Object%5D&name=image.png&originHeight=402&originWidth=831&size=24895&status=done&style=none&width=415.5)
  15. <a name="x37KH"></a>
  16. ##### 实例代码
  17. ```bash
  18. #运行父容器
  19. [root@iZwz985opgs9ourwuevecmZ _data]# docker run -it --name docker01 kylin/centos:0.1
  20. #运行子容器,继承父容器
  21. [root@iZwz985opgs9ourwuevecmZ _data]# docker run -it \
  22. --name docker02 \
  23. --volumes-from docker01 \
  24. kylin/centos:0.1 \

通过inspect 查询两个容器数据卷挂载信息 可以发现:
两个数据卷在外部Linux挂载环境的位置是相同的!
故数据是同步的!
image.pngimage.png
注意:即使删除了主容器,只要有一个容器在,共享的卷就不会被删除【硬链接!】

结论

  • 数据卷容器的生命周期一直持续到没有容器使用为止
  • 若主容器挂载到外部环境中【即持久化到了本地】,所有容器均删除后,本地的数据也不会删除

    DockerFile

    构建步骤

    1. 编写dockerfile
    2. docker build
    3. docker run
    4. docker push(DockerHub,阿里云镜像库)

Dockerfile命令

  • 每个保留关键字都是大写字母
  • 指令顺序执行
  • 表示注释

  • 每个指令都会创建一个新的镜像层,并提交

Docker高级 - 图8

Docker高级 - 图9

  1. CMD # 指定这个容器启动时运行的执行,只有最后一个会生效
  2. ENTRYPOINT # 指定这个容器启动时运行的执行,可追加指令
  3. ONBUILD # 当构建一个被继承的dockerfile时运行,触发指令。
  4. COPY # 类似ADD.将文件拷贝的镜像中
  5. ENV # 构建的时候设置环境变量

Docker高级 - 图10

实战创建属于自己的centos

参考Docker Hub中centos的dockerfile

  • scratch:

image.png

创建自己的centos

  1. 编写dockerfile ```dockerfile FROM centos MAINTAINER kylinmiaojsi@outlook.com

ENV MYPATH /usr/local WORKDIR $MYPATH

RUN yum -y install vim RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH CMD echo “———END———“ CMD /bin/bash

  1. 2. 构建及运行镜像
  2. ```bash
  3. docker build -f ./myDockerfile -t my_centos:0.1 . #构建镜像
  4. docker run -itd my_centos:0.1
  5. docker attach [镜像id]

image.png
显然,镜像内容与我们构建相符

  1. 查看构建DockerFile docker history

image.png

CMDENTRYPOINT区别

比较简单,自己查一下吧

  • CMD:不可追加

docker run [镜像id] [完整命令]

  • ENTRYPOINT:

    docker run [镜像id] [追加命令或参数]

Docker网络