在 Alpine Docker 中安装 Docker

Install Docker in Alpine Docker

我有一个包含经典 Ubuntu 基本图像的 Docker 文件,我正在尝试减小大小。 这就是我使用 Alpine base 的原因。

在我的 Docker 文件中,我必须安装 Docker,所以 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?

我知道 Ubuntu 安装后 Docker 我必须 运行

usermod -a -G docker $USER

但是在阿尔卑斯山呢?我怎样才能避免这个错误?

PS:

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

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

谢谢

你可以这样做,你的第一个想法是正确的:只需要将 docker 套接字(/var/run/docker.sock)暴露给 "controlling" 容器。这样做:

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 ...

这是否是个好主意值得商榷。如果有任何方法可以避免,我建议不要这样做。这是一个安全漏洞,从根本上排除了 window 使用容器的一些主要好处:隔离和控制权限升级。

我设法以简单的方式做到了

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

I am using this command on my test env!