docker
1 docker简介
Docker 提供了一个可以运行你的应用程序的封套(envelope) ,或者说容器。它原本是 dotCloud 启动的一个业余项目,并在前些时候开源了。它吸引了大量的关注和讨论,导致 dotCloud 把它重命名到 Docker Inc 。它最初是用 Go 语言编写的,它就相当于是加在 LXC (LinuX Containers ,linux 容器)上的管道,允许开发者在更高层次的概念上工作。
Docker 扩展了 Linux 容器(Linux Containers ),或着说 LXC ,通过一个高层次的 API 为进程单独提供了一个轻量级的虚拟环境。Docker 利用了 LXC , cgroups 和 Linux 自己的内核。和传统的虚拟机不同的是,一个 Docker 容器并不包含一个单独的操作系统,而是基于已有的基础设施中操作系统提供的功能来运行的。
Docker类似虚拟机的概念,但是与虚拟化技术的不同点在于下面几点:
1.虚拟化技术依赖物理CPU 和内存,是硬件级别的;而docker 构建在操作系统上,利用操作系统的containerization 技术,所以docker 甚至可以在虚拟机上运行。
2.虚拟化系统一般都是指操作系统镜像,比较复杂,称为“ 系统” ;而docker 开源而且轻量,称为“ 容器” ,单个容器适合部署少量应用,比如部署一个redis 、一个memcached 。
3.传统的虚拟化技术使用快照来保存状态;而docker 在保存状态上不仅更为轻便和低成本,而且引入了类似源代码管理机制,将容器的快照历史版本一一记录,切换成本很低。
4.传统的虚拟化技术在构建系统的时候较为复杂,需要大量的人力;而docker 可以通过Dockfile 来构建整个容器,重启和构建速度很快。更重要的是Dockfile 可以手动编写,这样应用程序开发人员可以通过发布Dockfile 来指导系统环境和依赖,这样对于持续交付十分有利。
5.Dockerfile可以基于已经构建好的容器镜像,创建新容器。Dockerfile 可以通过社区分享和下载,有利于该技术的推广。
Docker 会像一个可移植的容器引擎那样工作。它把应用程序及所有程序的依赖环境打包到一个虚拟容器中,这个虚拟容器可以运行在任何一种 Linux 服务器上。这大大地提高了程序运行的灵活性和可移植性,无论需不需要许可、是在公共云还是私密云、是不是裸机环境等等。
Docker也是一个云计算平台,它利用Linux 的LXC 、AUFU 、Go 语言、cgroup 实现了资源的独立,可以很轻松的实现文件、资源、网络等隔离,其最终的目标是实现类似PaaS 平台的应用隔离。
Docker 由下面这些组成:
1. Docker 服务器守护程序(server daemon ),用于管理所有的容器。
2. Docker 命令行客户端,用于控制服务器守护程序。
3. Docker 镜像:查找和浏览 docker 容器镜像。
2 docker特性
文件系统隔离:每个进程容器运行在完全独立的根文件系统里。
资源隔离:可以使用cgroup 为每个进程容器分配不同的系统资源,例如CPU 和内存。
网络隔离:每个进程容器运行在自己的网络命名空间里,拥有自己的虚拟接口和IP 地址。
写时复制:采用写时复制方式创建根文件系统,这让部署变得极其快捷,并且节省内存和硬盘空间。
日志记录:Docker 将会收集和记录每个进程容器的标准流(stdout/stderr/stdin ),用于实时检索或批量检索。
变更管理:容器文件系统的变更可以提交到新的映像中,并可重复使用以创建更多的容器。无需使用模板或手动配置。
交互式Shell :Docker 可以分配一个虚拟终端并关联到任何容器的标准输入上,例如运行一个一次性交互shell 。
3 两个基础概念images与container
Container和Image 在Docker 的世界里,Image 是指一个只读的层(Layer ),这里的层是AUFS 里的概念,最直观的方式就是看一下docker 官方给出的图:
Docker使用了一种叫AUFS 的文件系统,这种文件系统可以让你一层一层地叠加修改你的文件,最底下的文件系统是只读的,如果需要修改文件,AUFS 会增加一个可写的层(Layer ),这样有很多好处,例如不同的Container 可以共享底层的只读文件系统(同一个Kernel ),使得你可以跑N 多个Container 而不至于你的硬盘被挤爆了!这个只读的层就是Image !而如你所看到的,一个可写的层就是Container 。
那Image 和Container 的区别是什么?很简单,他们的区别仅仅是一个是只读的层,一个是可写的层,你可以使用docker commit 命令,将你的Container 变成一个Image ,也就是提交你所运行的Container 的修改内容,变成一个新的只读的Image ,这非常类似于git commit 命令。
4 docker安装与启动
安装docker
[root@localhost /]# yum -y install docker-io
更改配置文件
[root@localhost /]# vi /etc/sysconfig/docker
other-args列更改为:other_args="--exec-driver=lxc --selinux-enabled"
启动docker 服务
[root@localhost /]# service docker start
Starting cgconfig service: [ OK ]
Starting docker: [ OK ]
将docker 加入开机启动
[root@localhost /]# chkconfig docker on
基本信息查看
docker version: 查看docker的版本号,包括客户端、服务端、依赖的Go 等
[root@localhost /]# docker version
Client version: 1.0.0
Client API version: 1.12
Go version (client): go1.2.2
Git commit (client): 63fe64c/1.0.0
Server version: 1.0.0
Server API version: 1.12
Go version (server): go1.2.2
Git commit (server): 63fe64c/1.0.0
docker info : 查看系统(docker)层面信息,包括管理的images, containers 数等
[root@localhost /]# docker info
Containers: 16
Images: 40
Storage Driver: devicemapper
Pool Name: docker-253:0-1183580-pool
Data file: /var/lib/docker/devicemapper/devicemapper/data
Metadata file: /var/lib/docker/devicemapper/devicemapper/metadata
Data Space Used: 2180.4 Mb
Data Space Total: 102400.0 Mb
Metadata Space Used: 3.4 Mb
Metadata Space Total: 2048.0 Mb
Execution Driver: lxc-0.9.0
Kernel Version: 2.6.32-431.el6.x86_64
5 镜像的获取与容器的使用
镜像可以看作是包含有某些软件的容器系统,比如ubuntu 就是一个官方的基础镜像,很多镜像都是基于这个镜像“ 衍生” ,该镜像包含基本的ubuntu 系统。再比如,hipache 是一个官方的镜像容器,运行后可以支持http 和websocket 的代理服务,而这个镜像本身又基于ubuntu 。
搜索镜像
docker search <image>:在docker index 中搜索image
[root@localhost /]# docker search ubuntu12.10
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mirolin/ubuntu12.10 0
marcgibbons/ubuntu12.10 0
mirolin/ubuntu12.10_redis 0
chug/ubuntu12.10x32 Ubuntu Quantal Quetzal 12.10 32bit base i... 0
chug/ubuntu12.10x64 Ubuntu Quantal Quetzal 12.10 64bit base i... 0
下载镜像
docker pull <image> :从docker registry server 中下拉image
[root@localhost /]# docker pull chug/ubuntu12.10x64
查看镜像
docker images: 列出images
docker images -a :列出所有的images (包含历史)
docker images --tree :显示镜像的所有层(layer)
docker rmi <image ID>: 删除一个或多个image
[root@localhost /]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
chug/ubuntu12.10x64 latest 0b96c14dafcd 4 months ago 270.3 MB
[root@localhost /]# docker images -a
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
chug/ubuntu12.10x64 latest 0b96c14dafcd 4 months ago 270.3 MB
<none> <none> 31edfed3bb88 4 months ago 175.8 MB
[root@localhost /]# docker images --tree
Warning: '--tree' is deprecated, it will be removed soon. See usage.
└─31edfed3bb88 Virtual Size: 175.8 MB
└─0b96c14dafcd Virtual Size: 270.3 MB Tags: chug/ubuntu12.10x64:latest
[root@localhost /]# docker rmi <image ID> ....
使用镜像创建容器
[root@localhost /]# docker run chug/ubuntu12.10x64 /bin/echo hello world
hello world
交互式运行
[root@localhost /]# docker run -i -t chug/ubuntu12.10x64 /bin/bash
root@2161509ff65e:/#
查看容器
docker ps :列出当前所有正在运行的container
docker ps -l :列出最近一次启动的container
docker ps -a :列出所有的container (包含历史,即运行过的container )
docker ps -q :列出最近一次运行的container ID
[root@localhost /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ccf3de663dc9 chug/ubuntu12.10x64:latest /bin/bash 22 hours ago Up 22 hours sharp_hypatia
[root@localhost /]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f145f184647b chug/ubuntu12.10x64:latest /bin/bash 6 seconds ago Exited (0) 3 seconds ago compassionate_galileo
[root@localhost /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f145f184647b chug/ubuntu12.10x64:latest /bin/bash 30 seconds ago Exited (0) 26 seconds ago compassionate_galileo
f4624b42fe7e chug/ubuntu12.10x64:latest /bin/bash 2 minutes ago Exited (0) 2 minutes ago sharp_wilson
ccf3de663dc9 chug/ubuntu12.10x64:latest /bin/bash 22 hours ago Up 22 hours sharp_hypatia
9cbaa79b9703 chug/ubuntu12.10x64:latest /bin/bash 22 hours ago Exited (127) 36 minutes ago berserk_mcclintock
2161509ff65e chug/ubuntu12.10x64:latest /bin/bash 22 hours ago Exited (0) 22 hours ago backstabbing_mclean
[root@localhost /]# docker ps -q
ccf3de663dc9
再次启动容器
docker start/stop/restart <container> :开启/ 停止/ 重启container
docker start [container_id] :再次运行某个container (包括历史container )
docker attach [container_id] :连接一个正在运行的container 实例(即实例必须为start 状态,可以多个窗口同时attach 一个container 实例)
docker start -i <container> :启动一个container 并进入交互模式(相当于先start ,在attach )
docker run -i -t <image> /bin/bash :使用image 创建container 并进入交互模式, login shell 是/bin/bash
docker run -i -t -p <host_port:contain_port> :映射 HOST 端口到容器,方便外部访问容器内服务,host_port 可以省略,省略表示把 container_port 映射到一个动态端口。
注:使用start 是启动已经创建过得container ,使用run 则通过image 开启一个新的container 。
删除容器
docker rm <container...> :删除一个或多个container
docker rm `docker ps -a -q` :删除所有的container
docker ps -a -q | xargs docker rm :同上, 删除所有的container
6 持久化容器与镜像
6.1 通过容器生成新的镜像
运行中的镜像称为容器。你可以修改容器(比如删除一个文件),但这些修改不会影响到镜像。不过,你使用docker commit <container-id> <image-name> 命令可以把一个正在运行的容器变成一个新的镜像。
docker commit <container> [repo:tag] 将一个container 固化为一个新的image ,后面的repo:tag 可选。
[root@localhost /]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
chug/ubuntu12.10x64 latest 0b96c14dafcd 4 months ago 270.3 MB
[root@localhost /]# docker commit d0fd23b8d3ac chug/ubuntu12.10x64_2
daa11948e23d970c18ad89c9e5d8972157fb6f0733f4742db04219b9bb6d063b
[root@localhost /]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
chug/ubuntu12.10x64_2 latest daa11948e23d 6 seconds ago 270.3 MB
chug/ubuntu12.10x64 latest 0b96c14dafcd 4 months ago 270.3 MB
6.2 持久化容器
export命令用于持久化容器
docker export <CONTAINER ID> > /tmp/export.tar
6.3 持久化镜像
Save命令用于持久化镜像
docker save 镜像ID > /tmp/save.tar
6.4 导入持久化container
删除container 2161509ff65e
导入export.tar 文件
[root@localhost /]# cat /tmp/export.tar | docker import - export:latest
af19a55ff0745fb0a68655392d6d7653c29460d22d916814208bbb9626183aaa
[root@localhost /]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
export latest af19a55ff074 34 seconds ago 270.3 MB
chug/ubuntu12.10x64_2 latest daa11948e23d 20 minutes ago 270.3 MB
chug/ubuntu12.10x64 latest 0b96c14dafcd 4 months ago 270.3 MB
6.5 导入持久化image
删除image daa11948e23d
导入save.tar 文件
[root@localhost /]# docker load < /tmp/save.tar
对image 打tag
[root@localhost /]# docker tag daa11948e23d load:tag
6.6 export-import与save-load 的区别
导出后再导入(export-import) 的镜像会丢失所有的历史,而保存后再加载(save-load )的镜像没有丢失历史和层(layer) 。这意味着使用导出后再导入的方式,你将无法回滚到之前的层(layer) ,同时,使用保存后再加载的方式持久化整个镜像,就可以做到层回滚。(可以执行docker tag <LAYER ID> <IMAGE NAME> 来回滚之前的层)。
6.7 一些其它命令
docker logs $CONTAINER_ID #查看docker 实例运行日志,确保正常运行
docker inspect $CONTAINER_ID #docker inspect <image|container> 查看image 或container 的底层信息
docker build <path> 寻找path 路径下名为的Dockerfile 的配置文件,使用此配置生成新的image
docker build -t repo[:tag] 同上,可以指定repo 和可选的tag
docker build - < <dockerfile> 使用指定的dockerfile 配置文件,docker 以stdin 方式获取内容,使用此配置生成新的image
docker port <container> <container port> 查看本地哪个端口映射到container 的指定端口,其实用docker ps 也可以看到
7 一些使用技巧
7.1 docker文件存放目录
Docker实际上把所有东西都放到/var/lib/docker 路径下了。
[root@localhost docker]# ls -F
containers/ devicemapper/ execdriver/ graph/ init/ linkgraph.db repositories-devicemapper volumes/
containers目录当然就是存放容器(container )了,graph 目录存放镜像,文件层(file system layer )存放在graph/imageid/layer 路径下,这样我们就可以看看文件层里到底有哪些东西,利用这种层级结构可以清楚的看到文件层是如何一层一层叠加起来的。
7.2 查看root 密码
docker容器启动时的root 用户的密码是随机分配的。所以,通过这种方式就可以得到容器的root 用户的密码了。
docker logs 5817938c3f6e 2>&1 | grep 'User: ' | tail -n1
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com