使用Docker-compose本地装载AWS EFS

6fe3ivhb  于 2023-03-01  发布在  Docker
关注(0)|答案(3)|浏览(185)

我想知道是否有一个简单的方法来利用亚马逊EFS(弹性文件系统)被挂载为一个卷在一个本地码头组成设置。
原因是对于本地开发,创建的卷会保存在我的笔记本电脑上-如果我更换机器,我无法访问任何底层数据。云NFS将解决这个问题,因为它随时可以从任何地方获得。
AWS文档(https://docs.aws.amazon.com/efs/latest/ug/efs-onpremises.html)似乎建议使用AWS Direct Connect/VPN-是否有办法通过在侦听所有IP地址的安全组中打开端口2049(NFS流量)并将该安全组应用于新创建的EFS来避免这种情况?
下面是我的docker-compose. yml:

version: "3.2"
 
services:
  postgres_db:
    container_name: "postgres"
    image: "postgres:13"
    ports:
      - 5432:5432
    volumes:
      - type: volume
        source: postgres_data
        target: /var/lib/postgresql/data
        volume:
          nocopy: true
    environment: 
      POSTGRES_USER: 'admin'
      POSTGRES_PASSWORD: "password"
 
volumes: 
  postgres_data:
    driver_opts:
      type: "nfs"
      o: "addr=xxx.xx.xx.xx,nolock,soft,rw"
      device: ":/docker/example"

我收到以下错误:

ERROR: for postgres_db  Cannot start service postgres_db: error while mounting volume '/var/lib/docker/volumes/flowstate_example/_data': failed to mount local volume: mount :/docker/example:/var/lib/docker/volumes/flowstate_example/_data, data: addr=xxx.xx.xx.xx,nolock,soft: connection refused

我认为这是因为我的笔记本电脑连接不是AWS EFS VPC的一部分,因此无法挂载EFS。
对于添加的上下文,我希望停靠一个Web抓取设置,并将数据量持久化在云中,这样我就可以从任何地方连接到它。

3pmvbmvn

3pmvbmvn1#

EFS假定nfs 4,因此:

version: '3.8'

services:

  postgres:
    volumes:
      postgres_data:/var/lib/postgresql/data

volumes: 

  postgres_data:
    driver_opts:
      type: "nfs4"
      o: "addr=xxx.xx.xx.xx,nolock,soft,rw"
      device: ":/docker/postgres_data"

当然,引用的nfs-export/path必须存在,Swarm不会自动创建不存在的文件夹。
在重新创建堆栈之前,请确保手动删除所有具有此错误类型/名称的旧Docker卷(在所有群节点上!):

docker volume rm $(docker volume ls -f name=postgres_data -q)

了解这一点很重要:Docker NFS卷实际上只是声明在哪里可以找到数据。当您更新docker-composite.yml时,它不会更新,因此您必须删除该卷,以便显示任何新配置
参见输出

docker service ps stack_postgres --no-trunc

有关卷无法装入的原因的详细信息
此外,请确保您可以通过mount -t nfs4 ...挂载nfs-export
参见showmount -e your.efs.ip.address

6ss1mwsb

6ss1mwsb2#

volumes:
  nginx_test_vol:
    driver_opts:
      type: "nfs"
      o: "addr=fs-xxxxxxxxxxxxxxxxxx.efs.us-east-1.amazonaws.com,rw,nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport"
      device: ":/nginx-test"

这让我用得很好

5rgfhyps

5rgfhyps3#

简而言之,答案是否定的,如果没有VPN或端口重定向,就不可能在本地计算机或在AWS VPC之外运行的任何东西上挂载EFS卷:EFS使用子网CIDR范围内的专用IP,它没有公用IP,并且它的DNS是内部DNS,无法从Internet解析。
如果可以的话,您可以使用S3(我能想到的第一个警告:没有UNIX许可)。
在Linux上,s3fs是一个可靠的选项。
安装和挂载后,您可以将其用作部署中的卷,就像任何其他目录一样,您还可以将其自动化,如here所示,方法是将s3fs作为容器运行,并将其挂载到辅助容器中(如果您希望直接访问文件,则可以在本地挂载):
.env文件中,将您的授权设置为S3:

AWS_S3_BUCKET=
AWS_S3_ACCESS_KEY_ID=
AWS_S3_SECRET_ACCESS_KEY=

然后转换为docker-compose.yaml

version: '3.8'

services:
  s3fs:
    privileged: true
    image: efrecon/s3fs:1.90
    restart: unless-stopped
    env_file: .env
    volumes:
      # This also mounts the S3 bucket to `/mnt/s3data` on the host machine
      - /mnt/s3data:/opt/s3fs/bucket:shared

  test:
    image: bash:latest
    restart: unless-stopped
    depends_on:
      - s3fs
    # Just so this container won't die and you can test the bucket from within
    command: sleep infinity
    volumes:
      - /mnt/s3data:/data:shared

相关问题