在Docker中使用Jenkins - 无法连接到unix:///var/run/docker.sock的Docker守护进程。Docker守护进程正在运行吗?

3

我正在docker中运行https://hub.docker.com/r/jenkinsci/blueocean/。尝试在Jenkins中构建一个docker镜像。

但我遇到了以下错误:

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

很明显,Docker中的Jenkins版本无法访问Docker二进制文件。

我通过确认得出了这一点:

docker exec -it db4292380977 bash
docker images
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

"db4292380977"是正在运行的容器,它显示相同的错误。

问题:

  • 我如何允许Jenkins容器访问docker?
3个回答

12

jenkinsci/blueocean镜像中安装了Docker客户端,但没有守护进程。 Docker客户端将使用守护进程(默认情况下通过套接字unix:///var/run/docker.sock)。 Docker客户端需要Docker守护进程才能工作,您可以阅读Docker架构以获取更多信息。

你可以做:

使用Docker-in-Docker(DinD)镜像

Library Docker镜像提供了在Docker中运行Docker守护进程的方法,您可以从另一个容器中使用它。例如,使用纯docker CLI:

docker run --name docker-dind --privileged -d docker:stable-dind
docker run --name jenkins --link=docker-dind -d jenkinsci/blueocean
docker exec jenkins docker -H docker-dind images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

Docker守护进程在docker-dind容器中运行,可以使用相同的主机名访问。您只需向Docker客户端提供守护程序主机(例如,在示例中使用-H docker-dind,也可以使用DOCKER_HOST环境变量,如文档中所述)。

将主机机器上的/var/run/docker.sock挂载到您的容器中

@Herman Garcia回答所述:

docker run -p 8080:8080 --user root \
     -v /var/run/docker.sock:/var/run/docker.sock jenkinsci/blueocean

有没有想法如何将dind容器与Kubernetes集群上的Jenkins Helm Chart安装合并?! - Nurhun

4

您需要挂载本地的/var/run/docker.sock,并将容器作为root用户运行。

注意:这可能是一个安全漏洞,因此请小心谁可以访问jenkins容器。

docker run -p 8080:8080 --user root \
     -v /var/run/docker.sock:/var/run/docker.sock jenkinsci/blueocean

您将能够在容器内执行Docker。

➜  ~  docker exec -it gracious_agnesi bash                                                                                              
bash-4.4# docker ps                                                                                                                     
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                        
       NAMES                                                                                                                            
c4dc85b0d88c        jenkinsci/blueocean   "/sbin/tini -- /usr/…"   18 seconds ago      Up 16 seconds       0.0.0.0:8080->8080/tcp, 50000
/tcp   gracious_agnesi

我正在使用管理员权限的Windows,并使用此命令运行带有Blueocean的Docker。但是,我遇到了错误“failed to dial gRPC: cannot connect to the Docker daemon. Is 'docker daemon' running on this host?: dial tcp: lookup docker on 127.0.0.11:53: no such host" - Sachin

1

我只是尝试在命令前加上sudo来执行相同的命令

例如

sudo docker images
sudo docker exec -it db4292380977 bash

为了避免在未来使用sudo命令,您应该在Unix操作系统中运行此命令。
sudo usermod -aG docker <your-user>

更改当前用户的用户名。记得注销并重新登录以使其生效!有关Docker安装的更多信息,请单击这里


请记得在 Docker 容器内安装 sudo,Jenkins 镜像不会预先安装 sudo。 - Hernan Garcia

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