安装所需的环境

1、Win7 及以上版本,Win10 以上可以安装 Docker for Windows
2、MacType 和 VirtualBox 冲突,导致无法启动虚拟机
3、安装 VirtualBox 时选择 NDIS5 驱动器。根据官方的说法,从 Windows Vista 开始, VirtualBox 默认安装 NDIS6 驱动,但是可能会导致虚拟机从系统变慢到网络异常的一系列问题,所以如果不幸出现了问题,可以重装 Docker Toolbox,选择用 NDIS5 驱动安装 VirtualBox
点击查看官方说法

启动

点击 Docker Quickstart Terminal

有时点击可能无效,是因为之前有安装过 git 了,但是 git 的安装路径不对,点击右键 - 属性 - 快捷方式 修改 bash 的路径即可

img

不出意外会需要更新 boot2docker.iso 文件,但是下载很慢,此时可以退出直接去 github 下载最新版的 boot2docker.isoC:\Users\Administrator\.docker\machine\cache路径下

重新点击,启动成功

此前电脑上装了 MacType,导致一直无法启动 VirtualBox 的虚拟机,这里再次提个醒。其实以前安装 Genymotion 的时候就遇到过 MacType 和 VirtualBox 冲突的情况,只是一直没有联系到一起

img

创建虚拟机 default

img

鲸鱼出现说明启动成功了!

现在可以 Hello World 了

1
docker run hello-world

img

Hello World

现在你有一个镜像 (image) 和一个容器(container)了

镜像和容器,可以用类和实例类比,镜像是模版,容器是实例

1
2
3
4
5
docker images // 查看所有镜像
docker container ls // 查看正在运行的容器,辛辛苦苦敲了这几个单词却没有显示容器怎么办?
docker container ls -a // 可以带上 -a 参数,列出所有的容器,此时可以看到刚才的 hello-world 容器了,因为它运行完就退出了
docker rm -f container CONTAINER ID // 删除容器
docker rmi IMAGE ID // 删除镜像

设置国内镜像源

如果尝试拉取一个比较大的镜像,比如nginx,你会发现速度慢得让人怀疑人生,此时可以设置一下国内的镜像源,让下载速度起飞

1
2
docker-machine ssh default // 先进入虚拟机,default 是默认的虚拟机名称
sudo vi /var/lib/boot2docker/profile // 编辑这个文件,添加镜像源 --registry-mirror https://registry.docker-cn.com

img

sudo vi /var/lib/boot2docker/profile

1
2
3
4
sudo /etc/init.d/docker restart // 重启 docker 进程
exit // 退出虚拟机
docker info // 看一下镜像源是否设置成功(是否有刚刚设置的 --registry-mirror 这一行)
docker pull nginx // 现在可以愉快地拉取`nginx`镜像了

这里有个问题,对于虚拟机中的配置的修改,在重启虚拟机之后(比如关机再开机)配置又被重置了,导致每次开机都要重新配置一遍,比如上面的镜像源配置。Github 上也有不少这方面的 issue #1718 这个描述得比较清晰,暂时的解决方案也很简单,第一次启动后修改启动脚本 start.sh 注释掉 yes | "${DOCKER_MACHINE}" regenerate-certs "${VM}" 这一行即可

1
2
3
4
if [ "${VM_STATUS}" != "Running" ]; then
"${DOCKER_MACHINE}" start "${VM}"
# yes | "${DOCKER_MACHINE}" regenerate-certs "${VM}"
fi

文件夹权限

在 boot2docker 中,默认的用户名和密码是:

1
user: docker pass: tcuser

Toolbox 默认只能访问 C:\Users 这个文件夹下的内容,映射到虚拟机上就是 /c/Users

img

注意:c 是小写,Users 是大写开头

如果你的项目在这个目录内,在添加数据卷(Volume)挂载本机目录时,可以使用相对路径, 比如这样

1
2
3
4
5
6
7
...
redis:
...
volumes:
- ./data:/data
...
...

如果你本机的项目放在其他目录,或者需要进入到其他目录的权限,需要添加该目录到虚拟机的共享文件夹

  1. 打开 VirtualBox

  2. 选择虚拟机,点击设置,这里是 default

  3. 选择共享文件夹,添加目录,映射到虚拟机的对应路径(截图显示是映射到

    1
    /Dockerfile

    文件夹)

    img

    添加共享文件夹

  4. 重启虚拟机

1
docker-machine restart default

这样就可以愉快地写数据卷(Volume)了,比如这样:

1
2
3
4
5
6
7
...
redis:
...
volumes:
- /Dockerfile/data:/data #这里就只能使用绝对路径了
...
...

Docker 开机自启动

Docker Quickstart Terminal 快捷方式拖到开始菜单『启动』文件夹下即可,这样 Docker 每次开机都会自行启动,相应的为了能让容器也重新启动(因为关机等原因容器停止运行了,但是并未删除,只需重新启动即可),可以加一条重启的命令:

1
2
3
4
5
6
7
8
...
redis:
...
restart: always # 加一条重启的命令
volumes:
- /Dockerfile/data:/data
...
...

卸载 Toolbox

进入控制面板,先卸载 Toolbox,再卸载 VirtualBox,C:\Users\Administor\.docker 需要手动删除。

Toolbox修改虚拟机IP

changeip.bat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@echo off
setlocal enabledelayedexpansion
set machine=%1
if "%machine%" == "" (
echo dmvbf expects a machine name
exit /b 1
)
set ipx=%2
if "%ipx%" == "" (
echo dmvbf x missing ^(for 192.168.x.y^)
exit /b 2
)
set ipy=%3
if "%ipy%" == "" (
echo dmvbf y missing ^(for 192.168.x.y^)
exit /b 3
)

echo kill $(more /var/run/udhcpc.eth0.pid) ^| docker-machine ssh %machine% sudo tee /var/lib/boot2docker/bootsync.sh ^>NUL
echo ifconfig eth0 192.168.%ipx%.%ipy% netmask 255.255.255.0 broadcast 192.168.%ipx%.255 up ^| docker-machine ssh %machine% sudo tee -a /var/lib/boot2docker/bootsync.sh ^>NUL
echo route add default gw ^<gateway ip address here^> ^| docker-machine ssh %machine% sudo tee -a /var/lib/boot2docker/bootsync.sh ^>NUL

docker-machine ssh %machine% "sudo cat /var/run/udhcpc.eth0.pid | xargs sudo kill -9"

docker-machine ssh %machine% "sudo ifconfig eth0 192.168.%ipx%.%ipy% netmask 255.255.255.0 broadcast 192.168.%ipx%.255 up"
1
changeip.bat <machine-name> 99 100
1
docker-machine regenerate-certs <machine-name>