Docker - 虚拟化系统

2016-08-10


官网:https://www.docker.com/

和虚拟机的不同之处就是,虚拟机是在硬件层面的模拟,而 Docker 是用系统提供的软件容器接口来实现模拟, Docker 占用资源比虚拟机要小。

但是 Docker 在 Mac 下的体验并不好,一天之内遇到了好几次 crashed. 而且容器内访问主机的文件速度非常慢。

各个教程讲得都很详细,什么是镜像,什么是容器,怎么使用等等,我就不重复了,没什么意义。 我只记录一下我自己的使过程,方便以后查看。

  1. 去 Docker 仓库: https://hub.docker.com/ 找到想要的镜像

  2. 获取镜像

    docker pull ubuntu:14.04
    
  3. 列出本地的所有镜像

    docker images
    
  4. 基于这个镜像启动和创建一个容器
    -i 参数表示打开容器的标准输入
    -t 参数表示分配一个伪终端并绑定到容器的标准输入上,这样我们可以通过终端和容器进行交互
    bash 让容器运行这个命令

    docker run -it ubuntu:14.04 bash
    
  5. 使用 exit 命令退出容器,容器中指定的应用终结时,容器也自动终止,所以我们退出终端,容器就自动终止了

  6. 查看已经终止的容器

    docker ps -a
    
  7. 重新启动容器

    docker start bd8259c5f77d
    
  8. 再次和这个容器进行交互

    docker exec -it bd8259c5f77d bash
    
  9. 将这个容器的修改提交,生成一个新的镜像

    docker stop bd8259c5f77d
    docker commit bd8259c5f77d some-image-name:v0.1
    

实际操作

  1. 获取或者更新镜像

    docker pull ubuntu:14.04
    
  2. 列出本地的所有镜像

    docker images
    
  3. 创建一个容器,并且通过终端进行交互

    docker run -it ubuntu:14.04 bash
    
  4. 在容器中配置一些环境,安装 MySQL, Ruby 等

    apt-get update
    apt-get install mysql-server mysql-client libmysqlclient-dev
    ...
    
  5. 提交修改,生成新的镜像。72d0d8a85e18 可通过 docker ps -a 来查看

    docker commit -m "some messages" -a "author" 72d0d8a85e18 some-image-name:0.1
    
  6. 从新的镜像运行,映射端口,挂载主机文件夹

    docker run -it -v host-code-dir:/root/Code -p 53306:3306 some-image-name:0.1 bash
    
  7. 如果我们还需要在镜像运行的使用启动 MySQL 等,可以这么做

    1. 建立启动脚本

      vi /root/start.sh
      

      例如需要启动 MySQL 和 Bash

      #!/bin/bash
      
      /etc/init.d/mysql start
      /bin/bash
      
    2. 赋予可执行权限

      chmod +x /root/start.sh
      
    3. 下次可以这么启动镜像

      docker run -it -v host-code-dir:/root/Code -p 53306:3306 some-image-name:0.1 /root/start.sh
      
  8. 修改了一些东西再次提交

  9. 我们可以通过 docker history IMAGE 来查看提交的信息,
    如果我们需要导出镜像,直接使用 docker save 会将提交的所有信息保留,有时候我们不希望这么做, 我们希望导出最后的版本,不要附加提交的所有信息

    参考:http://tuhrig.de/flatten-a-docker-container-or-image/

    docker run IMAGE
    docker export <CONTAINER ID> | docker import - some-image-name:0.2
    
  10. 导出镜像

    docker save -o some-image-name-0.2.tar some-image-name:0.2
    
  11. 导入镜像

    docker load --input some-image-name-0.2.tar
    

一些有用的命令

  • 停止所有的容器

    docker stop $(docker ps -a -q)
    
  • 删除所有的容器

    docker rm $(docker ps -a -q)