作为一名所谓的"技术狂热者",直到此刻才开始认真审视Docker,实在是有些自抽耳光。
1. 前言
过去的两年间断断续续接触了一些Docker,但一直都处于偶尔用一下的程度,总是因为因为或这样或那样的愿意没有进行系统的研究,这次就让本文作为开篇吧,希望以此为契机将DevOps正式推动下去。
2. 安装
关于安装部分,特别感谢一下底部参考链接中的 Windows10家庭版安装docker攻略 ,其叙述的已经足够详细了。本文虽然名为安装,其实更偏向于让安装起来的Docker正常运行,因此本小节不会对安装细节进行过多的着墨,这里只给出相对于参考链接,有以下几点需要注意:
- 针对
boot2docker.iso
文件,参考链接中的作者是建议进行本地文件拷贝覆盖。但根据笔者的经验,拷贝覆盖似乎没啥用,你启动的时候它还是会下载,因此笔者个人建议读者可以挑个比较特殊的时间(例如吃午饭前),让它慢慢下载吧。 - 其它部分就放在专门的“问题"小节了。
3. 问题
本文出现的最大意义就是解决在安装过程中可能出现的问题,提供一站式解决方案。
3.1 "open //./pipe/docker_engine: The system cannot find the file specified. "
关于这一部分,笔者分别参考了多篇文章,其中需要着重提及的是 GitHub - ISSUE ,其基本就是此类问题的集中讨论地。
避过笔者是按照以上链接中的方法均失败了,最终还是参考了Docker Machine on Windows - How To Setup You Hosts 中的方法,采取重建名为default的docker-machine 来让 docker version
正常显示。
# 删除 default
docker-machine rm default
# 重建, 如果重建的过程不再出问题,那 docker version将正常展示
docker-machine create --driver virtualbox default
3.2 镜像加速
不得不说,相较于Linux下的配置,Windows下的配置格外闹心,倒不是难以配置,而是能够找到的资料彼此冲突。最终笔者使用如下方式配置成功:
# 1. 启动 Docker Quickstart Terminal 并登录 默认的docker-machine VM bash
docker-machine ssh
# 2. 修改配置文件
sudo vi /var/lib/boot2docker/profile
# 配置文件格式如下
EXTRA_ARGS='
--label provider=virtualbox
# 不要怀疑,以下格式就是这样的, 不要被上面这个 --lable provider=xxx迷惑了; 最开端也是两个 - ,而不是网上文章里的 - 。
--registry-mirror https://mirror.ccs.tencentyun.com
--registry-mirror http://172.16.3.3:8093
# 配置这个可以解决maven插件 dockerfile-maven-plugin 推送镜像时候登录失败的问题, 可以不带端口, 只需要IP即可。
--insecure-registry 81.68.158.xx
--insecure-registry 172.16.3.3:8093
--insecure-registry 172.16.3.3:8094
'
CACERT=/var/lib/boot2docker/ca.pem
DOCKER_HOST='-H tcp://0.0.0.0:2376'
DOCKER_STORAGE=aufs
DOCKER_TLS=auto
SERVERKEY=/var/lib/boot2docker/server-key.pem
SERVERCERT=/var/lib/boot2docker/server.pem
export "NO_PROXY=xxxx"
# 3. 退出docker VM bash 并重启之
exit
docker-machine restart
# 4. 验证
docker info
# 在输出的信息中查看是否有形如:
# Insecure Registries:
# 81.xx.xxx.66
# 127.0.0.0/8
# Registry Mirrors:
# https://mirror.ccs.tencentyun.com/
# 5. 补充
以上这些步骤,可以通过 docker-machine create --engine-registry-mirror=https://mirror.ccs.tencentyun.com/ -d virtualbox default 在创建docker-machine时完成。
参考链接:
- Windows上Docker Toolbox修改镜像源 其中还涉及到对于"默认镜像源"的设置。
- Docker在Windows下配置国内仓库 - 腾讯云
3.3 无法访问启动的容器
经过前面一番折磨后,我们终于能够从国内镜像站里拉取到相应的镜像并成功启动,但很快发现使用预想的地址无法访问相应的应用,例如使用 localhost 无法访问到nginx等。
这是因为 在使用docker-toolbox安装的docker其实依然是运行在Linux上的。我们在Windows中运行docker,实际上还是在Windows下先安装了一个Linux环境,然后在这个系统中运行的docker。也就是说,服务中使用的localhost指的是这个Linux环境的地址,而不是我们的宿主环境Windows10。
理解了上述原理,解下来就简单了:
- 在Docker Quickstart Terminal中使用
docker-machine ip default
获取到Linux虚拟机的IP,一般都会是192.168.99.100。 - 在宿主机(也就是我们的Windows10)中使用浏览器或相应的客户端进行访问即可。
3.4 修改默认docker machine的存储位置
对于Docker Toolbox的安装,我们一般都是一路"下一步"地无脑安装,于是不出意外地Docker Toolbox将被安装在系统盘下,进而导致后期自制或者拉取的镜像也将被存放在系统盘下,这无疑会造成系统盘的急剧膨胀。因此我们很有必要在安装Docker Toolbox之初进行专门的设置。
- 在Windows的系统环境添加
MACHINE_STORAGE_PATH
,指向虚拟机的位置(例如:D:\VM\machines)。 - 删除default docker虚拟机。启动"Docker Quickstart Terminal",执行
docker-machine rm default
。 - 重建default docker虚拟机。在"Docker Quickstart Terminal"中执行
docker-machine create --driver=virtualbox default
。 - 测试重建的default虚拟机。在"Docker Quickstart Terminal"中执行
docker version
。
a. 如果出现类似"open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon configuration on Windows, …"的错误提示信息,则再次运行docker-machine env default
,复制其提供的命令eval $("D:\apps\Docker Toolbox\docker-machine.exe" env default)
进行执行。
b. 再次运行docker run hello-world
测试。
3.5 重启电脑或者重启虚拟机,镜像源地址等配置被复位
打开 docker的安装目录下的start.sh,注释掉如图所示的这一行(大约是76行):
然后重启电脑验证下。
3.6 Docker ToolBox被外网访问
这个问题的解决方案已经不是Docker层面的问题了,我们需要的是修改Docker ToolBox包含的VirtualBox组件中的配置。
- 打开"Oracle VM VirtualBox",选择相应的虚拟机进行网络配置。
- 添加相应的端口映射。
参考链接: - docker toolbox无法被外网访问解决方法【基于bridge桥接模式必须实现端口转发】
3.6 启动报错 “listen tcp4 127.0.0.1:50090: bind: An attempt was made to access a socket in a way forbidden by its access permissions.”
# 错误形如:
Starting "default"...
(default) Check network to re-create if needed...
(default) Windows might ask for the permission to configure a dhcp server. Sometimes, such confirmation window is minimized in the taskbar.
listen tcp4 127.0.0.1:50090: bind: An attempt was made to access a socket in a way forbidden by its access permissions.
Looks like something went wrong in step ´Checking status on default´... Press any key to continue...
以上错误产生的原因是我们耳熟能详的端口冲突。解决方案是修改{MACHINE_STORAGE_PATH}\machines\default\config.json
中的 Driver.SSHPort
的值,然后重启即可。
3.7 几个关键路径
- C:\Users${username}\.docker\machine\machines
其中按照子目录形式存放着用户创建的各个docker-machine,和Oracle VM VirtualBox中创建的虚拟机一一对应。