docker学习笔记1:入门

docker

英 [ˈdɒkə] 美 [ˈdɑkər]
n. 码头工人

摘要:一种用go语言开发的基于LXC技术的轻量级容器化解决方案。

1 概念和原理

1.1容器

容器是操作系统级别的虚拟化技术。docker官网将容器定义为:A standardized unit of software。容器和宿主机共享硬件资源及操作系统,可以实现资源的动态分配。容器包含应用和其所有的依赖包,但是与其他容器共享内核。容器在宿主机操作系统中,在用户空间以分离的进程运行。LXC即Linux Container。


image

与传统虚拟化技术相比,容器技术不需要Hypervisor层,所有容器运行在容器引擎上,共享同一个内核(操作系统)。实现的是应用级别隔离而不是操作系统隔离,因此带来以下好处:

  • 节约资源,降低硬件成本;
  • 解决开发/测试/生 产环境一致性问题;
  • 使部署更快、运维更简便;
  • 与微服务架构更为契合;

1.2docker原理

docker是容器技术的一种实现方案。官网上自称是可以打包、发布、运行任何应用程序的容器化解决方案。其实现的底层核心支撑是namespace、cgroup和union filesystem等技术。

1.2.1namespace

命名空间(namespaces)是 Linux 内核提供的用于分离进程树、网络接口、挂载点以及进程间通信等资源的方法。 处于不同 namespace 的进程拥有独立的全局系统资源,改变一个 namespace 中的系统资源只会影响当前 namespace 里的进程,对其他 namespace 中的进程没有影响。 这些内存资源被Linux内核分为以下几类:Cgroup、IPC 、Network 、Mount 、PID 、User 、UTS 。每个进程都有独立的这些类型资源,在/proc/{pid}/ns文件可以查看。

docker-ns.png

对于每种资源,Linux内核提供3个API进行操作,分别是clone(创建一个新的进程并把他放到新的namespace中) 、setns(将当前进程加入到已有的namespace中) 、unshare(使当前进程退出指定类型的namespace,并加入到新创建的namespace) 。

表1.1 Linux内核支持的namespaces 类型表

名称 宏定义 隔离内容
Cgroup CLONE_NEWCGROUP Cgroup root directory (since Linux 4.6)
IPC CLONE_NEWIPC System V IPC, POSIX message queues (since Linux 2.6.19)
Network CLONE_NEWNET Network devices, stacks, ports, etc. (since Linux 2.6.24)
Mount CLONE_NEWNS Mount points (since Linux 2.4.19)
PID CLONE_NEWPID Process IDs (since Linux 2.6.24)
User CLONE_NEWUSER User and group IDs
UTS CLONE_NEWUTS UNIX Time Sharing -Hostname and NIS domain name

1.2.2cgroup

cgroup就是controller group,在group中,有分配好的特定比例的CPU时间,IO时间,可用内存大小等。cgroups是将进程进行分组化管理的Linux内核功能,能限制某个或者某些进程的分配资源。cgroups中的重要概念是"子系统",每种子系统就是一个资源的控制器,比如CPU子系统是控制CPU时间分配的。首先挂载子系统,然后才有control group的。比如先挂载memory子系统,然后在memory子系统中创建一个cgroup节点,在这个节点中,将需要控制的进程id写入,并且将控制的属性写入,这就完成了内存的资源限制。

1.2.3UnionFS

联合文件系统(UnionFileSystem)2004年由纽约州立大学石溪分校开发,它可以把多个目录(也叫分支)内容联合挂载到同一个目录下,而目录的物理位置是分开的 。它是一种分层、轻量级并且高性能的文件系统,支持对文件系统的 修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。联合文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父 镜像),可以制作各种具体的应用镜像。另外,不同 Docker 容器就可以共享一些基础的文件系统层,同时再加上自己独有的改动层, 大大提高了存储的效率。Docker 中使用的 AUFS(AnotherUnionFS)就是一种联合文件系统。AUFS 支持为每一个 成员目录(类似 Git 的分支)设定只读(readonly)、读写(readwrite)和写出(whiteout- able)权限, 同时 AUFS 里有一个类似分层的概念, 对只读权限的分支可以逻辑上进行增量地修改(不影响只读部分的)。Docker 目前支持的联合文件系统种类包括 AUFS, btrfs, vfs 和 DeviceMapper。

1.3docker架构

docker内部构件可以划分为3大类:

  • 镜像(Image):docker 镜像是一个极度精简版的Linux程序运行环境 。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器(Container):容器由镜像创建,提供互相隔离的Linux运行环境。镜像和容器的关系,就像程序与进程一样,镜像是静态的文件,容器是镜像运行时的实体,不同容器共享内核。
  • 仓库(Repository):仓库是用来集中存放docker镜像的远程控制中心。
    image

    docker实现是一个c/s结构的应用,主要组件包括:
    client
    client是docker架构中用户用来和docker daemon建立通信的客户端。用户通过docker命令行工具可以发起管理container的请求。
    docker daemon
    docker daemon是docker架构中一个常驻在后台的系统进程,功能是:接受并处理docker client发送的请求。该守护进程在后台启动了一个server,server负责接受docker client发送的请求;接受请求后,server通过路由与分发调度,找到相应的handler来执行请求。
    image

    server
    server的功能是:接受并调度分发client发送的请求。docker server的运行在docker的启动过程中,是靠一个名为”serveapi”的job的运行来完成的,即众多job中的一个 。
    engine
    engine是docker架构中的运行引擎,同时也docker运行的核心模块。它扮演container存储仓库的角色,并且通过执行job的方式来操纵管理这些容器。在engine数据结构的设计与实现过程中,有一个handler对象。该handler对象存储的都是关于众多特定job的handler处理访问。举例说明,engine的handler对象中有一项为:{“create”: daemon.ContainerCreate,},则说明当名为”create”的job在运行时,执行的是daemon.ContainerCreate的handler。
    job
    一个Job可以认为是docker架构中Engine内部最基本的工作执行单元。docker可以做的每一项工作,都可以抽象为一个job。例如:在容器内部运行一个进程,这是一个job;创建一个新的容器,这是一个job,从Internet上下载一个文档,这是一个job;包括之前在Docker Server部分说过的,创建server服务于HTTP的API,这也是一个job,等等。job的设计者,把job设计得与Unix进程相仿。比如说:job有一个名称,有参数,有环境变量,有标准的输入输出,有错误处理,有返回状态等。

2 docker安装

操作系统:CentOS7.7 内核版本:3.10.0-1062.el7.x86_64安装步骤:

  1. 安装依赖
    yum install -y yum-utils device-mapper-persistent-data lvm2
  2. 添加软件源
    wget -O /etc/yum.repos.d/ali.docker.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  3. 安装docker-ce
    yum clean all yum makecache fastyum -y install docker-ce
  4. 启动服务
    systemctl start docker
  5. 查看版本
    docker version
    docker-version.png

3 常用命令

  • 镜像拉取:
    docker pull sonatype/nexus3
    • sonatype/nexus3 :拉取的镜像名,如果不是最新版需要指定Tag号,例如:sonatype/nexus3:v2
  • 镜像查看:
    docker image ls
  • 镜像启动1:
    docker run -d -p 8081:8081 --name nexus -v /root/nexus-data:/var/nexus-data --restart=always sonatype/nexus3
    • -d: 在后台运行docker容器;-p: 指定端口映射; -v: 指定挂载点映射; --restart=always: 当 docker 重启时,容器自动启动; --name: 容器标识;
    • (***nexus默认密码文件:/nexus-data/admin.password)
  • 镜像启动2:
    docker run -it sonatype/nexus3 /bin/bash
    • -t: 让docker分配一个伪终端并绑定在容器的标准输入上 ;-i: 容器的标准输入保持打开 。-it通常连用,以交互方式启动容器; /bin/bash: 启动一个bash终端;
    • 快捷键Ctrl + Q + P退出容器终端;
  • 容器查看:
    docker container ls -a/--all(旧版命令docker ps -a)
    • -all :显示全部(包括已经停止)的容器


      docker-container-ls.png
  • 容器终端进入:
    docker exec -it 0f6eae00dab2 /bin/bash
    • 0f6eae00dab2: 容器id
  • 容器终端退出:
    exit 或快捷键 Ctrl+Q+P
    • 0f6eae00dab2: 容器id
  • 容器停止:
    docker container stop 0f6eae00dab2
    • 0f6eae00dab2: 容器id
  • 容器删除:
    docker container rm 0f6eae00dab2
    • 0f6eae00dab2: 容器id
  • 容器打包成镜像
    docker container commit -a 'xxx' -m 'nexus admin.passwd changed;repo created ;user added.' 0f6eae00dab2 sonatype/nexus3:v1
  • -a: 作者
  • -m: 说明
  • sonatype/nexus3: 镜像名
  • v1: Tag
  • 0f6eae00dab2: 容器id

你可能感兴趣的:(docker学习笔记1:入门)