我有在开发环境中测试实例的相同目标,最初我认为它应该像docker run amazonlinux:2 -it
. 但我错了,我花了将近一整天的时间才让它工作!
有趣的是,当你在谷歌上搜索“ amazonlinux Docker ”时,经常有人尝试安装“ Docker in amazonlinux ”,但这里我们想安装“ amazonlinux in Docker ”!
我们还想在那个 amazonlinux 中安装 Docker,所以基本上“ Docker in amazonlinux in Docker ”最终就是“ Docker in Docker ”!;D*
我的发现:
- Docker 中的 Amazonlinux(通过 创建
FROM amazonlinux:2
)非常空洞,甚至没有像sudo
或这样的基本内容passwd
。)新的 AWS EC2 实例有。
- 为了让你
serviced
正常工作(启动任何守护进程,包括 Docker 守护进程),你需要/usr/sbin/init
在那里(通过yum install initscripts
并实际调用。但是,你想玩的肉需要你的 shell 从/bin/bash
.
- 您正在 Docker 中运行 Docker。这需要从您的主机中获得特权
docker run
via --priviledged
。
- 您需要
/sys/fs/cgroup
从您的主机(它可以是只读的)共享它才能正确初始化 docker 守护进程。
我的解决方案:
1) 要完成上述前两个问题,您的Dockerfile可以是:
FROM amazonlinux:2
RUN yum update -y && yum install -y initscripts;
CMD ["/usr/sbin/init"]
2)从中构建图像,例如docker build . -t ax1
3) 然后,为了解决上面的后两个问题,从它运行一个分离的(在后台运行)容器,特权,与您的/sys/fs/cgroup
. 例如
docker run --name ac11 -d --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro ax1
4)最后你可以使用docker exec -it ac11 bash
5) 现在,它非常接近一个新的 EC2 实例。(然而,我们在 Dockerfile 中跳过了 缺失sudo
的、实际的和其他内容,以保持这个解决方案的简单性。)ec2-user
无论如何,现在您可以按照AWS Docs的说明进行安装 。也就是说,一旦您进入容器,请执行以下操作:docker
amazon-linux-extras install -y docker;
然后重启一次docker服务:
service docker restart;
现在,docker ps
应该可以工作了!