容器volume使用
容器生命周期介绍
Docker 容器的生命周期可以分为五个阶段:
- 创建:使用 docker run 命令创建一个新的容器。
- 启动:容器被启动,变为活动状态。
- 运行:容器正在执行主进程。
- 停止:容器被停止或终止。
- 删除:容器从系统中删除。
下面,我们将探讨每个阶段如何与卷相关:
创建
当您使用 docker run 命令创建一个新的容器时,Docker 将创建一个新的映象并将其分配给容器。您可以指定现有的映象或基于父映象创建一个新的映象。
卷: 在创建容器时,您也可以指定要附加到容器的卷。卷是存在于容器外部文件系统中的目录,但可以从容器内部访问。这允许您即使删除或重新创建容器,也能保持数据 persistency。
示例:docker run -d --name my-container -v /path/to/data:/data my-image
启动
在启动阶段,容器被启动,并将根据映象的默认命令执行其主进程。容器变为活动状态。
卷: 在这个阶段,卷将被挂载到容器中,使得您可以从容器内部访问外部目录。 示例:docker run -d --name my-container -v /path/to/data:/data my-image ls /data
运行
现在,容器正在执行其主进程。您可以使用命令如 docker exec 或 docker attach 来与容器交互。 卷: 卷仍然被挂载到容器中,使得您可以 persist 数据和访问外部目录。
示例:docker exec -it my-container /bin/bash
停止
当您使用 docker stop 命令停止一个运行中的容器时,容器将被终止。但是,如果容器有卷附加,那么这些卷仍然存在于文件系统中。
示例:docker stop my-container
删除
当您使用 docker rm 命令删除一个容器时,容器将从系统中删除。但是,如果容器有卷附加,那么这些卷仍然存在于文件系统中,可以在需要时重新访问。
示例:docker rm -v my-container
这是 Docker 容器的生命周期的一个简要概述,卷生命周期独立容器,这使用我们可以应用的重要数据保存到卷中,当应用升级后,使用新的镜像来运行 时,仍然可以使用这些重要数据。
卷操作的基本命令
用法:
# 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 unused local volumes
rm Remove one or more volumes
Run 'docker volume COMMAND --help' for more information on a command.卷的创建、查看与容器挂载
创建卷
docker volume create mysql-data卷查看
docker volume create ls结果:
DRIVER VOLUME NAME
local 5d2b675aaedf5db838a0609fb439b1543ab3cc9a2c0208d14b7b9bd6ad55d8d7
local 8d19a325001c9dafc3d4c0bec4a57e1f2a16472f5949a92225c5044bb6c15d82
local mysql-data卷挂载
在docker run时,使用 -v 参数进行卷挂载。
sudo docker run -d -v mysql-data:/var/lib/mysql imagenameMySQL卷挂载升级实验
镜像准备
准备两个版本的MySQL的镜像,这样选择MySQL5.6的版本,因为这个版本的MySQL不太,节约一些下载时间。
docker pull mysql:5.6.45docker pull mysql:5.6.47docker images结果:
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.6.47 43f75a12e7ba 4 years ago 302MB
mysql 5.6.45 95e0fc47b096 4 years ago 257MB启动容器
使用mysql-data卷启动MySQL:
sudo docker run -d \
-e MYSQL_ROOT_PASSWORD=mysqlpwd \
--name mysql56-with-volume \
-p 3306:3306 \
-v mysql-data:/var/lib/mysql \
mysql:5.6.45写入数据
进入MySQL创建一个database:
docker exec -ti mysql56-with-volume bashmysql -pmysqlpwdselect version();输出:
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.6.45 |
+-----------+
1 row in set (0.00 sec)创建一个空database,升级后验证这个database是否还存在。
create database easylearning_db;按两次Ctrl+D分别退出MySQL Client和容器。
查看卷数据
查看卷的直实路径:
docker inspect -f '{{range .Mounts}}{{.Source}} {{end}}' mysql56-with-volume输出:
/var/lib/docker/volumes/mysql-data/_data查看目录下的文件:
ls /var/lib/docker/volumes/mysql-data/_data输出:
auto.cnf easylearning_db ib_logfile0 ib_logfile1 ibdata1 mysql performance_schema可以看到,MySQL容器已经将数据文件写到了volume下面,接下我们可以用相同的volume来做一下MySQL的版本升级。
MySQL升级
先删除5.6.45版本的容器。
docker rm -f mysql56-with-volume再使用原来的数据卷mysql-data来启新版本的MySQL:
sudo docker run -d \
-e MYSQL_ROOT_PASSWORD=mysqlpwd \
--name mysql56-47-with-volume \
-p 3306:3306 \
-v mysql-data:/var/lib/mysql \
mysql:5.6.47查看数据
进入MySQL创建一个database:
docker exec -ti mysql56-47-with-volume bashmysql -pmysqlpwdselect version();输出:
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.6.47 |
+-----------+
1 row in set (0.00 sec)查看database easylearning_db否还存在。
show databases;结果:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| easylearning_db |
| mysql |
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)easylearning_db 数据库仍在存在,说明我们的升级成功,更换了全新的容器后,我们的数据任然还在。
按两次Ctrl+D分别退出MySQL Client和容器。
数据卷的衍生用法
在实际应用过程中,我们可以直接将Docker主机上面的目录挂载到容器,而无需事先创建数据卷。这种方式也带来更多的便利。
先创建一个目录准备挂载
mkdir -p /root/mysql/data启动容器时,只需要将原来的卷名改为实际路径即可:
sudo docker run -d \
-e MYSQL_ROOT_PASSWORD=mysqlpwd \
--name mysql56-47-with-host-path \
-p 3306:3306 \
-v /root/mysql/data:/var/lib/mysql \
mysql:5.6.47查看Docker主机下的数据目录:
ls /root/mysql/data总结
本节了解Docker的生命周期,使用卷来保存容器需要用到的重要数据,当容器重建后,仍然可以继续使用这些数据。
资源清理
危险命令,慎用!
删除所有容器:
docker container ls -aq | xargs docker container rm -f删除数据库卷:
docker volume rm mysql-data