Docker: change folder where to store docker volumes

前端 未结 2 1650
花落未央
花落未央 2020-12-09 20:46

On my Ubuntu EC2 I host an application using docker containers. db data and upload data is being stored in volumes CaseBook-data

相关标签:
2条回答
  • 2020-12-09 21:01

    Another way with build-in driver local:

    docker volume create --opt type=none --opt device=/home/ubuntu/data/ --opt o=bind data_db
    

    (This use DimonVersace example with: data_db declared as external named volume in docker-compose and /home/ubuntu/data/ as the folder on the host machine)

    0 讨论(0)
  • 2020-12-09 21:16

    Named volumes will be stored inside docker's folder (/var/lib/docker). If you want to create a volume in a specific host folder, use a host volume with the following syntax:

    docker run -v /home/ubuntu/data/app-data:/app-data my-image
    

    Or from your compose file:

    version: '2'
    services:
        mongo:
            container_name: "CaseBook-db"
            restart: always
            image: mongo:3.2.7
            ports:
                - "27017"
            volumes:
                - /home/ubuntu/data/db:/data/db
            labels:
                - "ENVIRONMENT_TYPE=meteor"
    
        app:
            container_name: "CaseBook-app"
            restart: always
            image: "meteor/casebook"
            build: .
            depends_on:
                - mongo
            environment:
                - MONGO_URL=mongodb://mongo:27017/CaseBook
            ports:
                - "80:3000"
            volumes:
                - /home/ubuntu/data/uploads:/Meteor-CaseBook-Container/.uploads
            labels:
                - "ENVIRONMENT_TYPE=meteor"
    

    With host volumes, any contents of the volume inside the image will be overlaid with the exact contents of the host folder, including UID's of the host folder. An empty host folder is not initialized from the image the way an empty named volume is. UID mappings tend to be the most difficult part of using a host volume.


    Edit: from the comments below, if you need a named volume that acts as a host volume, there is a local persist volume plugin that's listed on docker's plugin list. After installing the plugin, you can create volumes that point to host folders, with the feature that even after removing the named volume, the host directory is left behind. Sample usage from the plugin includes:

    docker volume create -d local-persist -o mountpoint=/data/images --name=images
    docker run -d -v images:/path/to/images/on/one/ one
    docker run -d -v images:/path/to/images/on/two/ two
    

    They also include a v2 compose file with the following volume example:

    volumes:
      data:
        driver: local-persist
        driver_opts:
          mountpoint: /data/local-persist/data
    

    One additional option that I've been made aware of in the past month is to use the local volume driver's mount options to manually create a bind mount. This is similar to a host volume in docker with the following differences:

    • If the directory doesn't exist, trying to start a container with a named volume pointing to a bind mount will fail. With host volumes, docker will initialize it to an empty directory owned by root.
    • If the directory is empty, a named volume will initialize the bind mount with the contents of the image at the mount location, including file and directory ownership/permissions. With a host volume, there is no initialization of the host directory contents.

    To create a named volume as a bind mount, you can create it in advance with:

    docker volume create --driver local \
      --opt type=none \
      --opt device=/home/user/test \
      --opt o=bind \
      test_vol
    

    From a docker run command, this can be done with --mount:

    docker run -it --rm \
        --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=/home/user/test \
        foo
    

    Or in a compose file, you can create the named volume with:

    volumes:
      data:
        driver: local
        driver_opts:
          type: none
          o: bind 
          device: /home/user/test 
    

    My preference would be to use the named volume with the local driver instead of the local-persist 3rd party driver if you need the named volume features.

    0 讨论(0)
提交回复
热议问题