【问题标题】:Official Docker image says docker not running?官方 Docker 镜像说 docker 没有运行?
【发布时间】:2018-08-27 18:48:52
【问题描述】:

我按以下顺序执行以下 docker 命令:

docker pull docker

docker run -ti <imgId>

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

现在我在 Docker 的“docker”镜像中

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

mkdir temp

cd temp

curl <dockerfile>

docker build .

它会告诉我Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

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

我安装后还是无法启动docker服务。

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

service: service docker does not exist

最终我想通过 Jenkins 来构建它。

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

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

wget <dockerFile url>


docker build .

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

【问题讨论】:

  • 你的 Jenkins 在容器中吗?
  • 是的,我的 Jenkins 从我们的代理中提取 docker 映像
  • @ps4,我添加了一张你喜欢的图片
  • 大致来说,像servicesystemctl 这样的命令在Docker 中根本不起作用。将 Docker 作为容器运行是一种特别高级的设置,通常不推荐;通常你会将 Jenkins 配置为使用主机的 Docker 套接字。
  • 使用 Jenkins 使用 dockers 主机套接字需要在 Linux Slave 上安装 Jenkins 服务,这不是我们要采用的方法。我想知道我在这里做错了什么?官方镜像应该已经安装了docker

标签: docker jenkins dockerfile


【解决方案1】:

您在此处拉取的图像(带有latest 标签)不包含 docker 守护程序。它旨在用作 docker 客户端。您想要的是首先使用标记为dind(docker 中的docker)的图像运行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 映像时生成的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-21
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    相关资源
    最近更新 更多