Windows7 下Ubuntu VM 中Docker连接不上的问题及解决方案

414 阅读3分钟

最近在学习Java微服务,不可避免的会涉及到将微服务容器化。

由于使用Windows7作为开发环境,最初几天用了VirtualBox 和 boot2docker,但是经常会出现如下两个问题:

1,在电脑重启后,所有在docker-machine中的配置信息都会丢失;

2,插拔网线后,运行中的容器无法再访问。

这两个问题不是只有我遇到过,和我一起研究docker的同事也遇到同样的情况。

为了尝试解决上述问题,我们基于VirtualBox,安装了Oracle官网提供的Ubuntu的虚拟机镜像。

首先我们决定网络选用桥接模式,主要基于几点考虑:

1, Ubuntu中的Docker需要能够连接外网以获取需要的公共镜像;

2, 本地的开发环境或其他机器,需要能够直接访问Docker容器的宿主机(即Ubuntu VM),以便通过maven或命令行的方式执行Docker命令;或者通过浏览器访问容器化的eureka以及其他应用。

桥接模式的设定,可以通过在VirtualBox中选择Ubuntu实例,点击Settings->Network->Adapter1,然后选择Bridged Adapter,之后保存即可。(需要注意的是Ubuntu实例要在停止状态才可以选择)

关于Ubuntu具体的安装步骤和其他配置,网上有很多文章介绍,这里不再赘述。

下面说一下在Ubuntu中安装了Docker之后出现困扰我们一天的问题。

通过本地环境尝试连接Ubuntu的Docker Daemon(即监听Docker并对外提供服务的进程)

$curl 10.213.22.202:2375

% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

Cannot connect to the Docker daemon. Is the docker daemon running on this host?

其中2375(或2376)为Docker Daemon的默认监听端口,10.213.22.202为桥接模式下虚拟机获得的网络地址。

环境信息

Virtualbox: 5.1.20

Ubuntu VM: ubuntu-16

docker installed: 17.06.0

首先我们确认了,Ubuntu中的Docker已经在运行

这点我们可以通过docker ps,docker pull或docker push等命令确认。

其次,查看 netstat -an|grep 2375 的结果

发现此端口没有处于监听状态。

通过Docker status命令确认2375确实没有处于监听状态

输出包括类似如下信息:

root@ubuntu:~# /etc/init.d/docker status
docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since vr 2017-09-25 12:41:48 EDT; 15min ago
     Docs: https://docs.docker.com
 Main PID: 1008 (docker)
   CGroup: /system.slice/docker.service
           └─1008 /usr/bin/docker daemon -H fd://

通过增加如下两个配置解决:

  • /etc/systemd/system/docker.service.d/docker.conf 此文件如果没有就新创建一个。增加如下内容:

        [Service]
        ExecStart=
        ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
    
  • /etc/init.d/docker 将DOCKER_OPTS="",更新为 DOCKER_OPTS="-H tcp://0.0.0.0:2375"

        DOCKER_OPTS="-H tcp://0.0.0.0:2375"
    
  • 重新启动Docker,再次通过curl命令访问,问题解决。

    root@ubuntu:~# /etc/init.d/docker restart
    

备注:使用Ubuntu后,只解决了最初的第一个问题,插拔网线的问题仍然存在,但是现在的结果已经能够满足我们的要求了。

参考

stackoverflow.com/questions/2…

stackoverflow.com/questions/3…