Mac环境下如何获取docker-client实例?解决TCP转HTTP端口映射异常
解决Docker Remote API调用的invalid scheme异常问题
首先得澄清一个小误解:你提到的「把TCP端口映射为HTTP端口」其实有点混淆概念啦——Docker daemon的2376端口本身就是基于TCP的,但它默认跑的是HTTPS协议,不是HTTP。你用http://开头的URL去访问HTTPS端口,自然会触发invalid scheme异常。
下面给你两个解决方案,按需选择:
方案1:用HTTPS URL + TLS证书调用(推荐,安全)
因为Docker默认在2376端口启用了TLS加密,所以你的docker-client库需要带上证书才能正常连接。从你这个192.168.99.100的地址来看,大概率是docker-machine创建的默认虚拟机节点,证书一般存在~/.docker/machine/machines/default目录下,包含ca.pem、cert.pem、key.pem三个文件。
以Java的docker-client库为例,你需要在初始化客户端时指定证书路径和HTTPS地址:
import com.spotify.docker.client.DefaultDockerClient; import com.spotify.docker.client.DockerCertificates; import com.spotify.docker.client.DockerClient; import java.io.File; public class DockerExample { public static void main(String[] args) throws Exception { // 指定证书目录 DockerCertificates certs = new DockerCertificates( new File(System.getProperty("user.home") + "/.docker/machine/machines/default") ); // 用https://开头的URI初始化客户端 DockerClient docker = DefaultDockerClient.builder() .uri("https://192.168.99.100:2376") .dockerCertificates(certs) .build(); // 测试调用,比如获取Docker版本 System.out.println(docker.version()); docker.close(); } }
其他语言的docker-client库逻辑类似,只要配置好TLS证书和HTTPS地址就能解决scheme不匹配的问题。
方案2:开启Docker daemon的HTTP端口(仅测试用,不安全)
如果只是本地测试,不想折腾证书,可以修改Docker daemon的配置,让它监听一个未加密的HTTP端口(默认是2375):
- 找到Docker daemon的配置文件
/etc/docker/daemon.json,如果不存在就创建它。 - 添加以下配置内容:
{ "hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"] }
- 重启Docker daemon生效:
brew services restart docker
之后你就可以用http://192.168.99.100:2375来调用Docker Remote API了,不需要证书——但注意这个方式没有加密,绝对不要在生产环境使用!
内容的提问来源于stack exchange,提问作者Goose
相关产品推荐
相关产品推荐

