Docker守护程序在EC2实例上崩溃

时间:2019-07-19 23:41:47

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

因此,我正在更新一个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完美配合,但是当我运行Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?时,新的AMI给了我docker ps -a

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

有人可以告诉我这种方法有什么问题吗?是否可以使用ECS修复此标志,或者以其他方式扩大Docker映像可用的磁盘空间量?

谢谢

1 个答案:

答案 0 :(得分: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. 实际上,您不再需要特殊的选项,因为overlay2devicemapper更好的方法之一是它可以直接使用所有主机系统磁盘,而无需进行配置。