Docker 基础知识
容器volume使用

容器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  imagename

MySQL卷挂载升级实验

镜像准备

准备两个版本的MySQL的镜像,这样选择MySQL5.6的版本,因为这个版本的MySQL不太,节约一些下载时间。

docker pull mysql:5.6.45
docker pull mysql:5.6.47
docker 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 bash
mysql -pmysqlpwd
select 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 bash
mysql -pmysqlpwd
select 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