在Alpine Docker中安装Docker

5

我有一个Dockerfile,其中使用了经典的Ubuntu基础镜像,我试图减少其大小。因此我正在使用Alpine基础镜像。

在我的Dockerfile中,我必须安装Docker,这就是为什么需要进行Docker内部安装。

FROM alpine:3.9 

RUN apk add --update --no-cache docker

这很好用,我可以在容器内运行docker version,至少对于客户端而言是这样的。因为对于服务器端,我遇到了经典的Docker错误,如下所示:

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

我知道在安装完Docker后,在Ubuntu系统中需要运行以下命令:

usermod -a -G docker $USER

那么在Alpine中怎么办?我该如何避免这个错误?

PS:

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

但由于Dockerfile不允许绑定挂载,您知道我是否可以实现并如何实现吗?我知道在Docker-compose中可以实现,但我必须仅使用Dockerfile。

谢谢


你实际上想做什么?你可能做错了。而且,这并不是那么容易(https://github.com/jpetazzo/dind)。 - Mike Doe
3
我会尽力进行翻译。以下是需要翻译的内容:"I think it's clear, trying to run Docker in Docker from Alpine base image. I have the error about the docker deamon." - iAmoric
我自己能读懂这个。但是你实际上想要通过这样做达到什么目的?为什么你需要在 Docker 中使用 Docker? - Mike Doe
你是说为什么我需要Docker-in-Docker吗?这是我们公司使用的架构。 - iAmoric
一个端到端的示例,包括所有你正在处理的限制的解释,将非常有帮助。Docker Hub docker镜像文档(除了开始时提醒不要使用该镜像或DinD)指出,启动Docker守护程序需要一个--privileged容器,这也无法在Dockerfile中指定。如果你有一个可用的基于Ubuntu的设置,我可能会坚持使用它。 - David Maze
2个回答

0

我用简单的方法做到了那件事

docker run -it --rm -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker --privileged docker:dind sh

我正在我的测试环境中使用这个命令!

-1

你可以这样做,而且你的第一个想法是正确的:只需要将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软件包):

root@guest:/# docker ps -a

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

这是否是一个好主意还有待商榷。如果有任何避免的方法,我建议不要这样做。这是一个安全漏洞,本质上抛弃了使用容器的一些主要优点:隔离和控制特权升级。


好的,谢谢!关于安全问题,您建议完全安装Docker而不是重复使用套接字?您知道如何在Alpine上实现这一点吗?我无法连接到Docker守护程序。 - iAmoric
1
让Docker容器访问Docker套接字的整个方案在我看来确实不是一个好的方案。但我不确定你所说的“完全安装Docker”是什么意思。在容器内,安装的所有内容都是打包的二进制文件,可以通过挂载在容器内的套接字控制Docker,但实际的容器化仍然发生在主机级别,没有办法像在厚VM中运行厚VM(或在Docker中运行厚VM)一样运行“Docker in Docker”。Docker不是这样工作的。 - Z4-tier
好的,谢谢。我知道容器化是在主机级别进行的,但我想知道是否有一种方法可以绕过这个限制。虽然这可能存在安全问题,但我还是会在运行时挂载套接字 -v /var/run/docker.sock:/var/run/docker.sock。无论如何,还是谢谢。 - iAmoric
就我所知,我也做过这件事。它有效,只是要记住它不是一个好的设计,也许不要部署到生产环境中 :) - Z4-tier
1
@DavidMaze 完全同意,尽管我反对说“容器不能直接操作其他容器”,因为显然它们可以...只是这样做会破坏容器化的一些主要优点。但是这样做确实使一些测试场景更容易实现,并且这些有效用例应该伴随着严厉的警告。 - Z4-tier
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接