从零开始学习Docker(二、区分docker环境和docker虚拟机环境)
Docker运行环境(为简便起见,我在这里称之为docker shell)和虚拟机环境(此处称之为docker vm shell)是两个不同的环境,如果不理解这一点,后面的学习,特别是涉及到目录访问的操作,就会迷惑不解。
什么是docker环境(docker shell)
docker shell是一个负责与docker服务器端进程通信的命令行程序,它也是Linux内核。docker启动时默认创建或启动一个default虚拟机,在当前环境执行的docker命令,默认都作用到default虚拟机上。
我用的操作系统是Windows7,安装docker toolbox后,桌面上就有了Docker QuickStart Terminal快捷键,双机开启进入默认虚拟机。现在进入的其实是docker shell,而不是docker vm shell。如下图所示:
表面上看,docker shell启动时,必然会启动default虚拟机,两个貌似是一个东西,但docker shell就是docker shell,你可以把它想象成一个独立的操作系统,只不过默认在里面运行了一套default虚拟机而已。在docker shell中执行如下命令,目的是在docker环境根目录下创建一个testDockerShell文件夹,以备后验:
mkdir /testDockerShell
docker虚拟机环境
实现这一点,必须要知道虚拟机的IP地址,在docker shell中输入下面的命令,查看其ip地址:
docker-machine ls
docker虚拟机连接推荐使用XShell终端程序。新建连接,输入docker虚拟机IP地址,连接用户名为docker,密码为tcuser,这是每个docker虚拟机初始的用户名和密码。连接成功后即进入了docker虚拟机环境,我们称之为docker VM shell。如下图:
在docker VM shell中输入 ls /
命令,其根目录下的内容与docker shell是不一样的。足以证明,这是两个不同的环境。一定要理解。
两个环境之间的关系
一句话,docker shell与docker vm shell之间是母子关系。所有的docker虚拟机必须在docker shell 中使用docker-machine create命令创建。而一旦创建完成,docker虚拟机可以使用docker shell操作,也可以使用其他的shell操作。正所谓“儿大不由娘”。
容易混淆两个环境概念的场景
docker 官方文档Get Started,Part5中,配置redis服务,docker-compose.yml文件中代码片段如下:
redis:
image: redis
ports:
- "6379:6379"
volumes:
- /home/docker/data:/data
deploy:
placement:
constraints: [node.role == manager]
command: redis-server --appendonly yes
networks:
- webnet
其中volumes属性:将虚拟机中的/home/docker/data目录映射到container的/data目录,这样可以使得,redis数据保存到container的同时,也就保存到虚拟机上了,两个数据其实是同一份数据。可以避免虚拟机重启后redis原有的数据丢失。
容易混淆的错误操作是:在docker shell上mkdir /home/docker/data -p
这样会导致redis服务由于在虚拟机上找不到该目录而不能启动,error:”invalid mount config for type”或者”invalid bind mount source”。
正确做法:在docker vm shell上执行:
mkdir /home/docker/data -p
然后再在docker shell上部署服务:
docker stack deploy -c docker-compose.yml <service name> --with-registry-auth