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的话。  都可以使用相同的环境进行开发测试。

原文地址:https://www.cnblogs.com/chengege/p/12682501.html