官方Docker镜像显示docker未运行?

3
我按照以下顺序执行以下Docker命令:
docker pull docker

docker run -ti <imgId>

https://hub.docker.com/_/docker/

现在我正在Docker镜像中。

假设我创建了一个临时文件夹并下载了一个Dockerfile。

mkdir temp

cd temp

curl <dockerfile>

docker build .

它会告诉我:无法连接到unix:///var/run/docker.sock上的Docker守护程序。 Docker守护程序正在运行吗?

这意味着需要启动docker服务,但由于官方的docker镜像基于alpine linux,因此像service/systemctl这样的命令不可用,所以我们必须执行apk add openrc --no-cache来访问它们。

安装后,我仍然无法启动docker服务。

执行system docker start时提示找不到docker作为服务?

service: service docker does not exist

最终,我希望通过Jenkins构建此内容。

enter image description here

在构建步骤中,我执行Execute Shell

if [ -f "Dockerfile" ]; then
    echo "Dockerfile exists ... removing it"
    rm Dockerfile
fi

wget <dockerFile url>


docker build .

我故意不在Jenkins上使用openrc,因为我想先进行本地测试。


你的Jenkins是否在容器内? - prisar
是的,我的 Jenkins 从我们的代理拉取 Docker 镜像。 - K Split X
首先,像 servicesystemctl 这样的命令在 Docker 中基本上根本不起作用。将 Docker 作为容器运行是一种特别高级的设置,通常不建议这样做;通常您会配置 Jenkins 使用主机的 Docker 套接字。 - David Maze
使用Jenkins使用docker主机套接字需要在Linux从机上安装Jenkins服务,这不是我们要采取的方法。但我想知道我在这里做错了什么?官方镜像应该已经安装了docker。 - K Split X
使用 docker 镜像可能是错误的。尽管Docker Hub页面上的镜像没有那么直接地说,但也是这样。 - David Maze
显示剩余2条评论
1个回答

0

你正在拉取的这个镜像(带有 latest 标签)不包含 Docker 守护进程。它是用作 Docker 客户端的。你需要做的是首先使用标记为 dind 的镜像运行 Docker 守护进程(Docker in Docker)。

docker network create dind
docker run --privileged --name docker --network dind -v docker-client-certs:/certs/client -d docker:dind

为了验证它是否已启动并正常工作,您可以检查日志。
docker logs docker

现在您可以使用客户端容器连接到守护进程。这就是您交互式连接到 shell 的方式,就像您想要的那样:
docker run -ti --network dind -e DOCKER_TLS_CERTDIR=/certs -v docker-client-certs:/certs/client:ro docker

在此容器内应该可以使用Docker命令。如果您执行docker version,则应该看到客户端和服务器的版本。

请注意,这两个容器共享同一个网络(一些在线示例包含链接,但这些已被弃用)。它们还共享一些TLS证书,这些证书在启动dind镜像时生成。


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