教程示例
搜索可用的
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,官方入门示例。下载容器镜像
$ docker pull learn/tutorial Pulling repository learn/tutorial 8dbd9e392a96: Downloading [=================> ] 20 MB/58.34 MB 7m40s在
docker容器中运行hello world!$ docker run learn/tutorial echo "hello word" hello word在容器中安装新的程序
$ docker run learn/tutorial apt-get install -y ping在执行
apt-get命令的时候,要带上-y参数。如果不指定-y参数的话,apt-get命令会进入交互模式,需要用户输入命令来进行确认,但在docker环境中是无法响应这种交互的。保存对容器的修改
$ 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。运行新的镜像
$docker run learn/ping ping www.sina.com.cn
网上对Docker的理解
每个container中运行的进程,是的的确确运行在
host上的(用ps 可以查看的到), 这样的话,无论你的镜像是基于ubuntu,centos, 还是debian的,都是运行在主机内核上的(container中没有自己的内核)。也就是说如果主机内核不满足需求,container中的依赖此特性的应用程序就无法运行
Image的分层,可以想象成photoshop中不同的layer。每一层中包含特定的文件,当container运行时,这些叠加在一起的层就构成了container的运行环境(包括相应的文件,运行库等,不包括内核)。Image通过依赖的关系,来确定整个镜像内到底包含那些文件。之后的版本的docker,会推出squash的功能,把不同的层压缩成为一个,和Photoshop中合并层的感觉差不多。
Docker中的镜像就是一堆文件的集合,并不是像VM那样的是一个操作系统。镜像可以简单到只有一个程序文件。如果你写一个helloworld静态编译后放到一个空的Image中(可以用FROM scratch作为基础镜像),那么整个image的大小,就是你编译后的二进制文件的大小。 如果你不是静态编译的话,就要把相应的链接库放到镜像中相应的位置,才能使得程序正确运行,否则会提示找不到文件。官方提供的ubuntu等基础镜像,就是把依赖的文件放到正确的地方,从而使得绝大部分程序可以正常运行。和VM的镜像是完全不同的概念
Docker能够限制container使用的主机资源。lxc container是docker最早版本的运行环境,现在他们默认采用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上还有很多第三方的库,支持不同的语言
相关资料
- Docker —— 从入门到实践
- 深入浅出Docker(一):Docker核心技术预览
- 深入浅出Docker(二):Docker命令行探秘
- 深入浅出Docker(三):Docker开源之路
- 深入浅出Docker(四):Docker的集成测试部署之道
- 深入浅出Docker(五):基于Fig搭建开发环境
- 深入浅出Docker(六):像谷歌一样部署你的应用
