zoukankan      html  css  js  c++  java
  • docker中的Mysql数据卷与持久化

    本文通过两个mysql容器(一个挂载一个无挂载)测试docker的持久化

    结论

    容器状态/持久化 无挂载 有挂载
    pause Y Y
    stop->start Y Y
    rm -> up N Y

    环境

    mac docker-compose

     ~/Workspace/docker/volume-learn � docker-compose -v
     
    docker-compose version 1.23.2, build 1110ad01
    
     ~/Workspace/docker/volume-learn � docker version
    Client: Docker Engine - Community
     Version:           18.09.2
     API version:       1.39
     Go version:        go1.10.8
     Git commit:        6247962
     Built:             Sun Feb 10 04:12:39 2019
     OS/Arch:           darwin/amd64
     Experimental:      false
    
    Server: Docker Engine - Community
     Engine:
      Version:          18.09.2
      API version:      1.39 (minimum version 1.12)
      Go version:       go1.10.6
      Git commit:       6247962
      Built:            Sun Feb 10 04:13:06 2019
      OS/Arch:          linux/amd64
      Experimental:     false
    

    步骤

    docker-compose.yml

    version: '3'
    
    services:
    
        mysql_1:
            image: mysql:5.7
            container_name: test_mysql_1
            environment:
                - MYSQL_ROOT_PASSWORD=123456
                - MYSQL_DATABASE=base
                - MYSQL_USER=dbuser
                - MYSQL_PASSWORD=topsecret
                - MYSQL_PORT=3306
            ports:
                - "3306:3306"
        mysql_2:
            image: mysql:5.7
            container_name: test_mysql_2
            environment:
                - MYSQL_ROOT_PASSWORD=123456
                - MYSQL_DATABASE=base
                - MYSQL_USER=dbuser
                - MYSQL_PASSWORD=topsecret
                - MYSQL_PORT=3306
            ports:
                - "3307:3306"
            volumes:
                - ./data/mysql_db:/var/lib/mysql
    

    启动

    docker-compose up -d
    Creating test_mysql_1 ... done
    Creating test_mysql_2 ... done
    

    查看挂载情况

    docker volume ls
    DRIVER              VOLUME NAME
    local               8c45070e36f1884b5d8a38fe73667fd0ed2bd6bfb8ad55ca6ff66f1fcebded6d
    
     ~/Workspace/docker/volume-learn > � docker inspect test_mysql_1 | grep Mounts -A 10
            "Mounts": [
                {
                    "Type": "volume",
                    "Name": "8c45070e36f1884b5d8a38fe73667fd0ed2bd6bfb8ad55ca6ff66f1fcebded6d",
                    "Source": "/var/lib/docker/volumes/8c45070e36f1884b5d8a38fe73667fd0ed2bd6bfb8ad55ca6ff66f1fcebded6d/_data",
                    "Destination": "/var/lib/mysql",
                    "Driver": "local",
                    "Mode": "",
                    "RW": true,
                    "Propagation": ""
                }
     ~/Workspace/docker/volume-learn >� docker inspect test_mysql_2 | grep Mounts -A 10
            "Mounts": [
                {
                    "Type": "bind",
                    "Source": "/Users/lifan/Workspace/docker/volume-learn/data/mysql_db",
                    "Destination": "/var/lib/mysql",
                    "Mode": "rw",
                    "RW": true,
                    "Propagation": "rprivate"
                }
            ],
            "Config": {
    
     ~/Workspace/docker/volume-learn � ll
    total 8
    drwxr-xr-x  3 lifan  staff   102B  8  5 16:46 data
    -rw-r--r--  1 lifan  staff   713B  8  5 16:50 docker-compose.yml
    

    MacOS 进入默认挂载目录

    mac OS

    cd ~/Library/Containers/com.docker.docker/Data/vms/0/
    screen tty
    # 页面悬停
    Ctrl + C
    
    linuxkit-025000000001:~# cd /var/lib/docker/volumes/
    linuxkit-025000000001:/var/lib/docker/volumes# ls
    8c45070e36f1884b5d8a38fe73667fd0ed2bd6bfb8ad55ca6ff66f1fcebded6d
    metadata.db
    linuxkit-025000000001:/var/lib/docker/volumes#
    
    # 同时按住Ctrl和a,然后放开再按下d
    Ctrl + A  D # 退出
    screen -r # 重新登入
    
    # 同时按住Ctrl和a,然后放开再按下k
    Ctrl + A + K # 彻底退出
    
    

    写入数据

    test_mysql_1

    CREATE TABLE `user_1` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    

    test_mysql_2

    CREATE TABLE `user_2` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `name` varchar(11) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    

    测试

    停止重启

     ~/Workspace/docker/volume-learn � docker-compose stop
    Stopping test_mysql_2 ... done
    Stopping test_mysql_1 ... done
     ~/Workspace/docker/volume-learn � docker-compose start
    Starting mysql_1 ... done
    Starting mysql_2 ... done
    

    两个数据都还在

    暂停重启

     ~/Workspace/docker/volume-learn � docker-compose pause
    Pausing test_mysql_1 ... done
    Pausing test_mysql_2 ... done
    
     ~/Workspace/docker/volume-learn � docker inspect test_mysql_1
    [
        {
            "Id": "55193429b7f8b548bcc74ac02239468ef80b439a81597a68503e6ed37097fa78",
            "Created": "2019-08-05T09:00:36.5867032Z",
            "Path": "docker-entrypoint.sh",
            "Args": [
                "mysqld"
            ],
            "State": {
                "Status": "paused",
                "Running": true,
                "Paused": true,
                "Restarting": false,
                "OOMKilled": false,
                "Dead": false,
                "Pid": 37015,
                "ExitCode": 0,
                "Error": "",
                "StartedAt": "2019-08-05T09:49:14.9745542Z",
                "FinishedAt": "2019-08-05T09:44:37.1531094Z"
            },
    
    
     ~/Workspace/docker/volume-learn � docker-compose unpause
    Unpausing test_mysql_2 ... done
    Unpausing test_mysql_1 ... done
    

    数据没有丢失

    删除容器重启

     ~/Workspace/docker/volume-learn � docker-compose stop
    Stopping test_mysql_2 ... done
    Stopping test_mysql_1 ... done
     ~/Workspace/docker/volume-learn � docker container ls -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
    317f7f035b4e        mysql:5.7           "docker-entrypoint.s…"   About an hour ago   Exited (0) 27 seconds ago                       test_mysql_2
    55193429b7f8        mysql:5.7           "docker-entrypoint.s…"   About an hour ago   Exited (0) 27 seconds ago                       test_mysql_1
    1e330d4da45d        46f8a1ba43b9        "./web"                  About an hour ago   Up About an hour                                k8s_leeroy-web_leeroy-web-66575d8bc7-t4n88_default_f3fe20ff-8b43-11e9-8f64-025000000001_1
    1aabdb1a4df2        4e70f93f0150        "./app"                  About an hour ago   Up About an hour                                k8s_leeroy-app_leeroy-app-5b597594f4-7kwwr_default_f3dc703c-8b43-11e9-8f64-025000000001_1
     ~/Workspace/docker/volume-learn �
    
     ~/Workspace/docker/volume-learn � docker container prune -f
    Deleted Containers:
    317f7f035b4e6bd80f987119acb9280735572dfa4fb74492aa365acf89b66e7b
    55193429b7f8b548bcc74ac02239468ef80b439a81597a68503e6ed37097fa78
    df6251c751c704805fa682a2950b50102589790099f4abd29a3d0c8d37f38ec4
    3f513d14c78300cbc88fdc794326caaca5caea549110ceeb8288b5223f314dd4
    a9f27228b8e6754594152f9566e7864ec0780c57ef7bf215a2bcf0423bee5d24
    a8992b319d0af91a8d69f8c37e7f76068e84cbdb3a1816dffeaa9f1ce1b09dbf
    
    Total reclaimed space: 0B
    
    docker-compose up 
    

    test_mysql_2 数据没有丢失
    test_mysql_1 数据丢失

    
     ~/Workspace/docker/volume-learn � docker inspect test_mysql_1 | grep Mounts -A 10
            "Mounts": [
                {
                    "Type": "volume",
                    "Name": "695c64bb2b3e0d36e4c14170aca4ba2e81dba29915458e8384456eb7751351d0",
                    "Source": "/var/lib/docker/volumes/695c64bb2b3e0d36e4c14170aca4ba2e81dba29915458e8384456eb7751351d0/_data",
                    "Destination": "/var/lib/mysql",
                    "Driver": "local",
                    "Mode": "",
                    "RW": true,
                    "Propagation": ""
                }
     ~/Workspace/docker/volume-learn � docker volume ls
    DRIVER              VOLUME NAME
    local               8c45070e36f1884b5d8a38fe73667fd0ed2bd6bfb8ad55ca6ff66f1fcebded6d
    local               695c64bb2b3e0d36e4c14170aca4ba2e81dba29915458e8384456eb7751351d0
    

    删除test_mysql_2的挂载目录再重启

    直接删除挂载目录

    容器没有停止

     ~/Workspace/docker/volume-learn � ll
    total 8
    drwxr-xr-x  3 lifan  staff   102B  8  5 16:46 data
    -rw-r--r--  1 lifan  staff   713B  8  5 16:50 docker-compose.yml
     ~/Workspace/docker/volume-learn � rm -rf data
     ~/Workspace/docker/volume-learn �
     
    

    访问数据库,可以连接,但是没有数据

    创建数据库失败

    create database base;
    
    Can't create database 'base' (errno: 1808635584)
    

    重启容器

    data目录被创建,再次挂载到主机目录

     ~/Workspace/docker/volume-learn � docker-compose stop
    Stopping test_mysql_2 ... done
    Stopping test_mysql_1 ... done
     ~/Workspace/docker/volume-learn � docker-compose start
    Starting mysql_1 ... done
    Starting mysql_2 ... done
     ~/Workspace/docker/volume-learn � ll
    total 8
    drwxr-xr-x  3 lifan  staff   102B  8  5 18:25 data
    -rw-r--r--  1 lifan  staff   713B  8  5 16:50 docker-compose.yml
     ~/Workspace/docker/volume-learn �
    

    创建表,写入数据

    CREATE TABLE `user_2` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `name` varchar(11) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    

    停止删除容器再启动

     ~/Workspace/docker/volume-learn � docker-compose stop
    Stopping test_mysql_2 ... done
    Stopping test_mysql_1 ... done
     ~/Workspace/docker/volume-learn � docker rm 77466edd2bd2
    77466edd2bd2
     ~/Workspace/docker/volume-learn � docker-compose up -d
    Starting test_mysql_1 ... done
    Creating test_mysql_2 ... done
     ~/Workspace/docker/volume-learn �
    

    数据还在,容器工作正常

  • 相关阅读:
    C++入门经典-例4.9-输出不同生命周期的变量值
    C++入门经典-例4.8-同名的全局变量和局部变量
    C++入门经典-例4.7-变量的作用域
    C++入门经典-例4.6-使用重载函数
    C++入门经典-例4.5-利用循环求n的阶乘
    C++入门经典-例4.4-循环嵌套之求n的阶乘
    C++入门经典-例4.3-函数的递归调用之汉诺塔问题
    C++入门经典-例4.2-调用默认参数的函数
    C++入门经典-例4.1-声明、定义和使用函数
    C++入门经典-例3.25-使用循环输出闰年
  • 原文地址:https://www.cnblogs.com/lifan1998/p/14326741.html
Copyright © 2011-2022 走看看