【问题标题】:Docker daemon crashes on EC2 instanceDocker 守护进程在 EC2 实例上崩溃
【发布时间】:2019-07-19 23:41:47
【问题描述】:

因此,我正在更新 cloudformation 模板,以便它使用针对 ECS 优化的 Amazon Linux 2 AMI [amzn2-ami-ecs-hvm-2.0.20190709-x86_64-ebs (ami-0fac5486e4cff37f4)]。以前我使用的是 ami-00129b193dc81bc31,它是一个 Amazon Linux 1 容器。

我最初发现,简单地更换 AMI 意味着 EC2 实例不再加入我的 ECS 集群。经过大量挖掘(确保权限、子网、VPC、IAM 都正常),我发现 docker 守护进程正在崩溃。原因可以追溯到我对用户数据所做的事情。我把它贴在下面:

        "UserData": { "Fn::Base64" : { "Fn::Join" : ["", [
          "Content-Type: multipart/mixed; boundary=\"==BOUNDARY==\"\n",
          "MIME-Version: 1.0\n",
          "--==BOUNDARY==\n",
          "Content-Type: text/cloud-boothook; charset=\"us-ascii\"\n",
          "#!/bin/bash\n",
          "# Set Docker daemon options\n",
          "cloud-init-per once docker_debug echo 'OPTIONS=\"${OPTIONS} --storage-opt dm.basesize=10G\"' >> /etc/sysconfig/docker\n",
          "--==BOUNDARY==\n",
          "Content-Type: text/x-shellscript; charset=\"us-ascii\"\n",
          "#!/bin/bash -xe\n",
          "echo \"ECS_CLUSTER=",
          { "Ref" : "NovaProductionEcsCluster"},
          "\" >> /etc/ecs/ecs.config\n",
          "sudo mkdir /efs\n",
          "sudo mkdir /efs/nova_files\n",
          "sudo useradd -u 33 www-data\n",
          "sudo chown -R www-data /efs/nova_files/\n",
          "printf \"\nfunction novarun {\n docker exec -ti \\\"\\$(docker ps -qf name=ApacheTask)\\\" \\\"\\$([ \\$# -ne 1 ] && echo \\\"bash\\\" || echo \\\"\\$1\\\")\\\" \n}\n\" >> /home/ec2-user/.bashrc\n",
          "--==BOUNDARY==--"
        ]]}}
      }

基本上,这结合了这个 (https://docs.aws.amazon.com/AmazonECS/latest/developerguide/bootstrap_container_instance.html) 和这个 (https://aws.amazon.com/premiumsupport/knowledge-center/increase-default-ecs-docker-limit/) 以增加 docker 容器可用的磁盘空间。这与旧 AMI 完美配合,但是当我运行 docker ps -a 时,新 AMI 给了我Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?。

如果我运行sudo journalctl -u docker 得到错误Error starting daemon: error initializing graphdriver: overlay2: unknown option dm.basesize。

谁能告诉我这种方法出了什么问题?有没有办法用 ECS 修复这个标志,或者用其他方法来扩大 docker 映像可用的磁盘空间量?

谢谢

【问题讨论】:

    标签: amazon-web-services docker amazon-ecs


    【解决方案1】:

    您可以完全删除该 Docker 配置行;您的(较新的)Docker 守护程序可以使用安装在/var/lib/docker 上的任何分区中的所有可用空间。

    Docker 可以使用多种不同的系统 (storage drivers) 来存储映像和容器数据。最初 Docker 使用devicemapper——您可以选择的“dm”——它不需要特殊的 Linux 内核支持,但确实为所有 Docker 内容分配了固定大小的存储空间。 (Devicemapper 也很慢而且有一点问题;使用它的更好方法是给它一个专用的磁盘分区,而不仅仅是一个文件。)大多数较新的 Docker 安装使用overlay2,这确实需要特殊的内核支持,但现在这也是相当主流,overlay2避免了devicemapper的大部分问题。

    简而言之:

    1. 较新的 AMI 具有较新的 Docker 和较新的内核。
    2. 您的新 Docker 使用不同的存储后端 (overlay2)。
    3. dm.* 选项使用不同的存储后端,因此会出现错误消息。
    4. 您实际上不再需要特殊选项,因为overlay2 比devicemapper 更好的方式之一是它无需配置即可原生使用所有主机系统磁盘。

    【讨论】:

    • 谢谢!我真的希望是这样的。当突破性更新消除了之前看似不必要的复杂性时,这很棒。我需要重新配置块存储来更改 EBS 卷的挂载方式,但我可以确认这是可行的。
    猜你喜欢
    • 1970-01-01
    • 2013-06-09
    • 2017-10-26
    • 2022-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    相关资源
    最近更新 更多