最近在学习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 TimeTime CurrentDload Upload Total Spent Left SpeedCannot 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 statusdocker.service - Docker Application Container EngineLoaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)Active: active (running) since vr -09-25 12:41:48 EDT; 15min agoDocs: 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后,只解决了最初的第一个问题,插拔网线的问题仍然存在,但是现在的结果已经能够满足我们的要求了。
参考
/que...
/que...