zoukankan      html  css  js  c++  java
  • 容器数据卷

    什么是容器数据卷?

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

    Mysql, 容器删了, 需求: Mysql 的数据可以存储在本地(宿主机器)

    可以有一个数据共享的技术, Docker 容器中产生的数据, 同步到本地, 这就是卷技术, 目录的挂载, 将linux的目录, 挂载到容器上面(目录中的数据是双向绑定的)

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


    使用数据卷

    # 直接使用命令来挂载卷 -v 需要使用绝对路径
    docker run -it -v 宿主机器目录:容器内目录
    
    # 测试, 如果目录不存在会自动创建
    [chenkai@centos7 ~]$ docker run -it -v /home/ceshi:/home centos /bin/bash
    # 1. 在宿主机器/home/ceshi 目录下创建文件, 进入docker容器后 /home 目录下也会同步到文件
    # 2. 在docker容器中 /home 目录下创建文件, 修改文件, 宿主机器 /home/ceshi 目录下也会同步文件
    # 3. 先停止容器, 然后在宿主机器上修改文件内容, 启动容器, 查看容器中的数据内容是否依旧是同步的?   是!
    # 实现了文件数据的双向绑定
    
    # 启动起来后, 可以使用 docker inspect 容器ID 来检查挂载目录
    [chenkai@centos7 ceshi]$ docker inspect 5c0ec5f1a23d
    ...
    ...
            Mounts": [
                {
                    "Type": "bind",
                    "Source": "/home/ceshi",
                    "Destination": "/home",
                    "Mode": "",
                    "RW": true,
                    "Propagation": "rprivate"
                }
            ]
    ...
    ...
    

    Mysql数据持久化

    # 获取镜像
    [chenkai@centos7 ~]$ docker pull mysql:5.7
    
    # 运行容器, 需要做数据挂载,  # 安装启动mysql, 需要配置密码的, 这是要注意的点
    # 官方测试: docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
    [chenkai@centos7 ~]$ 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 mysql:5.7
    5bcdba2653c3efc81605cdcc998be071e23bc5f4900d5efaefbcb0d3e4408f51
    
    # 启动成功之后,进入容器内部, 登录mysql
    root@5bcdba2653c3:/# mysql -uroot -p123456
    mysql: [Warning] Using a password on the command line interface can be insecure.
    Welcome to the MySQL monitor.  Commands end with ; or g.
    Your MySQL connection id is 4
    Server version: 5.7.32 MySQL Community Server (GPL)
    Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
    mysql> 
    
    # 查看宿主机器/home/mysql/data 目录数据, 和 /home
    [chenkai@centos7 data]$ pwd
    /home/mysql/data
    [chenkai@centos7 data]$ ll
    total 188484
    -rw-r-----. 1 polkitd input       56 Dec 15 11:12 auto.cnf
    -rw-------. 1 polkitd input     1676 Dec 15 11:12 ca-key.pem
    -rw-r--r--. 1 polkitd input     1112 Dec 15 11:12 ca.pem
    -rw-r--r--. 1 polkitd input     1112 Dec 15 11:12 client-cert.pem
    -rw-------. 1 polkitd input     1680 Dec 15 11:12 client-key.pem
    -rw-r-----. 1 polkitd input     1353 Dec 15 11:12 ib_buffer_pool
    -rw-r-----. 1 polkitd input 79691776 Dec 15 11:12 ibdata1
    -rw-r-----. 1 polkitd input 50331648 Dec 15 11:12 ib_logfile0
    -rw-r-----. 1 polkitd input 50331648 Dec 15 11:12 ib_logfile1
    -rw-r-----. 1 polkitd input 12582912 Dec 15 11:12 ibtmp1
    drwxr-x---. 2 polkitd input     4096 Dec 15 11:12 mysql
    drwxr-x---. 2 polkitd input     8192 Dec 15 11:12 performance_schema
    -rw-------. 1 polkitd input     1680 Dec 15 11:12 private_key.pem
    -rw-r--r--. 1 polkitd input      452 Dec 15 11:12 public_key.pem
    -rw-r--r--. 1 polkitd input     1112 Dec 15 11:12 server-cert.pem
    -rw-------. 1 polkitd input     1676 Dec 15 11:12 server-key.pem
    drwxr-x---. 2 polkitd input     8192 Dec 15 11:12 sys
    
    
    root@5bcdba2653c3:/var/lib/mysql# pwd
    /var/lib/mysql
    root@5bcdba2653c3:/var/lib/mysql# ls -l
    total 188484
    -rw-r-----. 1 mysql mysql       56 Dec 15 16:12 auto.cnf
    -rw-------. 1 mysql mysql     1676 Dec 15 16:12 ca-key.pem
    -rw-r--r--. 1 mysql mysql     1112 Dec 15 16:12 ca.pem
    -rw-r--r--. 1 mysql mysql     1112 Dec 15 16:12 client-cert.pem
    -rw-------. 1 mysql mysql     1680 Dec 15 16:12 client-key.pem
    -rw-r-----. 1 mysql mysql     1353 Dec 15 16:12 ib_buffer_pool
    -rw-r-----. 1 mysql mysql 50331648 Dec 15 16:12 ib_logfile0
    -rw-r-----. 1 mysql mysql 50331648 Dec 15 16:12 ib_logfile1
    -rw-r-----. 1 mysql mysql 79691776 Dec 15 16:12 ibdata1
    -rw-r-----. 1 mysql mysql 12582912 Dec 15 16:12 ibtmp1
    drwxr-x---. 2 mysql mysql     4096 Dec 15 16:12 mysql
    drwxr-x---. 2 mysql mysql     8192 Dec 15 16:12 performance_schema
    -rw-------. 1 mysql mysql     1680 Dec 15 16:12 private_key.pem
    -rw-r--r--. 1 mysql mysql      452 Dec 15 16:12 public_key.pem
    -rw-r--r--. 1 mysql mysql     1112 Dec 15 16:12 server-cert.pem
    -rw-------. 1 mysql mysql     1676 Dec 15 16:12 server-key.pem
    drwxr-x---. 2 mysql mysql     8192 Dec 15 16:12 sys
    
    # 新建一个数据库, 查看两边数据变化
    mysql> create database test charset=utf8;
    Query OK, 1 row affected (0.00 sec)
    # 发现两边目录下, 同时多了 test 目录
    drwxr-x---. 2 polkitd input       20 Dec 15 11:20 test
    drwxr-x---. 2 mysql mysql       20 Dec 15 16:20 test
    

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


    匿名和具名挂载

    # 匿名挂载, -v 只写了一个路径, 它指的是容器内路径, 缺少容器外的路径
    -v 容器内路径
    [chenkai@centos7 data]$ docker run -d -P --name nginx_1 -v /etc/nginx nginx
    
    # 查看所有的卷
    [chenkai@centos7 data]$ docker volume ls
    DRIVER    VOLUME NAME
    local     57ede296c18c38e8b3d16aafd4de8ef68bcaed1436a366728e1d023f4f329444
    local     62a163bef603a873c01dcd16f7f56a25f4166becc64833263b0a2727abf39dc7
    local     68dfad7250b4f2a39e174eb142f5e8459a9cf930a49b09cb5ee376cf645b13e3
    local     01803775ba6daf8c82971fa85fc827fb32a6218e4f2ee79bd5d8c8e6644fb7ae
    local     d30ce148bd7cf674e601326d4898e07ea94d74d541925fad83187e3fd711afde
    local     d46ba9f2e6681e5d9c7e428764a5f995e7cc1693d9254543a7c63747374572b0
    
    # 具名挂载, -v 卷名:容器内路径
    [chenkai@centos7 data]$ docker run -d -P --name nginx_2 -v juming:/etc/nginx nginx
    
    # 检查一下 juming 这个卷
    # 具名挂载,没有指定绝对目录的情况下, 默认都是 /var/lib/docker/volumes/xxx/_data 目录下(匿名挂载, 也是在这个目录下)
    [chenkai@centos7 data]$ docker volume inspect juming
    [
        {
            "CreatedAt": "2020-12-16T02:59:33-05:00",
            "Driver": "local",
            "Labels": null,
            "Mountpoint": "/var/lib/docker/volumes/juming/_data",
            "Name": "juming",
            "Options": null,
            "Scope": "local"
        }
    ]
    # 查看 /var/lib/docker 目录下的内容
    [chenkai@centos7 docker]$ pwd
    /var/lib/docker
    [chenkai@centos7 docker]$ sudo ls
    buildkit    image    overlay2  runtimes  tmp	volumes
    containers  network  plugins   swarm	 trust
    
    如何确定是匿名挂载还是具名挂载, 还是指定路径挂载?
    -v /容器内路径			# 匿名
    -v 卷名:/容器内路径	   # 具名
    -v /宿主机路径:/容器内路径  # 指定路径挂载 
    

    拓展: 目录的读写权限

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



    完 ~

    每天都要遇到更好的自己.
  • 相关阅读:
    [Java优化] Java代码细节优化
    [网址] 工具类网址
    [Hadoop] 大数据环境安装博客
    简单说下Netty和RPC吧,大佬绕行
    nginx二级域名配置[CentOS]
    java面试准备-自我介绍
    同步||异步&&阻塞||非阻塞
    关于多线程的知识点-02
    [java进阶]关于多线程的知识点
    [java进阶]关于多线程的知识点
  • 原文地址:https://www.cnblogs.com/kaichenkai/p/14147145.html
Copyright © 2011-2022 走看看