Skip to content

08 Docker 基础 - 本地目录挂载

数据卷的目录结构较深,如果我们去操作数据卷目录会不太方便。在很多情况下,我们会直接将容器目录与宿主机指定目录挂载。

本地目录挂载命令

bash
# 挂载目录
docker run -it -v /宿主机目录:/容器目录 镜像名
# 挂载文件
docker run -it -v /宿主机文件:/容器文件 镜像名

注意

  • 本地目录或文件必须以 /./ 开头,如果直接以名字开头,会被识别为数据卷名而非本地目录名。
  • 如果本地目录不存在,会自动创建。
bash
docker run -it -v mysql:/var/lib/mysql mysql # 挂载数据卷,会被识别为一个数据卷叫 mysql
docker run -it -v ./mysql:/var/lib/mysql mysql # 挂载本地目录,运行时如果不存在会创建目录

案例 mysql 容器的数据挂载

需求

  • 查看 mysql 容器,判断是否有数据卷挂载
  • 基于宿主机目录实现 MySQL 数据目录、配置文件、初始化脚本的挂载(查阅官方镜像文档)
    • 挂载 /root/mysql/data 到容器内的 /var/lib/mysql 目录
    • 挂载 /root/mysql/init 到容器内的 /docker-entrypoint-initdb.d 目录(初始化的 SQL 脚本目录)
    • 挂载 /root/mysql/conf 到容器内的 /etc/mysql/conf.d 目录(这个是 MySQL 配置文件目录)

提示

  • 在执行 docker run 命令时,使用 -v 本地目录:容器内目录 可以完成本地目录挂载
  • 本地目录必须以 "/" 或 "./" 开头,如果直接以名称开头,会被识别为数据卷而非本地目录
    • -v mysql:/var/lib/mysql 会被识别为一个数据卷叫 mysql
    • -v ./mysql:/var/lib/mysql 会被识别为当前目录下的 mysql 目录
所需文件

初始化 SQL 脚本和配置文件在课程资料中。目录:资料 → mysql → conf/init。

  • hm.cnf 主要是配置了 MySQL 的默认编码,改为 utf8mb4
  • hmall.sql 则是后面我们要用到的黑马商城项目的初始化 SQL 脚本。
bash
 tree
.
├── conf
│   └── hm.cnf
└── init
    └── hmall.sql

2 directories, 2 files
  1. 删除原来的 MySQL 容器。

    bash
     dkrm -f mysql # docker rm -f mysql
    mysql
  2. 创建并运行新 mysql 容器,挂载本地目录。

    bash
     pwd
    /home/ubuntu
    
     ls
     mysql/ VSCodeWorking/ hello-world.tar
    
     docker run -d \
      --name mysql \
      -p 3306:3306 \
      -e TZ=Asia/Shanghai \
      -e MYSQL_ROOT_PASSWORD=123 \
      -v ./mysql/data:/var/lib/mysql \
      -v ./mysql/conf:/etc/mysql/conf.d \
      -v ./mysql/init:/docker-entrypoint-initdb.d \
      mysql
    df03411d0466e307368f25c94eb93ff802379d8f920900194822f58fe97c5477
     dkps # docker ps
    CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                                  NAMES
    df03411d0466   mysql     "docker-entrypoint.s…"   33 seconds ago   Up 32 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql
    a415c4c37209   nginx     "/docker-entrypoint.…"   14 hours ago     Up 12 hours     0.0.0.0:80->80/tcp, :::80->80/tcp
  3. 查看 mysql 目录,可以发现 mysql/data 目录已经自动创建好了

    bash
     lsa mysql
    Permissions Size User   Date Modified Name
    drwxrwxr-x     - ubuntu  5 Nov 22:57  conf
    drwxr-xr-x     - lxd     5 Nov 23:04  data
    drwxrwxr-x     - ubuntu  5 Nov 22:57  init
  4. 查看 data 目录,会发现里面有大量数据库数据,说明数据库完成了初始化。

    bash
     tree mysql -L 2
    mysql
    ├── conf
    │   └── hm.cnf
    ├── data
    │   ├── auto.cnf
    │   ├── binlog.000001
    │   ├── binlog.000002
    │   ├── binlog.index
    │   ├── ca-key.pem
    │   ├── ca.pem
    │   ├── client-cert.pem
    │   ├── client-key.pem
    │   ├── hmall
    │   ├── #ib_16384_0.dblwr
    │   ├── #ib_16384_1.dblwr
    │   ├── ib_buffer_pool
    │   ├── ibdata1
    │   ├── ibtmp1
    │   ├── #innodb_redo
    │   ├── #innodb_temp
    │   ├── mysql
    │   ├── mysql.ibd
    │   ├── mysql.sock -> /var/run/mysqld/mysqld.sock
    │   ├── performance_schema
    │   ├── private_key.pem
    │   ├── public_key.pem
    │   ├── server-cert.pem
    │   ├── server-key.pem
    │   ├── sys
    │   ├── undo_001
    │   └── undo_002
    └── init
        └── hmall.sql
    
    9 directories, 23 files
  5. 进入 MySQL 容器,查看 MySQL 编码表。

    bash
     dex mysql mysql -uroot -p123 # docker exec -it mysql mysql -uroot -p123
    mysql: [Warning] Using a password on the command line interface can be insecure.
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 8
    Server version: 8.2.0 MySQL Community Server - GPL
    
    Copyright (c) 2000, 2023, Oracle and/or its affiliates.
    
    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 variables like "%char%";
    +--------------------------+--------------------------------+
    | Variable_name            | Value                          |
    +--------------------------+--------------------------------+
    | character_set_client     | utf8mb4                        |
    | character_set_connection | utf8mb4                        |
    | character_set_database   | utf8mb4                        |
    | character_set_filesystem | binary                         |
    | character_set_results    | utf8mb4                        |
    | character_set_server     | utf8mb4                        |
    | character_set_system     | utf8mb3                        |
    | character_sets_dir       | /usr/share/mysql-8.2/charsets/ |
    +--------------------------+--------------------------------+
    8 rows in set (0.03 sec)

    发现编码是 utf8mb4 没有问题。

  6. 查看数据库。

    bash
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | hmall              |
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    5 rows in set (0.00 sec)
  7. 切换到 hmall 数据库,查看表。

    bash
    mysql> use hmall;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    mysql> show tables;
    +-----------------+
    | Tables_in_hmall |
    +-----------------+
    | address         |
    | cart            |
    | item            |
    | order           |
    | order_detail    |
    | order_logistics |
    | pay_order       |
    | user            |
    +-----------------+
    8 rows in set (0.00 sec)
  8. 查看 address 表数据。

    bash
    mysql> select * from address;
    +----+---------+----------+--------+--------------+-------------+--------------------+-----------+------------+-------+
    | id | user_id | province | city   | town         | mobile      | street             | contact   | is_default | notes |
    +----+---------+----------+--------+--------------+-------------+--------------------+-----------+------------+-------+
    | 59 |       1 | 北京     | 北京   | 朝阳区       | 13900112222 | 金燕龙办公楼       | 李嘉诚    | 0          | NULL  |
    | 60 |       1 | 北京     | 北京   | 朝阳区       | 13700221122 | 修正大厦           | 李佳红    | 0          | NULL  |
    | 61 |       1 | 上海     | 上海   | 浦东新区     | 13301212233 | 航头镇航头路       | 李佳星    | 1          | NULL  |
    | 63 |       1 | 广东     | 佛山   | 永春         | 13301212233 | 永春武馆           | 李小龙    | 0          | NULL  |
    +----+---------+----------+--------+--------------+-------------+--------------------+-----------+------------+-------+
    4 rows in set (0.00 sec)

总结

  • 什么是数据卷?
    • 数据卷是一个虚拟目录,它将宿主机目录映射到容器内目录,方便我们操作容器内文件,或者方便迁移容器产生的数据
  • 如何挂载数据卷?
    • 在创建容器时,利用 -v 数据卷名:容器内目录 完成挂载
    • 容器创建时,如果发现挂载的数据卷不存在时,会自动创建
  • 数据卷的常见命令有哪些?
    • docker volume ls: 查看数据卷
    • docker volume rm: 删除数据卷
    • docker volume inspect: 查看数据卷详情
    • docker volume prune: 删除未使用的数据卷