在Alpine Docker中安装Docker

在Alpine Docker中安装Docker,docker,dockerfile,alpine,docker-in-docker,Docker,Dockerfile,Alpine,Docker In Docker,我有一个Dockerfile,上面有一个经典的Ubuntu基本映像,我正试图缩小它的大小。 这就是我使用阿尔卑斯山基地的原因 在我的Docker文件中,我必须安装Docker,所以Docker中的Docker FROM alpine:3.9 RUN apk add --update --no-cache docker 这很好,我可以在我的容器中运行docker版本,至少对于客户端是这样。因为对于服务器,我有一个经典的Docker错误: Cannot connect to the Docke

我有一个Dockerfile,上面有一个经典的Ubuntu基本映像,我正试图缩小它的大小。 这就是我使用阿尔卑斯山基地的原因

在我的Docker文件中,我必须安装Docker,所以Docker中的Docker

FROM alpine:3.9 

RUN apk add --update --no-cache docker
这很好,我可以在我的容器中运行
docker版本
,至少对于客户端是这样。因为对于服务器,我有一个经典的Docker错误:

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
我知道在Ubuntu中安装Docker后我必须运行

usermod -a -G docker $USER
但是在阿尔卑斯山呢?如何避免这个错误

附言:

我的第一个想法是通过绑定挂载
/var/run/Docker.sock:/var/run/Docker.sock
重新使用Docker套接字,从而进一步减小图像的大小,因为我不必重新安装Docker

但由于Dockerfile中不允许绑定挂载,您知道我的想法是否可行以及如何实现吗?我知道这在Docker compose中是可能的,但我只能使用Dockerfile


谢谢,您可以这样做,您的第一个想法是正确的:只需将docker套接字(
/var/run/docker.sock
)公开给“控制”容器即可。这样做:

host:~$ docker run \
                  -v /var/run/docker.sock:/var/run/docker.sock \  
                  <my_image>
host:~$ docker exec -u root -it <container id> /bin/sh

这是不是一个好主意是有争议的。如果有办法避免的话,我建议不要这样做。这是一个安全漏洞,它从本质上抹去了使用容器的一些主要好处:隔离和对权限提升的控制。

您实际上想做什么?你可能做错了。还有,不是这样的。我想很清楚,从阿尔卑斯山基地的图片上看,试图在Docker中运行Docker。我有一个关于docker Deamont的错误,我可以自己读。但是你到底想用这个来完成什么呢。你为什么需要Docker在Docker?你是说我为什么需要Docker在Docker?这是我的公司所使用的体系结构。端到端的示例,包括对您正在处理的所有约束的解释,在这里会非常有用。Docker Hub映像文档(除了开始时警告不要使用该映像或DinD)指出,启动Docker守护程序需要一个
--privileged
容器,这也不能在Dockerfile中指定。如果你有一个基于Ubuntu的设置,我可能会坚持。好的,谢谢!关于安全问题,您建议完全安装docker,而不要重复使用套接字?你知道阿尔卑斯山怎么做吗?我无法连接到docker Deamont让docker容器访问docker套接字的整个方案在我看来真的不是一个好方案。不过我不确定你所说的“完全安装docker”是什么意思。在容器内部,所有安装的都是打包的二进制文件,它们允许您通过安装在容器内部的套接字控制docker,但实际的容器化仍在主机级别进行,无法运行“docker in docker”,就像您可以在一个厚VM中运行一个厚VM一样(或厚VM内部的docker).Docker不是这样工作的。换句话说,Docker套接字和整个内核只存在于主机级别。但是您可以将对主机Docker套接字的访问公开给容器,容器然后可以使用Docker二进制文件控制主机系统上运行的Docker实例。但实际上,这都只是具有命名空间p的主机内核分区。冒烟和镜像。好的,谢谢,我知道容器化是在主机级别进行的,但我不知道是否有办法。因此,尽管这可能是一个安全问题,我还是会在运行时安装套接字
-v/var/run/docker.sock:/var/run/docker.sock
。无论如何,谢谢我也这么做了。它可以工作,请继续在你的脑海里,这不是一个好的设计,也许不要将它部署到生产中:)
root@guest:/# docker ps -a

CONTAINER ID        IMAGE                 COMMAND                  CREATED       ...
69340bc13bb2        my_image              "/sbin/tini -- /usr/…"   8 minutes ago ...