美文网首页docker
Docker存储(四)

Docker存储(四)

作者: lconcise | 来源:发表于2019-10-16 20:28 被阅读0次

    Docker 网络配置(转载)
    Docker存储
    Docker compose(转载)
    Docker 部署 SpringBoot

    Docker容器在运行的时候会产生数据,为了不让这些数据随着容器的删除而删除,Docker支持数据持久化

    Docker数据持久化主要有两种方式:volume和bind mount。(有四种方式)

    • 使用volume,数据将持久化在Docker管理的volume中(保存在/var/lib/docker/volumes目录下)
    • 使用bind mount,数据将持久化在我们指定的宿主机的某个目录中

    Docker 官方文档地址:https://docs.docker.com/storage/

    和数据持久化相关的Docker命令:docker volume --help

    [root@10-9-106-123 _data]# docker volume --help
    
    Usage:  docker volume COMMAND
    
    Manage volumes
    
    Commands:
      create      Create a volume
      inspect     Display detailed information on one or more volumes
      ls          List volumes
      prune       Remove all unused local volumes
      rm          Remove one or more volumes
    
    Run 'docker volume COMMAND --help' for more information on a command.
    
    

    volume

    以MySQL为例子,查看5.7.25版本的 MySQL Dockerfile,会看到末尾处有这么一行:

    VOLUME /var/lib/mysql
    

    意思是在Docker创建MySQL容器时,Docker会自动创建一个volume,MySQL容器中/var/lib/mysql目录下的内容将同步到这个volume中

    我们来创建一个MySQL容器:

    docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.25
    

    然后查看是否创建了volume:

    [root@10-9-106-123 nginxdir]# docker volume ls
    DRIVER              VOLUME NAME
    local               285f50eeb8dac96b98d6f111acebe21086f41544be84b84c38b0c665716116dc
    [root@10-9-106-123 nginxdir]# docker volume inspect 285f50eeb8dac96b98d6f111acebe21086f41544be84b84c38b0c665716116dc
    [
        {
            "CreatedAt": "2019-10-15T18:46:14+08:00",
            "Driver": "local",
            "Labels": null,
            "Mountpoint": "/var/lib/docker/volumes/285f50eeb8dac96b98d6f111acebe21086f41544be84b84c38b0c665716116dc/_data",
            "Name": "285f50eeb8dac96b98d6f111acebe21086f41544be84b84c38b0c665716116dc",
            "Options": null,
            "Scope": "local"
        }
    ]
    

    volume默认的名称好长哦,我们可以在创建容器的时候指定volume的名称,我们删掉MySQL这个容器,重新创建个,并指定volume的名称为mysql:

    docker run -d --name mysql -p 3306:3306 -v mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.25
    

    -v mysql:/var/lib/mysql的意思是使用名称为mysql的volume(没有则创建),存储容器/var/lib/mysql目录下的内容(和MySQL Dockerfile中使用VOLUME指定的目录一致)。

    [root@10-9-106-123 nginxdir]# docker volume ls
    DRIVER              VOLUME NAME
    local               285f50eeb8dac96b98d6f111acebe21086f41544be84b84c38b0c665716116dc
    local               mysql
    [root@10-9-106-123 nginxdir]# docker volume inspect mysql
    [
        {
            "CreatedAt": "2019-10-15T18:49:48+08:00",
            "Driver": "local",
            "Labels": null,
            "Mountpoint": "/var/lib/docker/volumes/mysql/_data",
            "Name": "mysql",
            "Options": null,
            "Scope": "local"
        }
    ]
    

    可以看到多了个名称为mysql的volume。

    接下来做个实验:
    进入到MySQL容器中,创建一个名称为docker的数据库:
    退出容器并删除该容器,然后创建一个新的MySQL容器,volume指定为mysql:
    可以看到docker这个数据库还在,说明数据恢复了。

    bind mount

    docker run -v /home/aaa:/root/aaa
    

    宿主机的/home/aaa将和容器中的/root/aaa同步,宿主机/home/aaa目录下文件做了修改,容器中/root/aaa目录下文件也会被修改,反之亦然。

    以Nginx为例,拉取Nginx stable镜像:

    docker pull nginx:1.14.2
    

    创建Nginx容器:

    docker run -d --name nginx -p 80:80 -v $(pwd):/usr/share/nginx/html nginx:1.14.2
    

    通过$(pwd):/usr/share/nginx/html我们将宿主机的当前目录和Nginx容器内部的/usr/share/nginx/html目录进行了同步。

    我们在宿主机当前目录下新建一个hello.html:

    [root@10-9-106-123 nginxdir]# ls
    hello.html
    [root@10-9-106-123 nginxdir]# more hello.html 
    Hello Docker!
    

    然后进入到Nginx容器内的/usr/share/nginx/html目录:

    [root@10-9-106-123 nginxdir]# docker exec -it nginx /bin/sh
    # cd /usr/share/nginx/html
    # ls
    hello.html
    # more hello.html
    Hello Docker!
    

    同步是ok的,在宿主机外访问 http://106.75.99.88/hello.html 看看(我的宿主机IP为106.75.99.88)

    image.png

    参考链接:
    https://docs.docker.com/storage/volumes/
    https://mrbird.cc/Docker-Volume.html

    相关文章

      网友评论

        本文标题:Docker存储(四)

        本文链接:https://www.haomeiwen.com/subject/bdasmctx.html