从(Jenkins)Docker容器访问Docker主机

3
我需要从安装在docker上的jenkins中运行docker命令。我的本地设置在OSX上,并使用boot2docker来虚拟化docker机器。 我通过简单地“docker run -d -p 8080:8080 --name jenkins jenkins”在docker上安装了jenkins,它正在正常运行。 在jenkins上,我已经安装了“Docker插件”https://wiki.jenkins-ci.org/display/JENKINS/Docker+Plugin,该插件需要DOCKER URL才能访问docker api。 当boot2docker启动时,我得到以下内容:“DOCKER_HOST = tcp:// 192.168.59.103:2376”,因此我假设docker api正在该主机/端口上运行? 在jenkins上,我将DOCKER URL字段设置为“http:// 192.168.59.103:2376”,但我收到以下错误“shaded.org.apache.http.client.ClientProtocolException”。 似乎容器无法访问boot2docker docker服务器。也许我错过了什么,但我无法弄清楚我必须使用的正确ip /端口是什么。

更新:更多细节

This is what I get when I start boot2docker:

bash-3.2$ unset DYLD_LIBRARY_PATH ; unset LD_LIBRARY_PATH
bash-3.2$ mkdir -p ~/.boot2docker
bash-3.2$ if [ ! -f ~/.boot2docker/boot2docker.iso ]; then cp /usr/local/share/boot2docker/boot2docker.iso ~/.boot2docker/ ; fi
bash-3.2$ /usr/local/bin/boot2docker init 

  WARNING: The 'boot2docker' command line interface is officially deprecated.

  Please switch to Docker Machine (https://docs.docker.com/machine/) ASAP.

  Docker Toolbox (https://docker.com/toolbox) is the recommended install method.

Virtual machine boot2docker-vm already exists
bash-3.2$ /usr/local/bin/boot2docker up 

  WARNING: The 'boot2docker' command line interface is officially deprecated.

  Please switch to Docker Machine (https://docs.docker.com/machine/) ASAP.

  Docker Toolbox (https://docker.com/toolbox) is the recommended install method.

Waiting for VM and Docker daemon to start...
...............oooooooo
Started.
Writing /Users/local/.boot2docker/certs/boot2docker-vm/ca.pem
Writing /Users/local/.boot2docker/certs/boot2docker-vm/cert.pem
Writing /Users/local/.boot2docker/certs/boot2docker-vm/key.pem

To connect the Docker client to the Docker daemon, please set:
    export DOCKER_TLS_VERIFY=1
    export DOCKER_HOST=tcp://192.168.59.103:2376
    export DOCKER_CERT_PATH=/Users/local/.boot2docker/certs/boot2docker-vm

Or run: `eval "$(boot2docker shellinit)"`

bash-3.2$ $(/usr/local/bin/boot2docker shellinit)
Writing /Users/local/.boot2docker/certs/boot2docker-vm/ca.pem
Writing /Users/local/.boot2docker/certs/boot2docker-vm/cert.pem
Writing /Users/local/.boot2docker/certs/boot2docker-vm/key.pem
bash-3.2$ docker version
Client:
 Version:      1.8.0
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   0d03096
 Built:        Tue Aug 11 17:17:40 UTC 2015
 OS/Arch:      darwin/amd64

Server:
 Version:      1.8.0
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   0d03096
 Built:        Tue Aug 11 17:17:40 UTC 2015
 OS/Arch:      linux/amd64

这是云端 Jenkins 配置的步骤:

Docker configuration in jenkins


2
当我在Linux上运行Jenkins时,我通过“-v /var/run/docker.sock:/var/run/docker.sock”选项将Docker套接字(/var/run/docker.sock)映射到容器中。不确定boot2docker的工作原理,但如果它正在将映射到boot2docker VM文件系统,则应该可以正常工作。 - ISanych
3个回答

1
我遇到了与我的Jenkins Docker插件完全相同的问题。 Docker默认使用tls,但docker插件仅支持http。 我所做的是在docker机器上禁用TLS验证。 我的docker机器是Ubuntu,因此docker conf文件位于/etc/default/docker下。 在conf文件中,您可以通过添加来禁用TLS
--tls=false 

在DOCKER_OPTS中。例如:
DOCKER_OPTS='-H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --tls=false'

1
正如@ISanych所建议的那样,您可以简单地执行-v /var/run/docker.sock:/var/run/docker.sock,它也会在boot2docker上奇妙地运行。无需定义DOCKER_URL
如果需要访问已启动容器的端口,您可能还会发现--net=host有用。

我按照你说的方式启动了容器,命令如下:docker run -d -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock --net=host --name jenkins jenkins但是没有成功,我仍然无法连接到云端,报错信息为shaded.org.apache.http.client.ClientProtocolException(如果我在Jenkins配置中不使用DOCKER URL,则无法进行测试)。 - ddelizia
  1. 你要连接哪个云?
  2. 你现在使用什么作为 DOCKER_URL
- Mykola Gurov
我刚刚在问题描述中添加了更多信息。 - ddelizia
你能否尝试将 DOCKER URL 设置为 unix:///var/run/docker.sock (当然要与 -v /var/run/docker.sock:/var/run/docker.sock 结合使用来运行容器)? - Mykola Gurov
@MykolaGurov,请问这个“-v /var/run/docker.sock:/var/run/docker.sock”需要在哪里提供?您能否建议如何在docker url中提供此配置? - rselvaganesh

-2
这可能应该是对先前答案的评论,但似乎不可能。这只是一个提醒大家的注释,表示在0.0.0.0上侦听意味着侦听任何公共可路由接口,这些接口可能连接到您系统上配置的任何物理或虚拟网络接口。谨慎起见,建议将您的曝光限制在仅内部网络上,这样就不太可能遇到具有恶意意图的敌对势力。

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