首页 文章

从(jenkins)docker容器访问docker主机

提问于
浏览
2

我需要从jenkins运行docker命令,它在docker上作为容器安装 . 我的本地设置在OSX上,我使用boot2docker来虚拟化docker机器 .

我已经通过简单的 docker run -d -p 8080:8080 --name jenkins jenkins 在docker上安装了jenkins,它运行正常 .

在jenkins上我安装了"Docker plugin" https://wiki.jenkins-ci.org/display/JENKINS/Docker+Plugin,它需要DOCKER URL才能访问docker api .

当boot2docker启动时,我得到以下内容: DOCKER_HOST=tcp://192.168.59.103:2376 ,所以我假设docker api正在该主机/ por上运行?

在jenkins上我将DOCKER URL字段设置为 http://192.168.59.103:2376 ,但是我收到以下错误"shaded.org.apache.http.client.ClientProtocolException" .

似乎容器无法访问boot2docker docker服务器 . 也许我错过了一些东西,但我无法弄清楚我必须使用的正确ip /端口是什么 .

Update: More Details

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

这里是 Cloud 的jenkins配置:

Docker configuration in jenkins

3 回答

  • 1

    正如@ISanych建议你可以简单地做 -v /var/run/docker.sock:/var/run/docker.sock ,它也会神奇地在boot2docker上工作 . 无需定义 DOCKER_URL .

    如果需要访问已启动容器的端口,您可能还会发现 --net=host 非常有用 .

  • 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

    这应该是对前一个答案的评论,但这似乎不可能 . 这只是一个注意提醒人们,监听0.0.0.0意味着监听任何可公共路由的接口可能连接到系统上配置的任何物理或虚拟网络接口 . 谨慎建议限制你只接触内部网络,不太可能遇到恶意的敌对势力 .

相关问题