从零开始学习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
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐