本文图文讲解在Windows、Mac、Linux中Docker开启远程访问API(2375端口)以及各种坑。
需求是这样的,我在本地上运行各种容器,不同容器需要互相访问,比如用Jenkins搭自动部署环境构建完项目需要向docker中推镜像并运行镜像,但Jenkins又是在docker的容器中运行没法直接执行命令操作docker,使用ssh插件又要多搭个Linux环境的docker(这里不在Jenkins容器中安装docker),所以最简单的办法就是直接开启docker的远程访问端口。
首先有必要来了解一下dockerd,官网这样描述:
docker daemon(docker守护进程)是一个运行在宿主机(DOCKER-HOST)的后台进程,可通过 docker client(docker客户端)与之通信。Docker守护进程可以通过三种不同类型的套接字监听Docker引擎API请求:unix、tcp和fd。上面还提到如果需要远程访问Docker守护进程,则需要启用tcp套接字。请注意,默认设置提供对Docker守护进程的未加密和未经身份验证的直接访问,应该使用内置的HTTPS加密套接字或在其前面放置一个安全的web代理来进行保护。
所以本文主要以未加密和未经身份验证直接访问的方式来讲解如何开启远程访问docker,因此郑重提示请不要这样直接在生产环境使用未加密和未经身份验证的方式开启docker远程访问,不然后果自负!!!
按照上面官网截图说的,使用2375端口与守护进程进行未加密通信,2376则是加密通信,所以本文就以开启2375端口来讲解。
Windows
Windows坑比较多!
为了避免因防火墙问题而无法访问2375端口,首先我们直接给防火墙进站规则加上2375端口。
打开防火墙高级设置添加进站规则:
填写端口:
允许连接:
这里可以根据自己的情况选,我这里规则全都应用:
给规则命名:
涉及到虚拟化技术,我们还要开启Hyper-V功能:
我是在虚拟机中搞的,如果你是在物理机上弄,开机的时候还要进入BIOS设置虚拟化支持具体自己百度一下。
网上可能很多教程都说直接右键点右下角docker图标选设置,然后勾选“ Expose daemon on tcp://localhost:2375 without TLS ”:
但勾选Expose …后用你会发现只有用localhost和127.0.0.1才能访问docker,用192.168的IP总是提示被拒绝:
网上还有说加”hosts”: [tcp://0.0.0.0:2375],但你会发现老是报错而加不了:
其实是你少了一对双引号,正确的应该是:”hosts”: [“tcp://0.0.0.0:2375”]!
这下终于可以添加并保存重启了,但你等半天却突然弹出个error而且右下角的docker图标像中毒一样都变红了并提示Failed to start:
这步可能耗了不少人不少时间,有人看到提示说Hyper-V有问题,但看了BIOS已经启动虚拟化功能了而且系统设置里也勾选Hyper-V了,但为什么不行,难道是系统出问题了?甚至有人开始重装系统了…其实你要是细心的话,你会发现右键右下角docker图标有显示一项是“Switch to Windows containers…”,不妨试试:
过一会,神奇了右下角的docker图标竟然又变回白色了,而且也可以用IP直接访问docker了:
需要注意的点我都在上图圈出来了,坑多吧?下面让我们进入Mac环境吧。
Mac
官网好像没有介绍怎么开启docker for Mac的远程访问,就说了加证书:
不过有款叫socat的网络工具提供的镜像来做docker for Mac的远程访问:
拉下来后直接运行即可远程访问docker for Mac:
当然你也可以加上–restart=always让docker启动时也启动这个容器:
docker run -d –name=socat –restart=always \
-p 2375:2375 \
-v /var/run/docker.sock:/var/run/docker.sock \
alpine/socat \
tcp-listen:2375,fork,reuseaddr unix-connect:/var/run/docker.sock
Linux
Linux环境也比较简单,只需要在(两处一样的)
vi /usr/lib/systemd/system/docker.service
或
vi /usr/lib/systemd/system/docker.service
首先看一下原来的文件:
在docker.service中找到 ExecStart,在最后面添加 -H tcp://0.0.0.0:2375然后重启docker daemon和docker,当然还要防火墙放开2375端口:
比较有可能出问题的,可能就是端配置里写2375而防火墙却放2357。
最后再次郑重提示请不要这样直接在生产环境使用未加密和未经身份验证的方式开启docker远程访问,不然后果自负!!!
展开阅读全文