Docker入门

Docker简介

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架或包装系统。

环境准备

  • 操作系统

      Centos 6.5
    
  • epel库

      sudo yum install http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
    
  • 关闭SElinux

      sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config
    

安装

yum install docker-io

使用

  • 启动

      service docker start
    
  • 安装centos镜像

      #docker pull centos
      Pulling repository centos
      0c752394b855: Download complete 
      539c0211cd76: Download complete 
      511136ea3c5a: Download complete 
      34e94e67e63a: Download complete 
    

    docker支持的image完整列表详见https://registry.hub.docker.com/

  • 查看安装好的镜像

      #docker images
      REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
      centos              centos6             0c752394b855        3 weeks ago         124.1 MB
      centos              latest              0c752394b855        3 weeks ago         124.1 MB
      centos              6.4                 539c0211cd76        15 months ago       300.6 MB
    
  • 在centos容器中运行bash

      docker run -t -i ubuntu /bin/bash
    
  • 提交容器至仓库

      #docker ps -a
      CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                         PORTS               NAMES
      cc7200c7333d        centos:centos6      /bin/bash              57 seconds ago      Exited (0) 2 seconds ago                           tender_mestorf       
      12a41f309c4d        centos:centos6      /bin/bash              13 minutes ago      Exited (127) 13 minutes ago                        high_bartik          
      21c0aa5fc889        centos:centos6      /bin/bash              16 minutes ago      Exited (127) 13 minutes ago                        agitated_fermi
    
      #docker commit 21c0aa5fc889 centos
    

    在Dockerfile指定的VOLUME目录,commit后无法保存

  • 导出保存的镜像

      docker save centos > /tmp/centos.tar
    
  • 导入保存的镜像

      docker load < centos.tar
    
  • 导出容器

      docker export <CONTAINER ID> > /home/export.tar
    
  • 导入容器

      docker import export.tar
    

    关于export/import与save/load的区别:
    导出后再导入(export/import/)的镜像会丢失所有的历史,而保存后再加载(save/load)的镜像没有丢失历史和层(layer) ;
    使用导出后再导入的方式,你将无法回滚到之前的层(layer);
    使用保存后再加载的方式持久化整个镜像,可以做到层回滚(可以执行docker tag \ 来回滚之前的层)。

  • 删除镜像

      先删除容器
      docker rm `docker ps -q`
      在删除镜像
      docker rmi  'IMAGE ID'
    

    Error: No such id:d1701048d644d55a1d4bd6c5eb7f9e0f1c35620d572014/07/02 08:21:57
    Error: failed to remove one or more images
    先删除全部未使用的容器,再删除镜像
    docker rm `docker ps -a -q`
    docker rmi ‘IMAGE ID’

  • 使用ssh

      #启动容器,安装ssh
      docker run -i -t centos /bin/bash
      yum install openssh-server
      exit
    
      #启动容器并启动ssh
      docker run -d -p 22 centos/ssh /usr/sbin/sshd -D
      docker ps
      CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                   NAMES
      adf65729daba        centos/ssh:latest   /usr/sbin/sshd -D   5 minutes ago       Up 5 minutes        0.0.0.0:49153->22/tcp   goofy_goodall 
    
      #可以看到,宿主机的49153端口被映射为容器的ssh端口 
    
  • 持久化数据

      docker -v host_dir:container_dir[:rw|:ro]
      docker run -d -p 80:80 -v /tmp:/data:rw dev/tomcat