[Docker] Docker命令手册

自己想折腾一下docker虚拟化技术,参照各路大神的博客和官方手册尝试一下在ubuntu 2204的wsl中搭建一个docker环境
dockerhub官网(镜像搜索)https://hub.docker.com/
官方安装脚本https://get.docker.com
MicroSoft: WSL 2 上的 Docker 远程容器入门: https://learn.microsoft.com/zh-cn/windows/wsl/tutorials/wsl-containers

DeepSeek修订(2025年10月28日09:52:00)
手动修订(2025年10月29日22:36:26)

01 介绍

Docker 是一个能将你的应用程序和它所有的依赖环境(如库、配置文件等)一起打包成一个独立的、轻量级的“容器”的工具。
这个容器可以在任何地方一键运行,彻底解决“在我电脑上没问题”的环境一致性问题。

02 安装

2.1 官方安装脚本

访问此处获取官方安装脚本: https://get.docker.com

其中提到:

# To install the latest stable versions of Docker CLI, Docker Engine, and their
# dependencies:
#
# 1. download the script
#
curl -fsSL https://get.docker.com -o install-docker.sh
#
# 2. verify the script's content
#
cat install-docker.sh
#
# 3. run the script with --dry-run to verify the steps it executes
#
sh install-docker.sh --dry-run
#
# 4. run the script either as root, or using sudo to perform the installation.
#
sudo sh install-docker.sh
#
# Command-line options

2.2 一键安装脚本

可以参考:[Mirror] LinuxMirrors: Linux 一键换源项目

执行以下命令可以直接安装:

bash <(curl -sSL https://linuxmirrors.cn/docker.sh)

2.3 Ubuntu手动安装案例

可参考: 博客园: 如何在 Ubuntu 22.04 LTS 中安装 Docker 和 Docker Compose

03 命令

3.1 docker 服务

3.1.1 服务启停

# 启动服务
sudo systemctl start docker
# 停止服务
sudo systemctl stop docker
# 开机启动
sudo systemctl enable docker
# 重启服务
sudo systemctl restart docker

3.1.2 服务代理

# 配置Docker服务使用代理
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf << EOF
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:8080"
Environment="HTTPS_PROXY=http://proxy.example.com:8080"
Environment="NO_PROXY=localhost,127.0.0.1,.example.com"
EOF

# 重新加载配置并重启Docker
sudo systemctl daemon-reload
sudo systemctl restart docker

# 验证代理配置
systemctl show --property=Environment docker

3.1.3 镜像加速(配置镜像站)

# 配置Docker镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json << EOF
{
  "registry-mirrors": [
    "https://registry.docker-cn.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com"
  ]
}
EOF

# 重启Docker服务
sudo systemctl daemon-reload
sudo systemctl restart docker

# 查看加速器配置
docker info | grep -A 10 "Registry Mirrors"

3.2 docker 镜像

3.2.1 镜像查看

# 查看本地所有镜像
docker images
# 查看本地所有镜像(包含中间镜像层)
docker images -a
# 按名称过滤查看镜像
docker images <image_name>
# 显示镜像ID(简洁格式)
docker images -q

3.2.2 镜像搜索与拉取

# 从Docker Hub搜索镜像
docker search <image_name>
# 拉取镜像(默认最新标签)
docker pull <image_name>
# 拉取指定标签的镜像
docker pull <image_name>:<tag>
# 拉取指定平台的镜像
docker pull --platform linux/amd64 <image_name>:<tag>

# 示例:
docker pull ubuntu:latest
docker pull nginx:1.23-alpine
docker pull python:3.9-slim

3.2.3 镜像构建

# 使用Dockerfile构建镜像
docker build -t <image_name>:<tag> <path_to_dockerfile>
# 使用当前目录的Dockerfile构建
docker build -t <image_name>:<tag> .
# 构建时指定Dockerfile路径
docker build -t <image_name>:<tag> -f /path/to/Dockerfile .
# 构建时不使用缓存
docker build --no-cache -t <image_name>:<tag> .
# 构建时传递构建参数
docker build --build-arg ENV=production -t <image_name>:<tag> .

# 示例:
docker build -t my-app:v1.0 .
docker build -t my-app:latest -f Dockerfile.prod .

3.2.4 镜像管理

# 删除镜像
docker rmi <image_id>
# 强制删除镜像(即使有容器使用)
docker rmi -f <image_id>
# 按名称删除镜像
docker rmi <image_name>:<tag>
# 删除所有镜像
docker rmi $(docker images -q)
# 删除悬空镜像(无标签)
docker image prune
# 删除所有未使用的镜像
docker image prune -a

3.2.5 镜像标签与推送

# 给镜像打标签
docker tag <source_image> <new_image>:<tag>
# 登录到镜像仓库
docker login
# 登录到指定镜像仓库
docker login registry.example.com
# 推送镜像到仓库
docker push <image_name>:<tag>
# 从镜像仓库登出
docker logout

# 示例:
docker tag my-app:latest my-registry.com/my-app:v1.0
docker push my-registry.com/my-app:v1.0

3.2.6 镜像导入导出

# 保存镜像为tar文件
docker save -o <output_file.tar> <image_name>:<tag>
# 从tar文件加载镜像
docker load -i <input_file.tar>
# 导出容器文件系统
docker export <container_id> > container.tar
# 从容器导出文件创建镜像
docker import container.tar <image_name>:<tag>

# 示例:
docker save -o my-app.tar my-app:latest
docker load -i my-app.tar

3.2.7 镜像检查与历史

# 查看镜像详细信息
docker inspect <image_name>:<tag>
# 查看镜像构建历史
docker history <image_name>:<tag>
# 查看镜像分层信息
docker image inspect <image_name>:<tag>

3.2.8 镜像清理

# 删除所有悬空镜像
docker image prune
# 删除所有未使用的镜像(包括未被容器引用的)
docker image prune -a
# 强制清理(不提示确认)
docker image prune -f

3.2.9 多架构镜像

# 创建多架构镜像列表
docker manifest create <image_name> <image1> <image2>
# 查看镜像支持的平台
docker manifest inspect <image_name>

3.2.10 实用示例

# 1. 构建并推送自定义镜像
docker build -t my-registry.com/my-app:v1.0 .
docker push my-registry.com/my-app:v1.0

# 2. 备份和恢复镜像
docker save -o backup.tar my-app:latest nginx:alpine
docker load -i backup.tar

# 3. 清理磁盘空间
docker image prune -a

# 4. 查看镜像详细信息
docker inspect ubuntu:20.04

# 5. 重命名镜像标签
docker tag old-name:tag new-name:tag
docker rmi old-name:tag

3.3 docker 容器

3.3.1 容器查看

# 查看正在运行的容器
docker ps
# 查看所有容器(包含停止的)
docker ps -a
# 查看最近创建的容器
docker ps -l
# 查看容器大小(磁盘占用)
docker ps -s
# 格式化输出容器信息
docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}"

3.3.2 容器生命周期管理

# 启动容器
docker start <container_id>
# 停止容器
docker stop <container_id>
# 重启容器
docker restart <container_id>
# 暂停容器
docker pause <container_id>
# 恢复暂停的容器
docker unpause <container_id>
# 强制停止容器
docker kill <container_id>

3.3.3 容器创建与运行

# 创建并启动容器(交互式)
docker run -it <image_name> /bin/bash
# 创建并启动容器(后台运行)
docker run -d --name <container_name> <image_name>
# 创建并启动容器(端口映射)
docker run -d -p 8080:80 <image_name>
# 创建并启动容器(数据卷挂载)
docker run -d -v /host/path:/container/path <image_name>
# 创建并启动容器(环境变量)
docker run -d -e ENV_VAR=value <image_name>
# 创建并启动容器(资源限制)
docker run -d --memory=512m --cpus=1.0 <image_name>
# 创建并启动容器(自动清理)
docker run -it --rm <image_name> /bin/bash
# 创建并启动容器(重启策略)
docker run -d --restart=always <image_name>
# 创建并启动容器(失败时重启)
docker run -d --restart=on-failure:5 <image_name>

3.3.4 容器删除

# 删除容器
docker rm <container_id>
# 强制删除运行中的容器
docker rm -f <container_id>
# 删除所有停止的容器
docker container prune
# 删除所有容器(包括运行中的)
docker rm -f $(docker ps -aq)

3.3.5 容器交互操作

# 进入容器(使用容器ID)
docker exec -it <container_id> /bin/bash
# 进入容器(使用容器名称)
docker exec -it <container_name> /bin/bash
# 在容器中执行命令(不进入交互模式)
docker exec <container_id> ls /app
# 连接到运行中容器的终端
docker attach <container_id>

3.3.6 文件复制操作

# 从容器复制文件到宿主机
docker cp <container_id>:/path/in/container /path/on/host
# 从宿主机复制文件到容器
docker cp /path/on/host <container_id>:/path/in/container
# 使用容器名称进行文件复制
docker cp <container_name>:/path/in/container /path/on/host

3.3.7 容器日志查看

# 查看容器日志
docker logs <container_id>
# 实时查看容器日志
docker logs -f <container_id>
# 查看最近N行日志
docker logs --tail=100 <container_id>
# 查看带时间戳的日志
docker logs -t <container_id>
# 查看从某个时间开始的日志
docker logs --since="2023-01-01" <container_id>

3.3.8 容器资源监控

# 查看容器资源使用情况
docker stats <container_id>
# 查看所有容器资源使用情况
docker stats
# 查看容器详细信息
docker inspect <container_id>
# 查看容器进程
docker top <container_id>
# 查看容器端口映射
docker port <container_id>

3.3.9 容器更新与配置

# 更新容器资源限制
docker update --memory=1g --cpus=2 <container_id>
# 更新容器重启策略
docker update --restart=unless-stopped <container_id>
# 重命名容器
docker rename <old_name> <new_name>
# 提交容器变更创建新镜像
docker commit <container_id> new_image_name:tag

3.3.10 实用示例

# 1. 运行Web应用容器
docker run -d --name my-web -p 80:80 -v /app/data:/var/www/html nginx

# 2. 运行数据库容器
docker run -d --name mysql-db -e MYSQL_ROOT_PASSWORD=pass -v db_data:/var/lib/mysql mysql:8.0

# 3. 开发环境容器
docker run -it --name dev-env -v $(pwd):/workspace -w /workspace node:16 bash

# 4. 容器备份和迁移
docker export my-container > container.tar
docker import container.tar my-backup:latest

# 5. 容器调试和诊断
docker exec -it my-container bash
docker logs -f my-container
docker inspect my-container

3.4 docker 网络

3.4.1 网络查看

# 查看所有Docker网络
docker network ls
# 查看网络详细信息
docker network inspect <network_name>
# 查看特定网络的详细信息
docker network inspect <network_id>
# 查看网络使用情况
docker network ls --filter driver=bridge

3.4.2 网络创建

# 创建自定义网络(默认bridge驱动)
docker network create <network_name>
# 创建指定驱动类型的网络
docker network create -d <driver> <network_name>
# 创建带子网的自定义网络
docker network create --subnet=172.20.0.0/16 <network_name>
# 创建带网关的网络
docker network create --subnet=172.20.0.0/16 --gateway=172.20.0.1 <network_name>
# 创建带IP范围的可分配网络
docker network create --subnet=172.20.0.0/16 --ip-range=172.20.1.0/24 <network_name>
# 创建内部网络(不连接到宿主机)
docker network create --internal <network_name>
# 创建带标签的网络
docker network create --label env=production <network_name>

# 示例:
docker network create my-network
docker network create -d bridge --subnet=192.168.100.0/24 my-bridge
docker network create --internal internal-network

3.4.3 网络连接管理

# 连接容器到网络
docker network connect <network_name> <container_id>
# 连接容器到网络并指定IP地址
docker network connect --ip 172.20.0.10 <network_name> <container_id>
# 连接容器到网络并设置别名
docker network connect --alias db <network_name> <container_id>
# 断开容器与网络的连接
docker network disconnect <network_name> <container_id>
# 强制断开网络连接
docker network disconnect -f <network_name> <container_id>

3.4.4 容器网络配置

# 运行容器并连接到指定网络
docker run -d --network <network_name> --name <container_name> <image_name>
# 运行容器并连接到多个网络
docker run -d --network network1 --network network2 --name <container_name> <image_name>
# 运行容器时设置网络别名
docker run -d --network <network_name> --network-alias web <image_name>
# 运行容器时指定IP地址
docker run -d --network <network_name> --ip 172.20.0.100 <image_name>
# 运行容器使用host网络模式
docker run -d --network host --name <container_name> <image_name>
# 运行容器使用none网络模式(无网络)
docker run -d --network none --name <container_name> <image_name>
# 运行容器使用容器网络模式(共享其他容器的网络栈)
docker run -d --network container:<other_container_id> --name <container_name> <image_name>
# 运行容器时自定义DNS
docker run -d --dns 8.8.8.8 --dns 8.8.4.4 <image_name>
# 运行容器时添加主机名映射
docker run -d --add-host database:192.168.1.100 <image_name>

# 示例:
docker run -d --network my-network --name web nginx
docker run -d --network my-network --network-alias database --name db postgres

3.4.5 网络驱动类型

# 创建 bridge 网络(默认)
docker network create -d bridge my-bridge
# 创建 overlay 网络(用于Swarm集群)
docker network create -d overlay my-overlay
# 创建 macvlan 网络
docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth0 my-macvlan
# 创建 ipvlan 网络
docker network create -d ipvlan --subnet=192.168.1.0/24 -o parent=eth0 my-ipvlan
# 使用 host 网络(直接使用宿主机网络)
# 注意:host网络不需要创建,直接使用 --network=host
# 使用 none 网络(无网络连接)
# 注意:none网络不需要创建,直接使用 --network=none

3.4.6 网络过滤和查询

# 按名称过滤网络
docker network ls --filter name=<network_name>
# 按驱动类型过滤网络
docker network ls --filter driver=bridge
# 按标签过滤网络
docker network ls --filter label=env=production
# 按ID过滤网络
docker network ls --filter id=<network_id>
# 查看特定容器的网络信息
docker inspect <container_id> | grep -A 10 "Networks"

3.4.7 网络管理

# 删除网络
docker network rm <network_name>
# 强制删除网络(即使有容器连接)
docker network rm -f <network_name>
# 删除所有未使用的网络
docker network prune
# 强制删除所有未使用的网络(不提示确认)
docker network prune -f
# 清理所有未使用的网络、容器、镜像和构建缓存
docker system prune

3.4.8 网络诊断

# 查看容器网络配置
docker exec <container_id> ip addr
docker exec <container_id> ip route
# 查看容器DNS配置
docker exec <container_id> cat /etc/hosts
docker exec <container_id> cat /etc/resolv.conf
# 测试容器网络连通性
docker exec <container_id> ping <other_container_ip>
docker exec <container_id> nslookup <container_name>
# 查看端口映射
docker port <container_id>
# 跟踪网络请求
docker exec <container_id> traceroute google.com

3.4.9 实用示例

# 1. 创建应用网络并运行多个容器
docker network create app-network
docker run -d --network app-network --name backend api:latest
docker run -d --network app-network --name frontend nginx:latest
docker run -d --network app-network --name database postgres:13

# 2. 多网络配置
docker network create public-net
docker network create private-net
docker run -d --network public-net --name web nginx
docker network connect private-net web

# 3. 自定义子网配置
docker network create \
  --driver=bridge \
  --subnet=172.28.0.0/16 \
  --ip-range=172.28.5.0/24 \
  --gateway=172.28.5.254 \
  my-custom-network

# 4. 微服务网络架构
docker network create backend-net
docker network create frontend-net
docker run -d --network backend-net --name user-service user-service:latest
docker run -d --network backend-net --name order-service order-service:latest
docker run -d --network frontend-net --network backend-net --name api-gateway api-gateway:latest

# 5. 数据库隔离网络
docker network create --internal db-network
docker run -d --network db-network --name mysql -e MYSQL_ROOT_PASSWORD=pass mysql:8.0
# 应用容器连接到两个网络
docker network create app-network
docker run -d --network app-network --name app my-app:latest
docker network connect db-network app

3.4.10 网络测试与验证

# 测试容器间通信
docker exec -it backend ping database
docker exec -it frontend curl http://backend:8080

# 验证网络配置
docker network inspect app-network
docker exec app cat /etc/hosts

# 检查网络连通性
docker exec app ping 8.8.8.8
docker exec app curl -I https://www.google.com

# 查看网络统计信息
docker network ls
docker network inspect app-network | grep -A 5 "Containers"

3.5 Docker 数据卷管理

3.5.1 卷查看与检查

# 查看所有数据卷
docker volume ls
# 查看数据卷详细信息
docker volume inspect <volume_name>
# 查看特定数据卷的详细信息
docker volume inspect <volume_id>
# 按名称过滤数据卷
docker volume ls --filter name=<volume_name>
# 查看悬空数据卷(未被任何容器使用)
docker volume ls --filter dangling=true
# 查看驱动类型过滤
docker volume ls --filter driver=local

3.5.2 卷创建与管理

# 创建数据卷
docker volume create <volume_name>
# 创建带标签的数据卷
docker volume create --label env=production <volume_name>
# 创建指定驱动类型的数据卷
docker volume create --driver local <volume_name>
# 创建带选项的数据卷(指定设备)
docker volume create --driver local --opt type=none --opt device=/path/on/host --opt o=bind <volume_name>
# 创建带选项的数据卷(指定文件系统)
docker volume create --driver local --opt type=tmpfs --opt device=tmpfs --opt o=size=100m <volume_name>
# 删除数据卷
docker volume rm <volume_name>
# 强制删除数据卷
docker volume rm -f <volume_name>
# 删除所有未使用的数据卷
docker volume prune
# 强制删除所有未使用的数据卷(不提示确认)
docker volume prune -f

# 示例:
docker volume create db-data
docker volume create --label app=webapp web-storage
docker volume create --driver local --opt type=tmpfs --opt device=tmpfs --opt o=size=200m temp-cache

3.5.3 容器卷挂载

# 运行容器并挂载数据卷(匿名卷)
docker run -d -v /container/path <image_name>
# 运行容器并挂载命名卷
docker run -d -v <volume_name>:/container/path <image_name>
# 运行容器并挂载绑定挂载(主机目录)
docker run -d -v /host/path:/container/path <image_name>
# 运行容器并挂载绑定挂载(只读)
docker run -d -v /host/path:/container/path:ro <image_name>
# 运行容器并挂载绑定挂载(读写)
docker run -d -v /host/path:/container/path:rw <image_name>
# 运行容器使用--mount参数(推荐)
docker run -d --mount type=bind,source=/host/path,target=/container/path <image_name>
# 运行容器使用--mount挂载卷
docker run -d --mount type=volume,source=<volume_name>,target=/container/path <image_name>
# 运行容器使用--mount挂载tmpfs
docker run -d --mount type=tmpfs,target=/container/path <image_name>

# 示例:
docker run -d -v mysql-data:/var/lib/mysql mysql:8.0
docker run -d -v /home/user/app:/app:ro nginx
docker run -d --mount type=volume,source=web-data,target=/usr/share/nginx/html nginx

3.5.4 挂载类型详解

# 1. 命名卷(Named Volumes)
docker volume create app-data
docker run -d -v app-data:/app/data <image_name>

# 2. 绑定挂载(Bind Mounts)
docker run -d -v /host/absolute/path:/container/path <image_name>
docker run -d -v $(pwd)/relative/path:/container/path <image_name>

# 3. tmpfs挂载(内存文件系统)
docker run -d --tmpfs /container/path <image_name>
docker run -d --mount type=tmpfs,destination=/container/path,tmpfs-size=100m <image_name>

# 4. 只读挂载
docker run -d -v /host/path:/container/path:ro <image_name>
docker run -d --mount type=bind,source=/host/path,target=/container/path,readonly <image_name>

# 5. 共享挂载(多个容器共享同一卷)
docker run -d -v shared-data:/data --name container1 <image_name>
docker run -d -v shared-data:/data --name container2 <image_name>

3.5.5 卷驱动与选项

# 使用本地驱动创建卷
docker volume create --driver local <volume_name>
# 使用本地驱动并指定设备
docker volume create --driver local --opt type=none --opt device=/host/path --opt o=bind <volume_name>
# 创建tmpfs卷
docker volume create --driver local --opt type=tmpfs --opt device=tmpfs --opt o=size=100m <volume_name>
# 创建带权限的卷
docker volume create --driver local --opt type=none --opt device=/host/path --opt o=bind,uid=1000,gid=1000 <volume_name>
# 创建带大小限制的卷
docker volume create --driver local --opt o=size=100m --opt type=tmpfs <volume_name>

# 示例:
docker volume create --driver local --opt type=none --opt device=/mnt/ssd --opt o=bind ssd-volume
docker volume create --driver local --opt type=tmpfs --opt device=tmpfs --opt o=size=500m memory-volume

3.5.6 卷操作与维护

# 备份数据卷到tar文件
docker run --rm -v <volume_name>:/volume -v $(pwd):/backup alpine tar cvf /backup/backup.tar -C /volume ./
# 从tar文件恢复数据卷
docker run --rm -v <volume_name>:/volume -v $(pwd):/backup alpine tar xvf /backup/backup.tar -C /volume
# 复制数据卷内容到另一个卷
docker run --rm -v <source_volume>:/source -v <target_volume>:/target alpine cp -r /source/* /target/
# 查看数据卷使用情况
docker system df -v
# 检查卷内容
docker run --rm -v <volume_name>:/volume alpine ls -la /volume
# 清理卷内容(不删除卷)
docker run --rm -v <volume_name>:/volume alpine rm -rf /volume/*

# 示例:
docker run --rm -v mysql-data:/dbdata -v $(pwd):/backup alpine tar czf /backup/mysql-backup.tar.gz -C /dbdata ./
docker run --rm -v mysql-data:/dbdata -v $(pwd):/backup alpine tar xzf /backup/mysql-backup.tar.gz -C /dbdata

3.5.7 高级挂载选项

# 挂载时设置文件权限
docker run -d -v /host/path:/container/path:z <image_name>  # SELinux共享标签
docker run -d -v /host/path:/container/path:Z <image_name>  # SELinux私有标签
# 挂载时设置传播模式
docker run -d -v /host/path:/container/path:shared <image_name>
docker run -d -v /host/path:/container/path:slave <image_name>
docker run -d -v /host/path:/container/path:private <image_name>
# 使用--mount的完整语法
docker run -d --mount type=bind,source=/host/path,target=/container/path,readonly,bind-propagation=shared <image_name>
# 挂载单个文件
docker run -d -v /host/config.json:/app/config.json <image_name>
docker run -d --mount type=bind,source=/host/config.json,target=/app/config.json <image_name>

3.5.8 实用示例

# 1. 数据库数据持久化
docker volume create mysql-data
docker run -d \
  --name mysql \
  -v mysql-data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=password \
  mysql:8.0

# 2. Web应用静态文件
docker volume create static-files
docker run -d \
  --name nginx \
  -v static-files:/usr/share/nginx/html \
  -p 80:80 \
  nginx

# 3. 开发环境代码挂载
docker run -d \
  --name dev-app \
  -v $(pwd)/src:/app/src \
  -v $(pwd)/config:/app/config:ro \
  -p 3000:3000 \
  node:16

# 4. 多容器共享配置
docker volume create app-config
docker run -d \
  --name service1 \
  -v app-config:/etc/app \
  my-app:latest

docker run -d \
  --name service2 \
  -v app-config:/etc/app \
  my-app:latest

# 5. 备份与恢复工作流
# 备份
docker run --rm \
  -v mysql-data:/source \
  -v $(pwd)/backups:/backup \
  alpine tar czf /backup/mysql-$(date +%Y%m%d).tar.gz -C /source ./

# 恢复
docker run --rm \
  -v mysql-data:/target \
  -v $(pwd)/backups:/backup \
  alpine tar xzf /backup/mysql-backup.tar.gz -C /target

3.5.9 卷挂载最佳实践

# 生产环境数据库
docker volume create --label env=production postgres-data
docker run -d \
  --name postgres \
  -v postgres-data:/var/lib/postgresql/data \
  -e POSTGRES_PASSWORD=securepassword \
  postgres:13

# 开发环境热重载
docker run -d \
  --name dev-server \
  -v $(pwd)/code:/app \
  -v /app/node_modules \  # 匿名卷,避免覆盖node_modules
  -p 3000:3000 \
  node:16 npm run dev

# 配置文件管理
docker volume create app-config
docker run --rm -v app-config:/config alpine sh -c "echo 'config content' > /config/app.conf"
docker run -d \
  --name app \
  -v app-config:/etc/app:ro \
  my-app:latest

# 日志文件持久化
docker volume create app-logs
docker run -d \
  --name app \
  -v app-logs:/var/log/app \
  my-app:latest

3.5.10 卷故障排查

# 检查卷挂载状态
docker inspect <container_id> | grep -A 10 "Mounts"
# 查看卷内容
docker run --rm -v <volume_name>:/volume alpine ls -la /volume
# 检查卷权限
docker run --rm -v <volume_name>:/volume alpine ls -ld /volume
# 测试卷读写
docker run --rm -v <volume_name>:/volume alpine touch /volume/test.txt
docker run --rm -v <volume_name>:/volume alpine rm /volume/test.txt
# 查看卷驱动信息
docker volume inspect <volume_name> | grep -A 5 "Driver"
# 检查绑定挂载的主机路径
docker inspect <container_id> | grep -B 5 -A 5 "Source"
# 验证挂载传播
docker exec <container_id> mount | grep <mount_point>

3.5.11 Docker Compose 卷示例

# docker-compose.yml 示例
version: '3.8'
services:
  web:
    image: nginx:latest
    volumes:
      - web-data:/usr/share/nginx/html
      - ./config/nginx.conf:/etc/nginx/nginx.conf:ro
      - logs:/var/log/nginx
    ports:
      - "80:80"
  
  database:
    image: postgres:13
    volumes:
      - db-data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: password

volumes:
  web-data:
    driver: local
  db-data:
    driver: local
  logs:
    driver: local
posted on 2025-04-16 00:08  风惊庭前叶  阅读(27)  评论(0)    收藏  举报