Inhaltsverzeichnis

Docker volumes by examples

Start mysql with docker volumes

# hostpath bind mount
docker run --name mysql-db \
  -v $(pwd)/datadir:/var/lib/mysql
  -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:8.4.9
 
docker stop mysql.db
docker rm mysql-db
 
# or docker managed volume /var/lib/docker/volumes
docker volume create mysql-data
docker run --name mysql-db \
  -v mysql-data:/var/lib/mysql
  -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:8.4.9

NFS

Install NFS kernel server

sudo apt update
sudo apt install -y nfs-kernel-server
 
# Create the export directory
sudo mkdir -p /exports/shared
sudo chown nobody:nogroup /exports/shared
sudo chmod 755 /exports/shared
 
# add this to /etc/exports
sudo vi /etc/exports
/exports/shared    192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)
 
 
# Export the shares
sudo exportfs -ra
 
# Start and enable NFS server
sudo systemctl enable nfs-kernel-server
sudo systemctl start nfs-kernel-server
 
# Verify exports
sudo exportfs -v

Create docker volume with a NFS Share:

docker volume create \
  --driver local \
  --opt type=nfs \
  --opt o=addr=192.168.1.100,rw,nfsvers=4.1 \
  --opt device=:/exports/shared \
  shared-data

Use volume inside docker-compose service:

mkdir -p web
cd web
cat >docker-compose.yml <<EOF
services:
  app:
    image: nginx:alphine
    volumes:
      - shared-data:/usr/share/nginx/html
    deploy:
      replicas: 3
 
  processor:
    image: python:3.11-slim
    volumes:
      - shared-data:/data
    command: python -c "while True: pass"
 
volumes:
  shared-data:
    driver: local
    driver_opts:
      type: nfs
      o: addr=192.168.1.100,rw,nfsvers=4.1,soft,timeo=300
      device: ":/exports/shared"
EOF
docker compose uo -d
# access service with curlimages/curl many times
docker run --rm --network default-web curlimages/curl curl -s app
...
# check logs
 
# down
docker compose down

Use nfs share with docker –mount directly:

docker run -d \
  --name web \
  --mount type=volume,volume-driver=local,\
volume-opt=type=nfs,\
volume-opt=o=addr=192.168.1.100,\
volume-opt=device=:/exports/shared,\
dst=/usr/share/nginx/html \
  nginx:alpine