docker菜鸟⼊门
11.Docker概念简介
21.1 Docker的应⽤场景
31.2 Docker的优势
41.3 Docker架构
51.4 Dorcker核⼼概念
61.4.1 Dockerfile、Docker镜像和Docker容器的关系
71.4.2 Dockerfile与Docker镜像
81.4.3 Docker镜像与Docker容器的关系
91.5 Docker特性
101.6传统虚拟技术的区别
111.7 docker 的四种⽹络模式
122. Docker的安装
133. Docker命令
143.1容器相关操作
153.2获取容器相关信息
163.3导出容器
173.4镜像操作
183.5镜像仓库(registry)操作
193.6 docker其他命令使⽤⽰例
203.7 docker run详解
213.8 docker build
224.Docker镜像库操作
235. Dockerfile
246.Docker镜像的存储位置
257.⼀键部署tomcat
⽬录
1.Docker概念简介
Docker 是⼀个开源的应⽤容器引擎,基于并遵从Apache2.0协议开源。
Docker 可以让开发者打包他们的应⽤以及依赖包到⼀个轻量级、可移植的容器中,然后发布到任何流⾏的 Linux 机器上,也可以实现虚拟化。
容器是完全使⽤沙箱机制,相互之间不会有任何接⼝(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker 和传统虚拟化⽅式的不同之处,可见容器是在操作系统层⾯上实现虚拟化,直接复⽤本地主机
的操作系统,⽽传统⽅式则是在硬件层⾯实现。
1.1 Docker的应⽤场景
a) Web 应⽤的⾃动化打包和发布。
b) ⾃动化测试和持续集成、发布。
c) 在服务型环境中部署和调整数据库或其他的后台应⽤。
d) 从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建⾃⼰的PaaS环境。
docker打包镜像1.2 Docker的优势
更快速的交付和部署
Docker在整个开发周期都可以完美的辅助你实现快速交付。Docker允许开发者在装有应⽤和服务本地容器做开发。可以直接集成到可持续开发流程中。
例如:开发者可以使⽤⼀个标准的镜像来构建⼀套开发容器,开发完成之后,运维⼈员可以直接使⽤这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应⽤程序,并让整个过程全程可见,使
团队中的其他成员更容易理解应⽤程序是如何创建和⼯作的。 Docker 容器很轻很快!容器的启动时间是秒级的,⼤量地节约开发、测试、部署的时间。
⾼效的部署和扩容
Docker 容器⼏乎可以在任意的平台上运⾏,包括物理机、虚拟机、公有云、私有云、个⼈电脑、服务器等。这种兼容性可以让⽤户把⼀个应⽤程序从⼀个平台直接迁移到另外⼀个。
Docker的兼容性和轻量特性可以很轻松的实现负载的动态管理。你可以快速扩容或⽅便的下线的你的应⽤和服务,这种速度趋近实时。
更⾼的资源利⽤率
Docker 对系统资源的利⽤率很⾼,⼀台主机上可以同时运⾏数千个 Docker 容器。容器除了运⾏其中应⽤外,基本不消耗额外的系统资源,使得应⽤的性能很⾼,同时系统的开销尽量⼩。传统虚拟机⽅式运⾏ 10 个不同的应⽤就要起 10 个虚拟机,⽽Docker 只需要启动 10 个隔离的应⽤即可。
更简单的管理
使⽤ Docker,只需要⼩⼩的修改,就可以替代以往⼤量的更新⼯作。所有的修改都以增量的⽅式被分发和更新,从⽽实现⾃动化并且⾼效的管理。
1.3 Docker架构
Docker使⽤C/S架构,Client 通过接⼝与Server进程通信实现容器的构建,运⾏和发布。client和server可以运⾏在同⼀台集,也可以通过跨主机实现远程通信。
1.4 Dorcker核⼼概念
镜像(image)
Docker 镜像(Image)就是⼀个只读的模板。镜像可以⽤来创建 Docker 容器,⼀个镜像可以创建很多容器。Docker 提供了⼀个很简单的机制来创建镜像或者更新现有的镜像,⽤户甚⾄可以直接从其他⼈那⾥下载⼀个已经做好的镜像来直接使⽤。
容器(container)
Docker 利⽤容器(Container)独⽴运⾏的⼀个或⼀组应⽤。容器是从镜像创建的运⾏实例。它可以被启动、开始、停⽌、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是⼀个简易版的 Linux 环境(包括root⽤户权限、进程空间、⽤户空间和⽹络空间等)和运⾏在其中的应⽤程序。
容器的定义和镜像⼏乎⼀模⼀样,也是⼀堆层的统⼀视⾓,唯⼀区别在于容器的最上⾯那⼀层是可读可写的。
仓库(repository)
仓库(Repository)是集中存放镜像⽂件的场所。有时候会把仓库和仓库注册服务器(Registry)混为⼀谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中⼜包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最⼤的公开仓库是 Docker Hub,存放了数量庞⼤的镜像供⽤户下载。国内的公开仓库包括时速云、⽹易云等,可以提供⼤陆⽤户更稳定快速的访问。当然,⽤户也可以在本地⽹络内创建⼀个私有仓库。
当⽤户创建了⾃⼰的镜像之后就可以使⽤ push 命令将它上传到公有或者私有仓库,这样下次在另外⼀台机器上使⽤这个镜像时候,只需要从仓库上 pull 下来就可以了。
Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。
1.4.1 Dockerfile、Docker镜像和Docker容器的关系
Dockerfile 是软件的原材料,Docker 镜像是软件的交付品,⽽ Docker 容器则可以认为是软件的运⾏态。从应⽤软件的⾓度来
看,Dockerfile、Docker 镜像与 Docker 容器分别代表软件的三个不同阶段,Dockerfile ⾯向开发,Docker 镜像成为交付标准,Docker 容器则涉及部署与运维,三者缺⼀不可,合⼒充当 Docker 体系的基⽯。
简单来讲,Dockerfile构建出Docker镜像,通过Docker镜像运⾏Docker容器。
我们可以从Docker容器的⾓度,来反推三者的关系。⾸先可以来看下图:
我们假设这个容器的镜像通过以下Dockerfile构建⽽得:
简单的dockerfile
1 FROM ubuntu:14.04
2 ADD run.sh /
3 VOLUME /data
4 CMD ["./run.sh"]
1.4.2 Dockerfile与Docker镜像
⾸先,我们结合上图来看看Dockerfile与Docker镜像之间的关系。
FROM ubuntu:14.04:设置基础镜像,此时会使⽤基础镜像 ubuntu:14.04 的所有镜像层,为简单起见,图中将其作为⼀个整体展⽰。ADD run.sh /:将 Dockerfile 所在⽬录的⽂件 run.sh 加⾄镜像的根⽬录,此时新⼀层的镜像只有⼀项内容,即根⽬录下的 run.sh。
VOLUME /data:设定镜像的 VOLUME,此 VOLUME 在容器内部的路径为 /data。需要注意的是,此时并未在新⼀层的镜像中添加任何⽂件,即构建出的磁层镜像中⽂件为空,但更新了镜像的 json ⽂件,以便通过此镜像启动容器时获取这⽅⾯的信息。
CMD ["./run.sh"]:设置镜像的默认执⾏⼊⼝,此命令同样不会在新建镜像中添加任何⽂件,仅仅在上⼀层镜像 json ⽂件的基础上更新新建镜像的 json ⽂件。
因此,通过以上分析,以上的Dockerfile可以构建出⼀个新的镜像,包含4个镜像层,每⼀条命令会和⼀个镜像层对应,镜像之间会存在⽗⼦关系。图中很清楚的表明了这些关系。
1.4.3 Docker镜像与Docker容器的关系
Docker镜像是Docker容器运⾏的基础,没有Docker镜像,就不可能有Docker容器,这也是Docker的设计原则之⼀。
可以理解的是:Docker镜像毕竟是镜像,属于静态的内容;⽽Docker容器就不⼀样了,容器属于动态的内容。动态的内容,⼤家很容易联想到进程,内存,CPU等之类的东西。的确,Docker容器作为动态的内容,都会包含这些。
为了便于理解,⼤家可以把Docker容器,理解为⼀个或多个运⾏进程,⽽这些运⾏进程将占有相应的内存,相应的CPU计算资源,相应的虚拟⽹络设备以及相应的⽂件系统资源。⽽Docker容器所占⽤的⽂件系统资源,则通过Docker镜像的镜像层⽂件来提供。
那么作为静态的镜像,如何才有能⼒转化为⼀个动态的Docker容器呢?此时,我们可以想象:第⼀,转化的依据是什么;第⼆,由谁来执⾏这个转化操作。
其实,转化的依据是每个镜像的json⽂件,Docker可以通过解析Docker镜像的json的⽂件,获知应该在这个镜像之上运⾏什么样的进程,应该为进程配置怎么样的环境变量,此时也就实现了静态向动态的转变。
谁来执⾏这个转化⼯作?答案是Docker守护进程。也许⼤家早就理解这样⼀句话:Docker容器实质上
就是⼀个或者多个进程,⽽容器的⽗进程就是Docker守护进程。这样的,转化⼯作的执⾏就不难理解了:Docker守护进程⼿握Docker镜像的json⽂件,为容器配置相应的环境,并真正运⾏Docker镜像所指定的进程,完成Docker容器的真正创建。
Docker容器运⾏起来之后,Docker镜像json⽂件就失去作⽤了。此时Docker镜像的绝⼤部分作⽤就是:为Docker容器提供⼀个⽂件系统的视⾓,供容器内部的进程访问⽂件资源。
再次回到上图,我们再来看看容器和镜像之间的⼀些特殊关系。⾸先,之前已经提及Docker镜像是分层管理的,管理Docker容器的时
候,Docker镜像仍然是分层管理的。由于此时动态的容器中已经存在进程,进程就会对⽂件系统视⾓内的⽂件进⾏读写操作,因此,就会涉及⼀个问题:容器是否会篡改Docker镜像的内容?
答案⾃然是不会的。统⼀来讲,正如上图,所有的Docker镜像层对于容器来说,都是只读的,容器对于⽂件的写操作绝对不会作⽤在镜像中。
既然如此,实现的原理就很重要,究其根本:Docker守护进程会在Docker镜像的最上层之上,再添加⼀个可读写层,容器所有的写操作都会作⽤到这⼀层中。⽽如果Docker容器需要写底层Docker镜像中的⽂件,那么此时就会涉及⼀个叫Copy-on-Write的机制,即aufs等联合⽂件系统保证:⾸先将此⽂
件从Docker镜像层中拷贝⾄最上层的可读写层,然后容器进程再对读写层中的副本进⾏写操纵。对于容器进程来讲,它只能看到最上层的⽂件。
那最后我们再来说说:Docker容器的⽂件系统视⾓中,到底是不是存在⼀些内容,不是存储于Docker镜像中的?
这次的答案依旧是肯定的。
再次重申⼀点,Docker镜像中存储的都是⼀些静态⽂件。这些⽂件原则上应该和容器具体信息以及主机信息完全解藕。那么Docker容器中不存在Docker镜像中的内容主要有以下⼏点:
1./proc以及/sys等虚拟⽂件系统的内容
2.容器的hosts⽂件,hostname⽂件以及f⽂件,这些事具体环境的信息,原则上的确不应该被打⼊镜像。
3.容器的Volume路径,这部分的视⾓来源于从宿主机上挂载到容器内部的路径
4.部分的设备⽂件
1.5 Docker特性
⽂件系统隔离:每个进程容器运⾏在完全独⽴的根⽂件系统⾥。
资源隔离:可以使⽤cgroup为每个进程容器分配不同的系统资源,例如CPU和内存。
⽹络隔离:每个进程容器运⾏在⾃⼰的⽹络命名空间⾥,拥有⾃⼰的虚拟接⼝和IP地址。
写时复制:采⽤写时复制⽅式创建根⽂件系统,这让部署变得极其快捷,并且节省内存和硬盘空间。
⽇志记录:Docker将会收集和记录每个进程容器的标准流(stdout/stderr/stdin),⽤于实时检索或批量检索。
变更管理:容器⽂件系统的变更可以提交到新的映像中,并可重复使⽤以创建更多的容器。⽆需使⽤模板或⼿动配置。
交互式Shell:Docker可以分配⼀个虚拟终端并关联到任何容器的标准输⼊上,例如运⾏⼀个⼀次性交互shell。
1.6 传统虚拟技术的区别
Docker类似虚拟机的概念,但是与虚拟化技术的不同点在于下⾯⼏点:
1. 虚拟化技术依赖物理CPU和内存,是硬件级别的;⽽docker构建在操作系统上,利⽤操作系统的containerization技术,所以docker甚⾄可以在虚拟机上运⾏
2. 虚拟化系统⼀般都是指操作系统镜像,⽐较复杂,称为“系统”;⽽docker开源⽽且轻量,称为“容器”,单个容器适合部署少量应⽤,⽐如部署⼀个redis、⼀个memcached。
3. 传统的虚拟化技术使⽤快照来保存状态;⽽docker在保存状态上不仅更为轻便和低成本,⽽且引⼊了类似源代码管理机制,将容器的快照历史版本⼀⼀记录,切换成本很低。
4. 传统的虚拟化技术在构建系统的时候较为复杂,需要⼤量的⼈⼒;⽽docker可以通过Dockfile来构建整个容器,重启和构建速度很快。更重要的是Dockfile可以⼿动编写,这样应⽤程序开发⼈员可以通过发布Dockfile来指导系统环境和依赖,这样对于持续交付⼗分有利。
5. Dockerfile可以基于已经构建好的容器镜像,创建新容器。Dockerfile可以通过社区分享和下载,有利于该技术的推⼴。
Docker会像⼀个可移植的容器引擎那样⼯作。它把应⽤程序及所有程序的依赖环境打包到⼀个虚拟容器中,这个虚拟容器可以运⾏在任何⼀种 Linux服务器上。这⼤⼤地提⾼了程序运⾏的灵活性和可移植性,⽆论需不需要许可、是在公共云还是私密云、是不是裸机环境等等。
1.7 docker 的四种⽹络模式
docker run -it --rm --net=host centos_with_net bash
使⽤--net=container:container_id/container_name,多个容器使⽤共同的⽹络看到的ip是⼀样
使⽤--net=none指定,这种模式下不会配置任何⽹络。
使⽤--net=bridge指定,不⽤指定默认就是这种⽹络模式。这种模式会为每个容器分配⼀个独⽴的Network Namespace。类似于Vmware的nat⽹络模式。同⼀个宿主机上的所有容器会在同⼀个⽹段下,相互之间是可以通信的。
host模式
如果启动容器的时候使⽤host模式,那么这个容器将不会获得⼀个独⽴的Network Namespace,⽽是和宿主机共⽤⼀个Network Namespace。容器将不会虚拟出⾃⼰的⽹卡,配置⾃⼰的IP等,⽽是使⽤宿主机的IP和端⼝。
但是,容器的其他⽅⾯,如⽂件系统、进程列表等还是和宿主机隔离的。
container模式
Container模式指定新创建的容器和已经存在的⼀个容器共享⼀个Network Namespace,⽽不是和宿主机共享。新创建的容器不会创建⾃⼰的⽹卡,配置⾃⼰的IP,⽽是和⼀个指定的容器共享IP、端⼝范围等。同样,两个容器除了⽹络⽅⾯,其他的如⽂件系统、进程列表等还是隔离的。两个容器的进程可以通过lo⽹卡设备通信。
none模式
使⽤none模式,Docker容器拥有⾃⼰的Network Namespace,但是,并不为Docker容器进⾏任何⽹络配置。也就是说,这个Docker容器没有⽹卡、IP、路由等信息。需要我们⾃⼰为Docker容器添加⽹卡、配置IP等。
bridge模式
bridge模式是Docker默认的⽹络设置,此模式会为每⼀个容器分配Network Namespace、设置IP等,并将⼀个主机上的Docker容器连接到⼀个虚拟⽹桥上。
2. Docker的安装
前提条件:
⽬前,CentOS 仅发⾏版本中的内核⽀持 Docker。
Docker 运⾏在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。
Docker 运⾏在 CentOS-6.5 或更⾼的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431 或者更⾼版本。(uname –r查看内核版本)
1 [root@localhost /]# yum -y install docker-io #yum安装docker
2
3 [root@localhost /]# vi /etc/sysconfig/docker #更改配置⽂件
4
5 other-args列更改为:other_args="--exec-driver=lxc--selinux-enabled"
6
7启动docker服务
8 [root@localhost /]# service docker start #启动docker
9
10 Starting cgconfig service: [ OK ]
11
12 Starting docker: [ OK ]
13
14 [root@localhost /]# chkconfig docker on #将docker加⼊开机启动
15
16 [root@localhost /]# docker version #基本信息查看
17 Client version: 1.0.0
18 Client API version: 1.12
19 Go version (client): go1.2.2
20 Git commit (client): 63fe64c/1.0.0
21 Server version: 1.0.0
22 Server API version: 1.12
23 Go version (server): go1.2.2
24 Git commit (server): 63fe64c/1.0.0
25
26 #docker info:查看系统(docker)层⾯信息,包括管理的images, containers数等
27 [root@localhost /]# docker info
28 Containers: 16
29 Images: 40
30 Storage Driver: devicemapper
31 Pool Name: docker-253:0-1183580-pool
32 Data file: /var/lib/docker/devicemapper/devicemapper/data
33 Metadata file: /var/lib/docker/devicemapper/devicemapper/metadata
34 Data Space Used: 2180.4 Mb
35 Data Space Total: 102400.0 Mb
36 Metadata Space Used: 3.4 Mb
37 Metadata Space Total: 2048.0 Mb
38 Execution Driver: lxc-0.9.0
39 Kernel Version: 2.6.32-431.el6.x86_64
View Code
3. Docker命令
3.1 容器相关操作
docker create # 创建⼀个容器但是不启动它
⽰例:
1.使⽤docker镜像nginx:latest创建⼀个容器,并将容器命名为myrunoob
docker create --name myrunoob nginx:latest 09b93464c2f75b7b69f83d56a9cfc23ceb50a48a9db7652ee4c27e3e2cb1961f
docker stop # 停⽌容器运⾏,发送信号SIGTERM
docker start # 启动⼀个停⽌状态的容器
docker restart # 重启⼀个容器
⽰例:
1.启动|停⽌|重启容器myrunoob
docker start|stop|restart myrunoob
docker rm # 删除⼀个容器
-f :通过SIGKILL信号强制删除⼀个运⾏中的容器
-l :移除容器间的⽹络连接,⽽⾮容器本⾝
-v :-v 删除与容器关联的卷
⽰例:
1.强制删除容器db01、db02
docker rm -f db01、db02
2.移除容器nginx01对容器db01的连接,连接名db
docker rm -l db
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论