Docker学习<2>入门

教程示例

入门教程

  1. 搜索可用的docker镜像

     $ docker search tutorial
     NAME                                       DESCRIPTION   STARS     OFFICIAL   AUTOMATED
     learn/tutorial                                           8                    
     caterpillar/java-tutorial                                2                    
     caterpillar/python-tutorial                              2                    
     florentbenoit/docker-angularjs-tutorials                 1                    [OK]
     fabioberger/dockerize-tutorial                           0                    [OK]
     tobegit3hub/tutorial-beego                               0                    [OK]
     wonderlamb/tutorial                        Tutorial      0                    
     kedarvaidya/rails-tutorial-v3-dev                        0                    [OK]
    

    找到 learn/tutorial,官方入门示例。

  2. 下载容器镜像

     $ docker pull learn/tutorial
     Pulling repository learn/tutorial
     8dbd9e392a96: Downloading [=================>                                 ]    20 MB/58.34 MB 7m40s
    
  3. docker容器中运行hello world!

     $ docker run learn/tutorial echo "hello word"
     hello word
    
  4. 在容器中安装新的程序

     $ docker run learn/tutorial apt-get install -y ping
    

    在执行apt-get 命令的时候,要带上-y参数。如果不指定-y参数的话,apt-get命令会进入交互模式,需要用户输入命令来进行确认,但在docker环境中是无法响应这种交互的。

  5. 保存对容器的修改

     $ docker ps -l
     CONTAINER ID        IMAGE                   COMMAND                CREATED             STATUS              PORTS               NAMES
     942f628e4d4f        learn/tutorial:latest   "ping www.sina.com.cn   7 seconds ago                                               modest_heisenberg   
     $ docker commit 942 learn/ping
     94015fcbbe9bdf9d788ba2085de6d7409cf9cf52a7899fa3313363505fb949bc
     $ docker images
     REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
     learn/ping          latest              94015fcbbe9b        15 seconds ago      128 MB
     centos              7                   88f9454e60dd        2 weeks ago         223.9 MB
     centos              centos7             88f9454e60dd        2 weeks ago         223.9 MB
     centos              latest              88f9454e60dd        2 weeks ago         223.9 MB
     learn/tutorial      latest              8dbd9e392a96        23 months ago       128 MB
    

    首先使用docker ps -l命令获得安装完ping命令之后容器的id。然后把这个镜像保存为learn/ping

  6. 运行新的镜像

     $docker run learn/ping ping www.sina.com.cn
    

网上对Docker的理解

  1. 每个container中运行的进程,是的的确确运行在host上的(用ps 可以查看的到), 这样的话,无论你的镜像是基于ubuntu, centos, 还是debian的,都是运行在主机内核上的(container中没有自己的内核)。也就是说如果主机内核不满足需求,container中的依赖此特性的应用程序就无法运行

  2. Image的分层,可以想象成photoshop中不同的layer。每一层中包含特定的文件,当container运行时,这些叠加在一起的层就构成了container的运行环境(包括相应的文件,运行库等,不包括内核)。Image通过依赖的关系,来确定整个镜像内到底包含那些文件。之后的版本的docker,会推出squash的功能,把不同的层压缩成为一个,和Photoshop中合并层的感觉差不多。

  3. Docker中的镜像就是一堆文件的集合,并不是像VM那样的是一个操作系统。镜像可以简单到只有一个程序文件。如果你写一个helloworld 静态编译后放到一个空的Image中(可以用FROM scratch作为基础镜像),那么整个image的大小,就是你编译后的二进制文件的大小。 如果你不是静态编译的话,就要把相应的链接库放到镜像中相应的位置,才能使得程序正确运行,否则会提示找不到文件。官方提供的ubuntu等基础镜像,就是把依赖的文件放到正确的地方,从而使得绝大部分程序可以正常运行。和VM的镜像是完全不同的概念

  4. Docker能够限制container使用的主机资源。lxc containerdocker最早版本的运行环境,现在他们默认采用libcontainer,今后估计会逐步减少lxc container的支持。如果要限制cpu和memory,在docker run 中直接使用-c -m参数即可。个人认为,这只是限制了container的资源,并不能够保证container能够确实分到足够的资源。当然,如果你的所有程序都是运行在container中,并且都限制好资源的话,那么应该还是可以满足你的需求的。每台host中,可以同时运行上百个container,互不干扰。每个container只是一个host中的进程,很轻量化。VM就不能做到同时运行这么多。编程接口,docker提供了Remote API和python library(docker-py), 同时还有github上还有很多第三方的库,支持不同的语言

相关资料

相关资源