zoukankan      html  css  js  c++  java
  • 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的话。  都可以使用相同的环境进行开发测试。

  • 相关阅读:
    【Codechef】Chef and Bike(二维多项式插值)
    USACO 完结的一些感想
    USACO 6.5 Checker Challenge
    USACO 6.5 The Clocks
    USACO 6.5 Betsy's Tour (插头dp)
    USACO 6.5 Closed Fences
    USACO 6.4 Electric Fences
    USACO 6.5 All Latin Squares
    USACO 6.4 The Primes
    USACO 6.4 Wisconsin Squares
  • 原文地址:https://www.cnblogs.com/chengege/p/12682501.html
Copyright © 2011-2022 走看看