Docker02--docker挂载、迁移与备份、其他操作、Dockerfile、私有仓库、Docker-compose、容器通信、数据卷
1 部署应用-映射外部目录
### 注:
通常docker起的mysql、redis服务,都需要将服务配置和数据文件 挂载到本机上
防止容器挂掉,数据丢失。
# 部署redis 并把配置文件和数据目录映射出来
# 操作步骤
# 1 创建目录
mkdir /redis /redis/conf /redis/data
# 2 创建配置文件
vim /redis/conf/redis.conf
# 配置文件
bind 0.0.0.0 # 绑定本地回环地址
daemonize NO # 不以后台运行
protected-mode no # 这是严格模式
requirepass 123456 # 设置连接密码
# 3 创建并运行容器 并执行命令 '以配置文件 启动redis-server'
docker run -p 6378:6379 --name redis_6379 -v /redis/conf/redis.conf:/etc/redis/redis.conf -v /redis/data:/data -di redis redis-server /etc/redis/redis.conf
# 4 redis数据持久化
好处:
在宿主机的/redis/data路径下就能看到一个数据文件
不管多少次重启redis容器,数据都还在
原来的redis容器没了,按照第三步再启动一遍,数据依旧存在
方式一:配置默认持久化 直接写在redis.conf中
# 待补充
方式二:每次操作数据后,手动保存持久化
# cmd中 保存数据 (数据持久化到 /redis/data文件夹下 )
save 或者 bgsave (后台运行保存数据)
# 5 本地连接 并访问操作redis
# 1 cmd窗口下 连接redis 或 redis软件工具 连接操作数据
redis-cli -h 101.133.225.166 -p 6378
# 2 密码权限认证
auth 123456
# 3 写入数据
set name lqz
# 4 手动保存 或 配置默认持久化
2 迁移与备份
2.1 容器保存为镜像
# 命令
docker commit 容器名字/id 镜像名字
# eg:
# 装有python的容器里安装django
pip install django==1.11.11 -i https://pypi.douban.com/simple/
# 将容器保存为镜像
docker commit 19b mydjango
# 拓展:镜像结构
打包镜像时,并不是把涉及到的所有文件,打包到一个包中,
而是分布操作,把每一步涉及到的文件,依次打包成一个独立包
多个包文件,才构成一个镜像文件。
每步打成的包,叫做 层【Layer】 # 层【Layer】:即添加安装包、依赖、配置等,每次操作都形成新的一层
eg: 自定义的Java或python应用
1.基础镜像 centos7 #【基础镜像:BaseImage】:应用依赖的系统函数库、环境、配置、文件等
2.安装JDK 或 python解释器,配置环境变量
3.拷贝jar包,或python代码
4.设置启动命令 java -jar xx.jar #【入口 Entrypoint】: 镜像运行入口,一般是程序启动的脚本和参数
# 故:这就是为什么拉取镜像时,也是分层下载的
分层的目的:核心就是为了 提供复用性
2.2 镜像备份
把镜像打包成压缩包
# 命令
docker save -o 镜像压缩包名 镜像名字 # -o output 输出
# eg:
docker save -o mydjango.tar mydjango
2.3 镜像恢复与迁移
把压缩包回复为镜像
# 命令
docker load -i 镜像压缩包名 # -i input 输入
# eg:
docker load -i mydjango.tar
3 其他操作
# 删除所有容器 最好不用 !!!
docker rm `docker ps -a -q`
# 删除所有镜像 最好不用 !!!
docker rmi `docker images -q`
# 若面试被问到,不要说不知道
回答:具体命令忘了,因为不常用,但原理是 删除 后面跟 过滤容器或镜像的id
# 查看容器运行日志
docker logs 容器id
# 自定义制作django的镜像,并运行容器 的操作步骤
1 启动一个python容器
docker run -di --name python3 python:3.6
2 进入容器装软件
docker exec -it python3 /bin/bash
mkdir /project
pip install django==1.11.11 # 正常项目:pip install -r requirements.txt
exit
### 方式一:代码文件通过目录挂载
3 把容器做成镜像
docker commit python3 mydjango
4 基于自定义的镜像运行容器
docker run -id --name mydjango -p 8088:8088 -v /opt/lqz/django_test:/project/django_test mydjango python /project/django_test/manage.py runserver 0.0.0.0:8088
### 方式二:将代码文件也做到镜像文件里
3 把项目文件拷贝到容器内部
docker cp /opt/lqz/django_test python3:/project/django_test
4 把容器做成镜像
docker commit python3 mydjango
5 基于自定义的镜像运行容器
docker run -id --name mydjango -p 8088:8088 mydjango python /project/django_test/manage.py runserver 0.0.0.0:8088
4 Dockerfile(***)
# 1 Dockerfile介绍
Dockerfile是由包含一个个指令的文本文件【一系列命令和参数构成的脚本】,通过这个文件的指令,来说明执行什么操作,来构建镜像。
# 2 Dockerfile常用指令
命令 作用
FROM image_name:tag # 定义了使用哪个基础镜像启动构建流程
MAINTAINER user_name # 声明镜像的创建者 已过期
LABEL maintainer 名字 # 新版
ENV key=value # 设置环境变量 (可以写多条)
COPY source_dir/file dest_dir/file # 简单复制:只将宿主机的文件复制到容器内【官方推荐】
ADD source_dir/file dest_dir/file # 高级复制:与COPY类似,额外功能:自动解压压缩包(.tar, .tar.gz 等) + 支持远程URL下载
WORKDIR path_dir # 设置工作目录 (表示一进去,就在哪个目录下)
RUN command # 制作镜像时执行【安装过程】 的命令 是Dockerfile的核心部分(可以写多条)
CMD ['命令', '参数项', '参数值'] # 容器启动的默认命令/默认参数 容易被覆盖
ENTRYPOINT ['命令', '参数项', '参数值'] # 容器启动的固定主命令 必须执行的命令
# 两者区别
# CMD:默认命令,会被覆盖 在启动容器时,若手动写命令,会直接覆盖掉CMD 多条只有最后一条生效
# ENTRYPOINT:入口命令,一定执行,不会覆盖 在启动容器时,若手动写命令,只会当成参数追加进去
# 实际中:两者兼用,固定参数写ENTRYPOINT,默认参数写CMD中
USER # 指定以哪个用户的名义执行RUN, CMD 和ENTRYPOINT等命令
# 下面两个可以命令 启动容器时 再指定
EXPOSE 端口号 # 设置对外暴露的端口
VOLUME ["目录"] # 添加数据卷 目录挂载(映射)
# 3 通过Dockerfile文件 生成镜像
docker build -t '镜像名' .
# 注意:
后边的空格和点,不要省略 # 表示以 当前目录下的dockerfile 构建
4.1 案例:Dockerfile部署项目
# 案例:使用Dockerfile 部署django项目
# 0.前提
# 项目目录
django_test
-项目文件
-requirements.txt # django环境文件
-Dockerfile # docker部署镜像文件
-uwsgi.ini # uwsgi启动配置文件
# uwsgi.ini的配置编写 以往采用xml格式编写,现采用ini的格式
[uwsgi]
# 采用socket 连接nginx
# socket=0.0.0.0:8080 # Nginx配置中 uwsgi_pass应指向uWSGI服务器IP和端口
# 也可采用http 连接nginx
http=0.0.0.0:8080 # Nginx配置中 proxy_pass应指向uWSGI服务器IP和端口
chdir=/home/django_test/ # 项目路径 项目所在目录
wsgi-file=django_test/wsgi.py # wsgi接口模块文件路径
processes=4 # 启动的进程数
threads=2 # 每个进程的线程数
master=True # 启动管理主进程
pidfile=uwsgi.pid # 存放主进程的进程号文件 以后可通过该进程号 关闭uwsgi服务
daemonize=uwsgi.log # 以后台守护进程运行 并存放日志记录文件
容器就没有一个前台进程在夯住了,故需要额外的阻塞命令!!!
# 1.编写一个Dockerfile 文件名字必须为Dockerfile
vim Dockerfile
FROM python:3.6
MAINTAINER lqz
EXPOSE 8080
ADD ./requirement.txt /home/
RUN pip install -r /home/requirement.txt -i https://pypi.douban.com/simple/
RUN pip install uwsgi -i https://pypi.douban.com/simple/
VOLUME ["/home"]
WORKDIR /home/django_test
CMD ["uwsgi", "--ini", "uwsgi.ini"]
# 2 通过dockerfile构建出镜像
docker build -t 'django_1.11.11' . # 注意后边的空格和点,不要省略 表示以 当前目录下的Dockerfile 构建
# 3 查看镜像是否建立完成
docker images
# 4 启动容器
docker run -di --name my_django1 -v /opt/web_django/django_test:/home/django_test -p 8080:8080 django_1.11.11
# 5 在外部访问即可
###### 此时 项目已经通过uwsgi正常启动 再通过nginx容器配置转发到80端口访问
# 1 配置nginx转发
# 创建文件夹
mkdir -p /opt/nginx/conf /opt/nginx/html /opt/nginx/logs
# 新建配置文件
vim /opt/nginx/conf/nginx.conf
# 写入
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
# 采用http 与 uwsgi 通信时
proxy_pass http://101.133.225.166:8080;
}
}
}
# 2 docker中运行nginx
docker run --name my_nginx -id -p 80:80 -v /opt/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /opt/nginx/html:/etc/nginx/html -v /opt/nginx/logs:/var/log/nginx nginx
###### 此时 单个项目通过uwsgi启动 并nginx配置转发 增加并发 采用nginx的负载均衡配置
# 1 配置负载均衡
# 修改nginx配置文件
vim /opt/nginx/conf/nginx.conf
# 写入
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# 负载均衡配置
upstream node {
server 101.133.225.166:8080;
server 101.133.225.166:8081;
server 101.133.225.166:8082;
}
server {
listen 80;
server_name localhost;
# 对 "/" 启用反向代理
location / {
# 负载均衡配置
proxy_pass http://node;
}
}
}
# 2 多启动几个django的docker容器
docker run -di --name my_django2 -v /opt/web_django/django_test:/home/django_test/ -p 8081:8080 django_1.11.11
docker run -di --name my_django3 -v /opt/web_django/django_test:/home/django_test/ -p 8082:8080 django_1.11.11
# 3 重启nginx
docker restart my_nginx
# nginx负载均衡的好处:
假设8080/8081的容器挂了,但8082依旧可正常提供服务
再把django的docker容器 启动起来即可
5 私有仓库
# Docker仓库
就是存放docker镜像并有docker pull方法下载的云环境
# 分类
分为公有仓库和私有仓库
公有仓库指 Docker Hub(官方)等开放给用户使用、允许用户管理镜像
私有仓库指 由用户自行搭建的存放镜像的云环境
# 私有仓库本质
就是一个web项目,通过docker拉取创库镜像,然后docker运行起来 即可!
# 如何把自定义的镜像传到docker hub上
0 Docker hub官网 注册账号
1 登录docker
docker login 输入用户名/密码
2 上传的image打个标签
docker tag 镜像id/镜像名 用户名/镜像名:tag名
# eg: docker tag 5452fa6715c0 liuqingzheng/django1.11.9:v1
3 再查看下 打完tag标签的镜像
docker images
4 上传镜像到Docker hub
docker push 带tag标签的镜像名
# eg: docker push liuqingzheng/django1.11.9
5.1 私有仓库搭建与配置
# 1 拉取私有仓库镜像
docker pull registry
# 2 启动私有仓库容器
docker run -di --name registry -p 5000:5000 registry
# 3 打开浏览器输入地址 http://服务器IP:5000/v2/_catalog
看到{"repositories":[]} # 表示私有仓库搭建成功并且内容为空
# 4 配置指定 docker push上传时,仓库的地址
vi /etc/docker/daemon.json # 修改daemon.json
# 添加以下内容,保存退出
{"insecure-registries":["服务器IP:5000"]}
# 此步用于让 docker信任私有仓库地址
# 5 重启docker服务
systemctl restart docker
5.2 镜像上传至私有仓库
# 1 重启私有仓库容器
docker start registry
# 2 标记上传镜像为私有仓库的镜像
docker tag 镜像id/镜像名 服务器IP:端口/镜像名:tag名
# eg: docker tag 5452fa6715c0 101.133.225.166:5000/django1.11.11
# 3 上传标记的镜像 到私有仓库
docker push 服务器IP:5000/镜像名
# 4 从私有仓库 拉取镜像
docker pull 服务器IP:5000/镜像名
6 docker-compose
6.1 介绍和使用
# 1 介绍
Docker Compose 通过一个单独的docker-compose.yml模板文件(YAML格式)
来定义一组相关联的应用容器,实现多个相关联的Docker容器的快速部署
是一个单机情况下容器编排的工具
是一个能一次性定义和管理多个Docker容器的工具
# 2 详细地说
Compose中定义和启动的每一个容器都相当于 一个服务(service)
Compose中能定义和启动多个服务,且它们之间通常具有协同关系
# 3 管理方式
使用YAML文件来配置定义多个容器 # .yml后缀文件 【2025新版 推荐compose.yaml】
# 默认名字docker-compose.yml
# 4 配置参数概述
Docker Compose File 顶级配置项:
version : # 指定Docker Compose File版本号 2025新版废弃,不需要指定
name: # 项目名,可选(推荐)
services: # 定义多个服务并配置启动参数
volumes : # 声明或创建在多个服务中共同使用的数据卷对象
networks: # 定义在多个服务中共同使用的网络对象
configs : # 声明将在本服务中要使用的一些配置文件
secrets : # 声明将在本服务中要使用的一些秘钥、密码文件
x-*** : # 自定义配置 主要用于复用相同的配置
# 5 强调
# 5.1 三个重要配置:service networks volumes
一个service代表一个container
这个container可以从docker hub的image来创建
或者从本地dockerfile build的image来创建
services的启动类似docker run
可以在services中的单个docker里 指定network和volume
也可以在顶级配置[networks、volumes]中 指定network和volume
# 5.2 版本
version:有1、2、3版本 # 目前都用"3"
# 6 安装
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
# 7 验证安装成功
docker-compose -v
# 8 docker-compose命令
docker compose [OPTIONS] [COMMAND]
Options
-f 指定compose文件的路径和名称
-p 指定project名称
-d 后台运行
# 启动管理容器 用 docker compose(V2,空格),废弃 docker-compose(V1,横线)
docker compose up # 创建并启动所有service容器
# 会自动搜索当前路径下的 docker-compose.yml文件
docker compose -f 指定文件 up
docker compose up -d # 后台执行
docker compose down # 停止,并移除所有容器、网络
docker compose stop # 停止容器,不会删除容器和镜像
docker compose ps # 查看所有启动的容器
docker compose logs # 查看指定容器的日志
docker compose top # 查看运行的进程
docker compose start # 启动yml文件管理的容器
docker compose restart # 重启yml文件管理的容器
docker-compose images # 查看docker-compose管理的镜像
docker-compose exec yml文件中写的service容器名 /bin/bash # 进入到容器内
6.2 docker-compose.yml 主要配置项
# docker-compose.yml 如何写
# 第一步:编写docker-compose.yml 主要配置项
# 指定版本
version: '3'
# 服务【即:容器】
services:
mysql: # 服务名字,是这个服务的标识
image: mysql:8 # 基于哪个镜像 本地没有 去docker hub拉取
container_name:mysql # 容器名字
ports: # 等同于 docker run -p
- 3307:3306
environment: # 等同于 docker run -e
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 1234
volumes: # 等同于 docker run -v
- /usr/local/app/mysql/conf:/etc/mysql/conf.d # 多个目录挂载 就在下面继续 - 宿主机目录:容器目录
- /usr/local/app/mysql/data:/var/lib/mysql
- /usr/local/app/mysql/init:/docker-entrypoint-initdb.d
networks: # 等同于 docker run --network
- tlias-net # 注意:指定的自定义网络的标识名
tlias:
build: # 通过宿主机上的Dockerfile文件构建的镜像 创建容器
context: . # Dockerfile文件的路径
dockerfile: Dockerfile # Dockerfile文件的名字
container-name:tlias-server
ports:
- 8080:8080
networks:
- tlias-net
depends-on: # 依赖关系:基于哪个服务,创建容器就会有先后顺序
- mysql
# 网络
networks:
tlias-net: # 自定义网络的标识名
name: itheima # 自定义网络名称
# 第二步:启动--运行
docker-compose up
6.3 案例--部署多应用
# compose.yaml(标准写法,无 version)
name: my-spa-project # 项目名,可选(推荐)
services:
# 前端:Nginx + Vue(你之前的 try_files 配置)
web:
image: nginx:alpine
build:
context: ./docker/nginx
dockerfile: Dockerfile
ports:
- "80:80"
- "443:443"
volumes:
- ./dist:/usr/share/nginx/html
- ./docker/nginx/conf.d:/etc/nginx/conf.d
depends_on:
- api
restart: unless-stopped
networks:
- frontend-net
# 后端 API(示例用 Node.js,可换成 Java/Python)
api:
image: node:18-alpine
working_dir: /app
volumes:
- ./api:/app
environment:
- NODE_ENV=production
- DB_HOST=db
- DB_USER=root
- DB_PASS=${DB_PASS} # 从 .env 读取
depends_on:
- db
restart: unless-stopped
networks:
- frontend-net
- backend-net
# 数据库 MySQL 8.0
db:
image: mysql:8.0
volumes:
- mysql-data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=${DB_PASS}
- MYSQL_DATABASE: app_db
restart: unless-stopped
networks:
- backend-net
# 网络定义(标准做法,分离前后端)
networks:
frontend-net:
backend-net:
# 数据卷(持久化,避免容器删除丢数据)
volumes:
mysql-data:
# eg:部署flask redis
# 1 创建Dockerfile
vim Dockerfile
FROM python:3.6
COPY . /app # 将当前文件夹 都拷贝在容器的 /app路径下
WORKDIR /app
RUN pip install flask redis
EXPOSE 5000
CMD [ "python", "app.py" ]
# 2 创建docker-compose文件
vim docker-compose.yml
version: "3"
services:
redis:
image: redis # image: 通过宿主机上(或远程仓库)的镜像 创建容器
web:
build: # build: 通过宿主机上的Dockerfile文件构建的镜像 创建容器
context: . # context: Dockerfile文件的路径
dockerfile: Dockerfile # dockerfile: Dockerfile文件的名字
ports: # 端口映射
- 8080:5000
environment: # 容器里 设置环境变量
REDIS_HOST: redis
# 3 创建app.py
vim app.py
from flask import Flask
from redis import Redis
import os
import socket
app = Flask(__name__)
redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)
@app.route('/')
def hello():
redis.incr('hits')
return '你好! 查看 %s 次, hostname 是 %s.\n' % (redis.get('hits'),socket.gethostname())
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000, debug=True)
# 4 启动--运行
docker-compose up
6.4 水平拓展
# 案例:把flask_redis项目扩展成三个
docker-compose up --help # 通过--help 查看参数
# --scale SERVICE=NUM # 将某个服务容器 设置成指定数量
docker-compose up --scale web=3 # 执行有问题,因为8080端口已经被映射了
### 实际解决办法:
1.删除原docker-compose.yml中web容器的port
2.再启动
docker-compose up --scale web=3
docker-compose start
docker-compose ps # 可以看到三个web启动了
### 3个web服务容器,可在前面加一个负载均衡器HAProxy
HAProxy和Nginx的区别?万能的百度
# 1.app.py 监听的端口由5000改为80
# 2.Dockerfile不需要改
# 3.修改docker-compose.yml
version: "3"
services:
redis:
image: redis
web:
build:
context: .
dockerfile: Dockerfile
environment:
REDIS_HOST: redis
lb: # 增加一个HAProxy的负载均衡器 load balance 缩写 lb
image: dockercloud/haproxy
links:
- web
ports:
- 8080:80
volumes:
- /var/run/docker.sock:/var/run/docker.sock
# 4.启动,从浏览器查看
docker-compose up
# 5.把web扩展为3个从浏览器查看
docker-compose up --scale web=3 -d
# 6.减掉为1个
docker-compose up --scale web=1 -d
7 网络
7.1 容器网络
### 容器网络
默认情况下,所有容器都是以bride【桥接:跟宿主机(docker0) 处于同一网段】连接到Docker的一个虚拟网桥上:
安装docker后,会自动增加一个docker0的网卡,且该网段的子网是 172.17.0.2-172.17.255.255 之间
容器之间,默认可以通过 该局域网相互通信
# 但实际情况中:
1.启动某个容器应用时,需要额外手动去查看,才知道到底分配到哪个具体的IP
2.容器应用间,若是写死配置 具体的IP【mysql容器的ip】,一旦容器挂掉,重新启动时,右需要额外改动Java容器
非常麻烦! ===》 采用容器的自定义网络

7.2 自定义网络
# 容器的自定义网络:
【原理】额外手动增加一个虚拟网卡,并将容器 加入到自定义网络中
此时容器间的通信就不再是 基于容器的IP地址去访问,
而是通过容器的名字【是唯一的】,底层会自动去找容器对应的IP,从而实现通信
# 自定义网络的命令
docker network 指令
.. create # 创建一个网络
.. ls # 查看所有网络
.. rm # 删除指定网络
.. inspect # 查看指定网络的详情信息
.. prune # 清除未使用的网络 # prune n.剪除、精简、修枝
.. connect # 使指定容器连接 加入某网络
.. disconnect # 使指定容器连接 离开某网络
# eg:
# 创建网络
docker network create itheima
# 网络 添加容器
docker network connect itheima mysql
# 也可在 创建容器时,添加到某网络
docker run -d --name myapp -p 8080:8080 --network itheima app:1.0
7.3 容器间通信
### 多个容器直接通信方式
# 方式1
端口映射到宿主机,直接访问宿主机ip + 端口
# 方式2
通过容器的ip地址 相互访问 # 很有局限性
# 方式3
run的时候指定 --link 容器 # 这个是单方向的
# eg:
docker run -di --name centos1 centos:centos7
docker run -di --name centos2 --link centos1 centos:centos7
进入到centos2中 ping centos1 # 可以ping通
# 方式4 自定义网络 + 容器名 【官方推荐】
docker network create itheima # 自定义网络
# eg: 创建两个容器,并添加到自定义的网络
docker network create itheima # 自定义网络
docker run -d --name myapp -p 8080:8080 --network itheima app:1.0
docker run -d --name mysql -p 3306:3306 --network itheima mysql:1.0
进入随意容器中 ping 容器名 # 相互都可以ping通
### 跨主机的容器通信
-端口映射 到宿主机 然后宿主机ip+端口访问
8 数据卷
http://www.liuqingzheng.top/linux/Docker/7-Docker之数据卷/
数据卷【volume】是一个虚拟目录,是 宿主机目录 与 容器内目录 之间映射的桥梁
### Docker挂载容器数据卷的方式
# 1.基于本地的Volume:
在容器创建或者run的时候,通过 -v指定,会自动创建数据卷【docker volume create ...】
形式一: -v 宿主机目录:容器内目录 # 自动会创建 匿名数据卷
形式二: -v 数据卷名称:容器内目录 # 自动会创建 有名字的数据卷
# 数据卷默认的存放位置:
宿主机中 /var/lib/docker/volumes/...
# 2.基于插件(plugin)的Volume:
插件方式,第三方方案,如NAS,aws
### volume的类型
1 受管理的data Volume,由docker后台自动创建(Data volume)
2 绑定挂载的Volume,具体挂载可以由用户指定 (Bind Mouting)
### 数据卷的命令
docker volume 指令
.. create # 创建数据卷
.. ls # 查看所有数据卷
.. rm # 删除指定数据卷
.. inspect # 查看指定数据卷的详情
.. prune # 清除所有未使用的数据卷 # prune n.剪除、精简、修枝
### Data volume 数据卷的持久性
# 1.启动一个mysql的容器
docker run -d --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
# 2.查看容器的数据卷
docker volume ls # 查看 刚刚创建容器的voluem
输出:DRIVER VOLUME NAME
local 007e5627b3...
local html
docker volume rm id号 # 删除volume
docker inspect id号 # 查看容器详细信息 可以看到mount到的本地某个位置
输出:
[
{
"CreatedAt":"2025-02-12T11:37:53+08:00",
"Mountpoint":"/var/lib/docker/volumes/html/_data",
"Name":"html",
...
}
]
# 3.再创建,也会创建一个volume
# 4.删除容器,volume是不会被删除的(数据不会丢)
### 数据卷验证及延伸
# 两个容器可以共用一个volume 挂载同样的宿主机文件夹目录
docker run -di -v mysql:/var/lib/mysql --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
docker run -di -v mysql:/var/lib/mysql --name mysql2 -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 mysql:5.7
# 进入到容器,创建一个数据库
# 停掉容器,删除容器
docker volume ls # volume文件还在
# 重新一个容器,使用该volume # -v 数据卷名称:容器内目录
docker run -di -v mysql:/var/lib/mysql --name=mysql3 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
# 进入到容器,看到数据库还在

浙公网安备 33010602011771号