Docker学习整理

1. Docker简介

Docker即通过对应用组件的封装(packaging),分发(Distribution),部署(Deployment),运行(Runtime)等生命周期的管理,达到应用组件级别的“一次封装,到处运行”。Docker引擎的基础是Linux容器(LinuxContainers,LXC)技术。Docker采用标准的C/S 架构,包括客户端和服务端两部分,客户端和服务端既可以运行在一个机器上,也可通过socket或者RESTful API来进行通信,如下图所示:


1.1 命名空间

        命名空间(Namespace)是Linux内核针对实现容器虚拟化而引入的一个强大特性;每个容器都可以拥有自己单独命名空间,运行在其中的应用都像是在独立的操作系统运行一样,命名空间保证来容器之间彼此互不影响。Docker网络命名空间如下图所示:


1.2 控制组

        控制组(CGroups)是Linux内核的一个特性,主要用来对共享资源进行隔离,限制,审计等;只有能控制分配到容器的资源,docker才能避免多个容器同时运行时的系统资源竞争。

1.3 联合文件系统

        联合文件系统(UnionFS)是一种轻量级的高性能分层文件系统,它支持将文件系统的修改信息作为一次提交,并层层叠加,同时可以将不同目录挂载到同一个虚拟文件系统下;联合文件系统是实现Docker镜像的技术基础,镜像可以通过分层来进行继承。当Docker利用镜像启动一个容器时,将利用镜像分配文件系统并且挂载一个新的可读写的层给容器,容器会在这个文件系统中创建,并且这个可读写层被添加到镜像中,如下图所示:


1.4 容器定义

        容器有效地将有单个操作系统管理的资源划分到孤立的组中,以便更好地在孤立的组之间平衡有冲突的资源使用需求。与虚拟化相比,这样既不需要指令级模拟,也不需要即时编译。容器可以在核心CPU本地运行指令,而不需要任何专门的解释机制。此外,也避免了准虚拟化和系统调用替换中的复杂行。

1.5 虚拟化定义

        在计算技术中,虚拟化(Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器,网络,内存及存储等,予以抽象,转换后呈现出来,打破实体结构间的不可切割的障碍,是用户可以用比原本的组态更好的方式来应用这些资源。

可以简单地将Docker容器理解为一种沙盒(Sandbox)。每个容器内运行一个应用,不同的容器相互隔离,容器之间也可以建立通信机制。


Docker容器是在操作系统层面上实现虚拟化,直接复用本地操作系统。由于Docker引擎使用了Linux内核特性,所以在Windows上运行的话,需要额外使用一个虚拟机来提供Linux支持。


2. Docker核心概念

2.1 Docker镜像

        Docker镜像(Image)类似于虚拟机镜像,可以将它理解为一个面向Docker引擎的只读模版,包含来文件系统。镜像是创建Docker容器的基础。镜像文件一般是由若干层组成,层(Layer)是AUFS(Advanced Union File System)一种联合文件系统中的重要概念,是实现增量保存和更新的基础。

2.2 Docker容器

        Docker容器(Container)类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。容器是从镜像创建的应用运行实例,可以将其启动,开始,停止,删除,而这些容器是相互隔离,互不可见的。容器是镜像的一个运行实例,所不同的是,它带有额外的可写文件层。

2.3 Docker仓库

        Docker仓库(Repository)类似于代码仓库,是Docker集中存放镜像文件的场所。

2.4 注册服务器

        注册服务器(Registry)是存放仓库的地方,其上往往存放着多个仓库。每一个仓库集中存放某一类镜像,往往包括多个镜像文件,通过不同的标签(tag)来进行区分。注册服务器是存放仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像;仓库可以被认为是一个具体的项目或目录。


2.5 docker 数据管理

(1)数据卷:在容器内创建数据卷,并且把本地的目录或文件挂载到容器内的数据卷中;

(2)数据卷容器:使用数据卷容器在容器和主机,容器和容器之间共享数据。

2.6 Docker网络配置

        docker提供映射容器端口到宿主主机和容器互联机制来为容器提供网络服务。从外部访问容器应用,需要通过端口映射实现容器访问。容器的连接(linking)系统是除了端口映射外另一种与容器中应用进行交互的方式,它会在源和接收容器之间创建一个隧道,接收容器可以看到元容器指定的信息,通过容器名称来进行互连。当两个docker容器在同一主机(或虚拟机)时,可以通过—link命令让两者直接相互访问;如果要跨主机实现容器互联,则往往需要容器知道其物理主机的IP地址,利用Ambassador容器机制,可以让互联的容器无需知道所在物理主机的IP地址即可互联。




2.7 Docker网络实现

        其是利用Linux上的网络命名空间和虚拟网络设备;docker网络就是很好地利用来Linux虚拟网络技术,它在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫做veth pair),如下图所示:






3. Docker命令 

Help命令: docker –help

3.1 镜像命令

pull命令格式:dockerpull NAME[:TAG] 从网络上下载镜像,对于docker镜像来说,如果不显示制定TAG,则默认会选择latest标签,即下载仓库中最新版本镜像。

run命令: docker run --help

images命令:dockerimages 列出本地主机上已有的镜像

inspect命令:dockerinspect 查看镜像的信息

search命令:dockersearch 搜索远程仓库(注册服务器Registry)中共享的镜像

rmi命令:docker rmi 删除镜像,其中rmi(remove image)

commit命令:dockercommit 创建镜像

save命令:docker save 将镜像存储到本地文件

load命令:docker load 将本地文件导入到本地镜像库

push命令:docker push 将镜像上传到仓库


                                                            镜像创建的方法


    创建镜像的方法有是三种:基于已有镜像的容器创建(docker commit),基于本地模板导入(从一个操作系统模板文件导入一个镜像),基于Dockerfile创建。

基于Dockerfile创建:用户可以使用Dockerfile来创建自定义的镜像,编写完dockerfile文件之后,可以通过docker build命令来创建镜像,其中dockerfile对应的注意点如下:

(1)第一行必须指定基于的基础镜像

(2)镜像操作指令:

指令格式:INSTRUCTION argumens

Ø  RUN指令:RUN 或者 RUN [“executable”,”param1”,”param2”],前者将在shell终端中运行命令即/bin/sh –c ;后者则使用exec执行;每运行一条RUN指令,镜像添加新的一层,并提交

Ø  CMD指令:CMD [“executable”,”param1”,”param2”]使用exec执行;CMD command param1 param2 在/bin/sh中执行;CMD [“param1”,”param2”]提供给ENTRYPOINT的默认参数;指定运行容器时的操作命令,每个Dockerfile只能有一条CMD指令,如果指定了多条命令,只有最后一条会被执行。

Ø  MAINTATINER指令:MAINTATINER 制定维护者信息

Ø  EXPOSE 指令:EXPOSE 告诉Docker服务端容器暴露的端口号,供互联系统使用

Ø  ENV指令:ENV 指定一个环境变量,会被后续RUN指令使用,并在容器运行时保持

Ø  ADD指令:ADD 复制指定的到容器中的

Ø  COPY指令:COPY 复制本地主机到容器中的中

Ø  ENTRYPOINT指令:ENTRYPOINT[“executable”,”param1”,”param2”]或者ENTRYPOINT commandparam1 param2 配置容器启动后执行的命令,并且不可被docker run提供的参数覆盖;每一个dockerfile中只能有一个ENTRYPOINT,当指定多个ENTRYPOINT时,只有最后一个生效

Ø  VOLUME指令:VOLUME [“/data”] 创建一个可以从本地主机或其他容器挂载的挂载带点

Ø  USER指令:USER daemon 指定运行容器时的用户名或UID,后续的RUN也会使用指定用户

Ø  WORKDIR指令:WORKDIR /path/to/workdir 为后续的RUN,CMD,ENTRYPOINT指令配置工作目录,可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则会基于之前命令制定的路径

Ø  ONBUILD指令:ONBUILD [INSTRUCTION] 配置当所创建的镜像作为其他新创建镜像的基础镜像时,所执行的操作指令

3.2 容器命令

create命令:dockercreate 新建一个容器,只是这个容器处于停止状态,可以使用docker start 命令来启动它

start命令:dockerstart 启动一个容器,对于处于终止状态的容器,使用start命令来重新启动

restart命令:dockerrestart 将一个运行状态的容器终止,然后再重新启动它

run命令:docker run 运行一个容器,等价于先执行docker create命令创建一个容器,然后再执行docker start命令来启动这个新建的容器

stop命令:docker stop 终止一个运行中的容器,当Docker容器中制定的应用终结时,容器也自动终止

ps命令:docker ps 可以列出容器信息

attach命令: dockerattach 将在后台运行的容器通过attach命令来获得对应的关联

exec命令:docker exec 可以通过exec命令在对应的容器环境中执行对应命令

rm命令:docker rm 删除容器

export命令:dockerexport 导出容器(导出一个已经创建的容器到一个文件)

import命令:dockerimport 导入容器(将导出的容器文件变成镜像),其中docker load命令来导入镜像存储文件到本地的镜像库,也可以使用docker import命令来导入一个容器快照到本地镜像库;这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件保存完整的记录,体积也大;此外,从容器快照文件导入时可以重新制定标签等元数据信息。

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页