1.docker run使用-v 绑定一个卷
来实现容器中的目录与本地某个目录的联通,这样可以让容器中的数据在容器销毁之后仍然可以被保留下来。下面是一些基本的步骤:
创建一个本地目录,用于存储容器中的数据。例如,我们可以在本地创建一个目录 /data,用于存储容器中的数据。
在运行容器时,使用 -v 参数将本地目录挂载到容器内部的目录上。例如,如果我们要运行一个 MySQL 容器,并将本地的 /data 目录挂载到容器内部的 /var/lib/mysql 目录上,可以使用如下命令:
docker run -d \--name my-mysql \-v /data:/var/lib/mysql \-e MYSQL_ROOT_PASSWORD=my-secret-pw \mysql:latest
在这个命令中,我们使用 -v 参数将本地的 /data 目录挂载到容器内部的 /var/lib/mysql 目录上。这样,在容器内部的数据就会被保存到本地的 /data 目录中。
运行容器后,容器中的数据就可以和本地的 /data 目录保持联通了。例如,如果我们要在 MySQL 容器中创建一个名为 mydatabase 的数据库,可以使用如下命令:
docker exec -it my-mysql mysql -uroot -pmy-secret-pw -e "CREATE DATABASE mydatabase;"
在这个命令中,我们使用 docker exec 命令进入到运行中的 MySQL 容器中,并执行一个 SQL 命令来创建一个名为 mydatabase 的数据库。由于我们已经将容器内部的 /var/lib/mysql 目录挂载到了本地的 /data 目录上,因此在容器内部创建的数据也会被保存到本地的 /data 目录中。
总之,使用数据卷可以让容器中的目录和本地的某个目录保持联通,从而实现容器数据的持久化。
2.docker-compose.yml中使用数据卷(Volume)
在 Docker Compose 中,可以使用 volumes 来实现容器中的目录与本地某个目录的联通。下面是一个基本的例子:
假设我们有一个 Django 应用程序和一个 MySQL 数据库。我们想要将 Django 应用程序和 MySQL 数据库分别运行在两个容器中,并且想要将 MySQL 数据库中的数据保存到本地的 /data/mysql 目录中。在这种情况下,我们可以创建一个 docker-compose.yml 文件,并在其中指定 volumes,如下所示:
version: "3"services:db:image: mysqlvolumes:- /data/mysql:/var/lib/mysqlenvironment:MYSQL_ROOT_PASSWORD: my-secret-pwweb:build: .volumes:- .:/codeports:- "8000:8000"depends_on:- dbenvironment:DB_HOST: dbDB_NAME: mydatabaseDB_USER: rootDB_PASSWORD: my-secret-pw
在上面的 docker-compose.yml 文件中,我们定义了两个服务:一个 MySQL 服务(名为 db),一个 Django 服务(名为 web)。我们还定义了两个 volumes,一个用于将本地的 /data/mysql 目录挂载到 MySQL 容器中的 /var/lib/mysql 目录上,另一个用于将当前目录(即 .)挂载到 Django 容器中的 /code 目录上。
这样,在运行 Docker Compose 时,我们可以使用如下命令:
docker-compose up
Docker Compose 会自动创建并启动两个容器,并将它们连接在一起。MySQL 容器中的数据会被保存到本地的 /data/mysql 目录中,而 Django 容器中的代码会被保存到本地的当前目录中。
区别:
使用 volumes 可以让容器中的目录和本地的某个目录保持联通,从而实现容器数据的持久化。
使用 -v 参数将本地的目录挂载到容器中时,Docker 会将本地目录中的数据直接复制到容器中,但容器中的数据并不会自动同步到本地目录中。这意味着,如果容器被删除或本地目录被删除,那么数据也将被删除,无法进行持久化。
相比之下,使用 volumes 来挂载目录时,Docker 会将数据存储在 Docker 所管理的卷中。这些卷可以被 Docker Compose 管理,可以轻松地备份和恢复。此外,可以使用 docker volume 命令来管理这些卷。使用 volumes,可以更好地管理和持久化容器中的数据。
另外,使用 volumes 还可以在容器中共享数据,并且可以在多个容器之间共享。这种方法可以减少数据复制的时间和空间,并减少硬盘的使用量。
综上所述,使用 volumes 比使用 -v 参数更加灵活和可管理,可以更好地管理容器中的数据,可以减少硬盘使用量,并且可以在多个容器之间共享数据。