教程示例
搜索可用的
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(六):像谷歌一样部署你的应用