• Docker 持久化存储, Data Volume/Bind Mounting


    docker容器, 再启动之后 我们可以对其进行 修改删除等等。
    如果是一个数据库的容器, 里面的数据 不想随着这个容器的消失, 而消失。  就需要持久化数据存储。

    Data Volume  

     这是 docker hub 上面  mysql 的Dockerfile 这里的 VOLUME 意思就是, 将产生的数据 写入到当前主机的 /var/lib/mysql 里面。

    [miller@docker4 ~]$ docker images
    REPOSITORY                         TAG                 IMAGE ID            CREATED             SIZE
    daocloud.io/library/mysql          latest              9228ee8bac7a        11 days ago         547MB
    [miller@docker4 ~]$ docker run -d --name=mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true daocloud.io/library/mysql
    e7945f20bc456038a110a9798299356c8e7912a22eceaaf4e2bd29880460ab6f
    -e MYSQL_ALLOW_EMPTY_PASSWORD=true  告诉mysql 没有密码也可以用。

    https://hub.docker.com/_/mysql  这里有一些参数的详解。 也可以设置密码。

    [miller@docker4 ~]$ docker volume ls   # 会在主机上找个地方存  数据
    DRIVER              VOLUME NAME
    local               283f5d6584642ae6d32d5e02fd1330855b501dd891ddf38c5b40428183c652c8  # 这个是redis的
    local               330b65bda64c22b0929443d9eaa2db28c3a2468f76876b706c8efdbcbf6e4919   # 这个是mysql的
    [miller@docker4 docker]$ docker volume inspect 330b65bda64c22b0929443d9eaa2db28c3a2468f76876b706c8efdbcbf6e4919
    [
        {
            "CreatedAt": "2020-04-11T20:26:36+08:00",
            "Driver": "local",
            "Labels": null,
            "Mountpoint": "/var/lib/docker/volumes/330b65bda64c22b0929443d9eaa2db28c3a2468f76876b706c8efdbcbf6e4919/_data",
            "Name": "330b65bda64c22b0929443d9eaa2db28c3a2468f76876b706c8efdbcbf6e4919",
            "Options": null,
            "Scope": "local"
        }
    ]

    "Mountpoint": "/var/lib/docker/volumes/330b65bda64c22b0929443d9eaa2db28c3a2468f76876b706c8efdbcbf6e4919/_data"  这个路径就是安装docker这台主机
    上的文件路径。 数据库产生的数据 都会存储到这里。 volume 是不会因为容器的删除 而消失。

    由于volume的名字不友好, 可以自己定义:起别名:

    [miller@docker4 ~]$ docker run -d --name=mysql1 -v mysql:/var/lib/mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true daocloud.io/library/mysql
    7b006082d7d9c1cc8f17dfaefda26afea6d2adb0c89b216eafe193fa9420c917
     -v  mysql:/var/lib/mysql  就这一段参数。 本机上的 /var/lib/docker/volumes/mysql的 就和 容器中 /var/lib/mysql 这两个目录是同步的了。  
    [miller@docker4 ~]$ docker volume ls
    DRIVER              VOLUME NAME
    local               330b65bda64c22b0929443d9eaa2db28c3a2468f76876b706c8efdbcbf6e4919   # redis的
    local               mysql  # 刚刚创建的 mysql 容器的   volume 

    可以进到 MySQL 容器中,登录客户端。

    [miller@docker4 ~]$ docker exec  -it mysql1 /bin/bash
    root@c057b8fbb3ad:/# mysql -u root Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 8 Server version: 8.0.19 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>

    在这个数据库里面,  创建一个库 然后, 停止mysql容器, 再删除容器。

    [miller@docker4 ~]$ docker ps 
    CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                 NAMES
    c057b8fbb3ad        daocloud.io/library/mysql   "docker-entrypoint.s…"   4 minutes ago       Up 4 minutes        3306/tcp, 33060/tcp   mysql1
    [miller@docker4 ~]$ docker rm -f mysql1   # 停止这个容器 并且删除
    mysql1
    [miller@docker4 ~]$ docker volume ls
    DRIVER              VOLUME NAME
    local               330b65bda64c22b0929443d9eaa2db28c3a2468f76876b706c8efdbcbf6e4919
    local               mysql   # volume 是还在的。  后面再创建一个  容器 然后依然使用这个  volume

    # 可以看到, 再次重新创建一个 容器。 依然使用同一个  volume 的话。 还能继续使用原来的数据。 是没有丢的。 

    [miller@docker4 ~]$ docker run -d --name=mysql2 -v mysql:/var/lib/mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true daocloud.io/library/mysql
    f9cfe55e7e6d85a6c44bc177fb324051e5735e80dbf30c5224cbfd0c7f844181
    [miller@docker4 ~]$ docker exec -it mysql2 mysql -u root Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 8 Server version: 8.0.19 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> show databases; +--------------------+ | Database | +--------------------+ | docker | | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.01 sec)

    Bind Mounting: 的方式, 进行数据持久化。(这个其实就是将docker宿主机的一个 目录。映射到容器当中。)

    不仅仅是数据库:

    如果启用一个 nginx 服务, 在这个容器的  /usr/share/nginx/html 这个目录下, 都是这个web服务的静态文件。

    docker run -v 这个指令  可以将这个容器中的   /usr/share/nginx/html 路径, 映射到 本机的某个目录中。 这样我们在修改本机的文件的时候, 同步的容器中的这个目录

    也会跟着修改。  因为他们是同步的。

    [miller@ static_html_file] docker run -d -v $(pwd):/usr/share/nginx/html -p 80:80   # 这样当前目录就映射到了 容器中。两边是同步的。

    这样做的好处就是, 对于开发者是一个极大的方便。
    因为将本机的目录 , 映射到容器当中。我们在本机的这个目录中做任何事情。 都会马上体现到 容器中。
    方便调试 开发。

    非常方便, 因为一般宿主机的环境, 和测试 运维等等 都不相同。 但是如果大家都是用docker的话。  都可以使用相同的环境进行开发测试。

  • 相关阅读:
    一个js选项卡
    郁闷
    Object Literals
    typeof and instanceof
    比较好用的日期控件
    很炫的分页
    [转]ASP.NET Web.config配置文件的基本使用方法
    正则匹配 获取QQ空间日志
    漂浮窗(层)JS
    ASP.NET页面事件执行过程(完整版)
  • 原文地址:https://www.cnblogs.com/chengege/p/12682501.html
Copyright © 2020-2023  润新知