docker run选择Docker daemon规则及外部查看docker-machine容器方法咨询
嘿,这两个问题都是Docker多环境管理里的典型场景,我给你一步步讲明白:
1. docker run 如何决定使用哪个 Docker daemon?
核心逻辑其实是看当前环境中的Docker配置参数,最关键的是这几个点:
- DOCKER_HOST环境变量:这是决定Docker客户端连接哪个daemon的核心。默认情况下:
- Windows下用docker-toolbox安装的docker-machine,会自动把
DOCKER_HOST设置为虚拟机的TCP地址(比如tcp://192.168.99.100:2376),所以docker run默认连接这个daemon。 - Linux上原生Docker daemon默认使用Unix套接字
unix:///var/run/docker.sock,如果没手动修改环境变量,即使有docker-machine实例在运行,docker run还是会连接本地的原生daemon。
- Windows下用docker-toolbox安装的docker-machine,会自动把
- 命令行参数
-H:你可以直接在docker run命令里指定要连接的daemon地址,比如docker -H tcp://<machine-ip>:2376 run nginx,这会绕过环境变量,直接连接指定的daemon。 - Docker Context(推荐):新版本Docker提供了
docker context命令来管理多个daemon配置。你可以把不同的docker-machine实例配置成不同的context,切换后所有Docker命令都会默认指向对应的daemon。
另外,docker-machine自带的docker-machine env <machine-name>命令会输出切换到该实例所需的环境变量,执行eval $(docker-machine env <machine-name>)就能快速切换daemon上下文,之后docker run就会使用这个实例的daemon了。
2. 无需SSH进入实例,从外部查看docker-machine实例上运行容器的方法?
当然有,而且有几种便捷的方式:
- 切换环境变量直接用Docker命令:先运行
eval $(docker-machine env <你的实例名>),这会把当前终端的Docker客户端配置指向目标docker-machine实例。之后直接用docker ps、docker logs <容器ID>、docker inspect <容器ID>这些命令,就能查看该实例上的容器状态、日志和详情,完全不用SSH。 - 用Docker Context管理(更持久):如果不想每次都执行env命令,可以把docker-machine实例配置成一个context:
然后执行docker context create <context名称> --docker "host=tcp://<实例IP>:2376,ca=~/.docker/machine/machines/<实例名>/ca.pem,cert=~/.docker/machine/machines/<实例名>/cert.pem,key=~/.docker/machine/machines/<实例名>/key.pem"docker context use <context名称>,之后所有Docker命令默认都会指向这个实例,查看容器就和操作本地daemon一样方便。 - 直接指定daemon地址和证书参数:如果只是临时查看一次,也可以直接在命令里带上所有必要参数:
不过这种方式参数较多,适合临时场景,日常用还是前两种更方便。docker --tlsverify \ --tlscacert=~/.docker/machine/machines/<实例名>/ca.pem \ --tlscert=~/.docker/machine/machines/<实例名>/cert.pem \ --tlskey=~/.docker/machine/machines/<实例名>/key.pem \ -H tcp://<实例IP>:2376 \ ps
内容的提问来源于stack exchange,提问作者iTakeshi




