Docker Compose 挂载 NFS 与 SMB 共享目录

前置要求

宿主机必须安装对应客户端工具,否则Docker驱动无法识别文件系统类型。

# Debian / Ubuntu
apt-get update && apt-get install -y nfs-common cifs-utils

# CentOS / RHEL / Rocky
yum install -y nfs-utils cifs-utils

NFS挂载配置

volumes:
  nfs_mount:
    driver_opts:
      type: "nfs"
      o: "addr=<NFS服务器IP>,nolock,rw"
      device: ":/<远程路径>"

字段说明

字段含义
type文件系统类型,固定填nfs
device远程路径,:后是NFS导出的目录
o挂载参数

常用挂载选项

选项作用
addr=NFS服务器地址
nolock建议加,NFSv3在容器内锁文件易出问题,可避免文件锁卡死
rw读写权限
nfsvers=4强制使用NFSv4
proto=tcp强制走TCP

示例

volumes:
  nfs_mount:
    driver_opts:
      type: "nfs"
      o: "addr=192.168.0.214,nolock,rw,nfsvers=4,proto=tcp"
      device: ":/E/share"

SMB / CIFS挂载配置

volumes:
  smb_mount:
    driver: local
    driver_opts:
      type: "cifs"
      o: "username=<SMB用户名>,password=<SMB密码>,file_mode=0755,dir_mode=0755,uid=101,gid=101"
      device: "//<服务器IP>/<共享路径>"

字段说明

字段含义
driver卷驱动,固定填local
type文件系统类型,固定填cifs
deviceSMB共享路径,用正斜杠
o挂载参数

常用挂载选项

选项作用
username= / password=SMB凭据
file_mode=0755 / dir_mode=0755新文件/目录的默认权限
uid=101 / gid=101文件属主映射到容器内UID/GID(需与容器内进程一致)
vers=3.0强制SMB协议版本
domain=Windows AD域用户登录时填写域名

查看进程UID/GID
在容器内执行以下命令

95ede727b666:/var/www/html# id nginx
uid=101(nginx) gid=101(nginx) groups=101(nginx),82(www-data),101(nginx)

示例

volumes:
  smb_mount:
    driver: local
    driver_opts:
      type: "cifs"
      o: "username=<SMB用户名>,password=<SMB密码>,file_mode=0755,dir_mode=0755,uid=101,gid=101"
      device: "//192.168.0.3/share/backup"

完整 docker-compose.yml 示例

services:
  db:
    image: mariadb:lts
    command: --transaction-isolation=READ-COMMITTED
    restart: always
    volumes:
      - "./db:/var/lib/mysql"
    environment:
      - MYSQL_ROOT_PASSWORD=<数据库密码>
      - MARIADB_AUTO_UPGRADE=1
      - MARIADB_DISABLE_UPGRADE_BACKUP=1
    env_file:
      - db.env

  app:
    image: kodcloud/kodbox
    restart: always
    ports:
      - "81:80"
    volumes:
      - "./site:/var/www/html"
      - nfs_mount:/mnt/nfs
      - smb_mount:/mnt/smb
    environment:
      - MYSQL_HOST=db
      - REDIS_HOST=redis
    env_file:
      - db.env
    depends_on:
      - db
      - redis

  redis:
    image: redis:alpine
    restart: always

volumes:
  nfs_mount:
    driver_opts:
      type: "nfs"
      o: "addr=192.168.0.214,nolock,rw,nfsvers=4,proto=tcp"
      device: ":/E/share"

  smb_mount:
    driver: local
    driver_opts:
      type: "cifs"
      o: "username=<SMB用户名>,password=<SMB密码>,file_mode=0755,dir_mode=0755,uid=101,gid=101"
      device: "//192.168.0.3/share/backup"

标签: none