Docker系列一之基础快速入门企业实战

 

1.1什么是LXClinux

LXCLinux Container的简写。Linux Container容器是一种内核虚拟化技术,能够提供轻量级的虚拟化,以便隔离进程和资源,并且不须要提供指令解释机制以及全虚拟化的其余复杂性。至关于C++中的NameSpace。容器有效地将由单个操做系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。与传统虚拟化技术相比,它的优点在于:nginx

与宿主机使用同一个内核,性能损耗小;git

不须要指令级模拟;面试

不须要即时(Just-in-time)编译;docker

容器能够在CPU核心的本地运行指令,不须要任何专门的解释机制;shell

避免了准虚拟化和系统调用替换中的复杂性;后端

轻量级隔离,在隔离的同时还提供共享机制,以实现容器与宿主机的资源共享。centos

总结:Linux Container是一种轻量级的虚拟化的手段。api

1.2什么是Docker安全

DockerDocker.inc公司开源的一个基于LXC技术之上构建的Container容器引擎,源代码托管在GitHub上,基于Go语言并听从Apache2.0协议开源(能够商业)。

Docker项目的目标是实现轻量级的操做系统虚拟化解决方案。

Docker是经过内核虚拟化技术(namespacescgroups等)来提供容器的资源隔离与安全保障等。因为Docker经过操做系统层的虚拟化实现隔离,因此Docker容器在运行时,不须要相似虚拟机VM额外的操做系统开销,提升资源利用率。

下面图比较了Docker和传统虚拟化方式的不一样之处,可见容器是在操做系统层面上实现虚拟化,直接复制本地主机的操做系统,而传统方式则是在硬件层面实现。

虚拟化与docker对比图

1.3Docker的工做模式

学习Docker的源码并非一个枯燥的过程,反而能够从中理解Docker架构的设计原理。

Docker对使用者来说是一个C/S模式的架构,而Docker的后端是一个很是松耦合的架构,模块各司其职,并有机组合,支撑Docker的运行。 

用户是使用Docker ClientDocker Daemon创建通讯,并发送请求给后者。

Docker Daemon做为Docker架构中的主体部分,首先提供Server的功能使其能够接受Docker Client的请求;然后Engine执行Docker内部的一系列工做,每一项工做都是以一个Job的形式的存在。 

Job的运行过程当中,当须要容器镜像时,则从Docker Registry中下载镜像,并经过镜像管理驱动graphdriver将下载镜像以Graph的形式存储;当须要为Docker建立网络环境时,经过网络管理驱动networkdriver建立并配置Docker容器网络环境;当须要限制Docker容器运行资源或执行用户指令等操做时,则经过execdriver来完成。而libcontainer是一项独立的容器管理包,networkdriver以及execdriver都是经过libcontainer来实现具体对容器进行的操做。当执行完运行容器的命令后,一个实际的Docker容器就处于运行状态,该容器拥有独立的文件系统,独立而且安全的运行环境等。

CLI交互模型

DockerC/S模式

RemoteAPI交互模型

DockerC/S模式-RemoteAPI

 

1.4Docker八中应用场景

Dcoerk八中应用场景

1、简化配置,统一配置,经过镜像快速启动(Simplifying)

2、代码流水线管理,开发环境->测试环境->预生产环境->灰度发布->正式发布,docker在这里实现了快速迁移(Code Oioeline Management)

3、开发效率,对开发人员,有了镜像,直接启动容器便可(Developer Productivity)

4、应用隔离,相对于虚拟机的彻底隔离会占用资源,docker会比较节约资源(App lsolation)

5、服务器整合,一台服务器跑多个docker容器,提升服务器的利用率(Server Consolidation)

6、调试能力,debug调试(Debugging Capabilties)

7、多租户,一个租户多个用户,相似于阿里公有云的一个project下多个用户(Multi-tenancy)

8、快速部署,不须要启动操做系统,实现秒级部署(Rapid Deplovment)

1.5Docker八中开发模式

1.共享基础容器

2.共享卷开发容器

3.开发工具容器

4.不一样环境下测试容器

5.构建容器

6.安装容器

7.盒子中默认服务容器

8.基础设施/粘合剂容器

1.6Docker九个基本事实

1.容器不一样于虚拟机

2.容器不如虚拟机来得成熟

3.容器能够在几分之一秒内启动

4.容器已在大规模环境证实了自身的价值

5.IT人员称容器为轻量级

6.容器引起了安全问题

7.Docker已成为容器的代名词,但它不是惟一的提供者

8.容器能节省IT人力,加快更新

9.容器仍面临一些没有解决的问题

1.7使用Docker理由

做为一种新兴的虚拟化方式,Docker跟传统的虚拟化方式具备众多的优点。

首先,Docker容器的启动能够在秒级实现,这相比传统的虚拟机方式要快得多。其次,Docker对系统资源的利用率很低,一台主机上能够同时运行数千个Docker容器。

至于为何要使用Docker

一、技术储备

相对大公司这个很是重要,若是大家都在用,他们不用就落后了,等到彻底成熟之后就跟不上了。

二、无技术栈和技术债

没有任何Openstack或者saltstack,服务down了就down,全部的服务都是松耦合。

3、跟上潮流(提高自我,装逼)

面试的时候你们都会Docker,你不会是否是落后了。

4、符合当前业务

虽然Docker很优秀,可是,大多数处在第二种状态,不多有符合本身的业务

1.8Docker改变了什么

q面向产品:产品交付

q面向开发:简化环境配置

q面向测试:多版本测试

q面向运维:环境一致性

q面向架构:自动化扩容(微服务)

1.8.1Docker更快速的交付和部署

对于开发和人员来讲,最但愿的就是一次建立和配置,能够在任意地方正常运行。

开发者可使用一个标准的镜像来构建一套开发容器,开发完成以后,运维人员能够直接使用这个容器来部署代码。Docker能够快速建立容器,快速迭代应用程序,并让整个过程全称可见,使团队中的其余成员更容易理解应用程序是如何建立和工做。Docker容器很轻很快!容器的启动时间是秒级的,大量第节约开发、测试、部署的时间。

1.8.2Docker更高效的虚拟化

Docker容器的运行不须要额外的Hypervisor支持,它是内核级的虚拟化,所以能够实现更高的性能和效率。

1.8.3Docker更轻松的迁移和扩展

Docker容器几乎能够字啊任意的平台上运行,包括物理机、虚拟机、公有云、私有云、我的电脑、服务器等。这种兼容性可让用户把一个应用程序从一个平台直接迁移到另一个。

1.8.4Docker更简单的管理

使用Docker,只须要小小的修改,就能够替代往大量的更新工做。全部的修改都以增量的方式被分发和更新,从而实现自动化而且高效的管理。

1.9Docker与虚拟化

类别

Docker

OpenStack

结论

部署

很是简单

组件多,部署复杂

平台是有的线上生产环境进行改造,必须选择侵入性较小的容器化技术

速度

钟级

流量峰,速度就是一切

行性能

和物理系几乎一致

VM会占用一些

微博核心业务对SLA要求很是苛刻

像体

像是MB级别

像是GB级别

当集群大模部署,体小就表明更大的并发调度量

管理效率

管理简单

组件相互依赖,管理复杂

集群可控性是核心争力

隔离性

隔离性高

底隔离

 

可管理性能

单进程、不建议启动SSH

完整的系管理

 

络连

借助Neutron能够灵活建各架构

 

 

1.10Docker三大核心概念

1.10.1Docker镜像(image)

Docker镜像就是一个只读的模板。

例如:一个镜像能够包含一个完整的CentOS操做系统环境,里面仅安装了Apache或用户须要的其余应用程序。

镜像能够用来建立Docker容器。

Docker提供了一个很简单的机制来建立镜像或者更新现有的镜像,用户甚至能够直接从其余人那里下载一个已经作好的镜像来直接使用。

1.10.2Docker容器(container)

Docker利用容器来运行应用。

容器是从镜像建立的运行实例。它能够被启动、开始、中止、删除。每一个容器都是相互隔离的,保证安全的平台。

能够把容器看作是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

注意:镜像是只读的,容器在启动的时候建立一层可写层做为最上层。

1.10.3Docker仓库(repository)

仓库是集中存放镜像文件的场所。有时候把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上每每存放着多个仓库,每一个仓库中又包含了多个镜像,每一个镜像有不一样的标签(tag)

仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括Docker Pool等,能够提供大陆用户更稳定快读的访问。

当用户建立了本身的镜像以后就可使用push命令将它上传到公有或者私有仓库,这样下载在另一台机器上使用这个镜像时候,只需须要从仓库上pull下来就能够了。

注意:Docker仓库的概念跟Git相似,注册服务器能够理解为GitHub这样的托管服务。

1.11Docker企业实战

笔者QQ572891887

Linux架构交流群:471443208

系统环境

[root@docker ~]# cat /etc/redhat-release  #查看版本号

CentOS Linux release 7.1.1503 (Core)

[root@docker ~]# uname -r  #查看Linux内核

c3.10.0-229.el7.x86_64

 

[root@docker ~]#yum install -y docker  #安装docker(CentOS7系统CentOS-Extras库中已带Docker)

[root@docker ~]#systemctl start docker  #启动docker

[root@docker ~]#systemctl enable docker  #加入开机自启动

 

[root@docker ~]# docker version  #查看docker版本信息

Client:  #docker客户端版本信息

 Version:1.8.2-el7.centos

 API version:1.20

 Package Version: docker-1.8.2-10.el7.centos.x86_64

 Go version:go1.4.2

 Git commit:a01dc02/1.8.2

 Built:

 OS/Arch:linux/amd64

 

Server:  #docker服务端版本信息

 Version:1.8.2-el7.centos

 API version:1.20

 Package Version:

 Go version:go1.4.2

 Git commit:a01dc02/1.8.2

 Built:

 OS/Arch:linux/amd64

1.12Docker基础命令

[root@docker ~]# docker --help

Usage: docker [OPTIONS] COMMAND [arg...]

       docker daemon [ --help | ... ]

       docker [ --help | -v | --version ]

 

A self-sufficient runtime for containers.

 

Options:

 

  --config=~/.docker              Location of client config files  #客户端配置文件的位置

  -D, --debug=false               Enable debug mode  #启用Debug调试模式

  -H, --host=[]                   Daemon socket(s) to connect to  #守护进程的套接字(Socket)链接

  -h, --help=false                Print usage  #打印使用

  -l, --log-level=info            Set the logging level  #设置日志级别

  --tls=false                     Use TLS; implied by --tlsverify  #

  --tlscacert=~/.docker/ca.pem    Trust certs signed only by this CA  #信任证书签名CA

  --tlscert=~/.docker/cert.pem    Path to TLS certificate file  #TLS证书文件路径

  --tlskey=~/.docker/key.pem      Path to TLS key file  #TLS密钥文件路径

  --tlsverify=false               Use TLS and verify the remote  #使用TLS验证远程

  -v, --version=false             Print version information and quit  #打印版本信息并退出

 

Commands:

    attachAttach to a running container  #当前shellattach链接指定运行镜像

    buildBuild an image from a Dockerfile  #经过Dockerfile定制镜像

    commitCreate a new image from a container's changes  #提交当前容器为新的镜像

    cpCopy files/folders from a container to a HOSTDIR or to STDOUT  #从容器中拷贝指定文件或者目录到宿主机中

    createCreate a new container  #建立一个新的容器,同run 但不启动容器

    diffInspect changes on a container's filesystem  #查看docker容器变化

    eventsGet real time events from the server#docker服务获取容器实时事件

    execRun a command in a running container#在已存在的容器上运行命令

    exportExport a container's filesystem as a tar archive  #导出容器的内容流做为一个tar归档文件(对应import)

    historyShow the history of an image  #展现一个镜像造成历史

    imagesList images  #列出系统当前镜像

    importImport the contents from a tarball to create a filesystem image  #tar包中的内容建立一个新的文件系统映像(对应export)

    infoDisplay system-wide information  #显示系统相关信息

    inspectReturn low-level information on a container or image  #查看容器详细信息

    killKill a running container  #kill指定docker容器

    loadLoad an image from a tar archive or STDIN  #从一个tar包中加载一个镜像(对应save)

    loginRegister or log in to a Docker registry#注册或者登录一个docker源服务器

    logoutLog out from a Docker registry  #从当前Docker registry退出

    logsFetch the logs of a container  #输出当前容器日志信息

    pausePause all processes within a container#暂停容器

    portList port mappings or a specific mapping for the CONTAINER  #查看映射端口对应的容器内部源端口

    psList containers  #列出容器列表

    pullPull an image or a repository from a registry  #docker镜像源服务器拉取指定镜像或者库镜像

    pushPush an image or a repository to a registry  #推送指定镜像或者库镜像至docker源服务器

    renameRename a container  #重命名容器

    restartRestart a running container  #重启运行的容器

    rmRemove one or more containers  #移除一个或者多个容器

    rmiRemove one or more images  #移除一个或多个镜像(无容器使用该镜像才能够删除,不然须要删除相关容器才能够继续或者-f强制删除)

    runRun a command in a new container  #建立一个新的容器并运行一个命令

    saveSave an image(s) to a tar archive#保存一个镜像为一个tar(对应load)

    searchSearch the Docker Hub for images  #docker hub中搜索镜像

    startStart one or more stopped containers#启动容器

    statsDisplay a live stream of container(s) resource usage statistics  #统计容器使用资源

    stopStop a running container  #中止容器

    tagTag an image into a repository  #给源中镜像打标签

    topDisplay the running processes of a container #查看容器中运行的进程信息

    unpauseUnpause all processes within a container  #取消暂停容器

    versionShow the Docker version information#查看容器版本号

    waitBlock until a container stops, then print its exit code  #截取容器中止时的退出状态值

 

Run 'docker COMMAND --help' for more information on a command.  #运行docker命令在帮助能够获取更多信息

1.13Docker镜像管理

1.13.1搜索Docker镜像

[root@docker ~]# docker search centos  #搜索全部centosdocker镜像

INDEX                NAME(名称                DESCRIPTION(描述)                    STARS(下载次数)OFFICIAL(官方)        AUTOMATED(自动化)

docker.io           docker.io/centos         The official build of CentOS.        1781               [OK]

docker.io   docker.io/jdeathe/centos-ssh     CentOS-6 6.7 x86_64 /             14                                               [OK]

……

1.13.2获取Docker镜像

可使用docker pull命令来从仓库获取所须要的镜像。下面的例子将从Docker Hub仓库下载一个Centos操做系统的镜像。

[root@docker ~]# docker pull centos  #获取centos镜像

[root@docker ~]# docker run -it centos /bin/bash  #完成后可使用该镜像建立一个容器

[root@5284d42eeb3a /]#

1.13.3查看docker镜像

镜像的ID惟一标识了镜像,若是ID相同,说明是同一镜像。

TAG信息来区分不一样发行版本,若是不指定具体标记,默认使用latest标记信息。

[root@docker ~]# docker images #查看docker镜像

REPOSITORY(来自那个仓库)       TAG(标签)            IMAGE ID(惟一ID)         CREATED(建立时间)         VIRTUAL SIZE(大小)

docker.io/centos                   latest              60e65a8e4030           5 days ago              196.6 MB

docker.io/nginx             latest              813e3731b203             13 days ago             133.8 MB

1.13.4删除Docker镜像

若是要移除本地的镜像,可使用docker rmi命令(在删除镜像以前先用docker rm删除依赖于这个镜像的全部容器)。注意docker rm 命令是移除容器。

[root@docker ~]# docker rmi imageID  #删除docker镜像

1.13.5导出Docker镜像

若是要导出镜像到本地文件,可使用docker save命令。

[root@docker ~]# docker save centos > /opt/centos.tar.gz  #导出docker镜像至本地

[root@docker ~]# ll /opt/

-rw-r--r--. 1 root root 204205056 12 30 09:53 centos.tar.gz

1.13.61.6.6导入Docker镜像

可使用docker load从本地文件中导入到本地docker镜像库

[root@docker ~]# docker load < /opt/centos.tar.gz   #导入本地镜像到docker镜像库

[root@docker ~]# docker images  #查看镜像导入状况

REPOSITORY           TAG                 IMAGE ID            CREATED             VIRTUAL SIZE

docker.io/centos     latest              60e65a8e4030        5 days ago          196.6 MB

1.14Docker容器管理

1.14.1启动Docker容器

启动容器有两种方式,一种是基于镜像新建一个容器并启动,另一个是将在终止状态(stopped)的容器从新启动。

由于Docker的容器实在过轻量级了,不少时候用户都是随时删除和新建立容器。

1.14.1.1新建容器并启动

所须要的命令主要为docker run

例如,下面的命令输出一个hehe,以后终止容器。

[root@docker ~]# docker run centos /bin/echo "hehe"  #这跟在本地直接执行 /bin/echo'hehe' 

hehe

 

[root@docker ~]# docker run --name mydocker -it centos /bin/bash#启动一个bash终端,容许用户进行交互。

[root@1c6c3f38ea07 /]# pwd

/

[root@1c6c3f38ea07 /]# ls

anaconda-post.log  bindev  etc  homelib  lib64  lost+foundmedia  mnt  optproc  root  runsbin  srv  systmp  usr  var

 

--name:给容器定义一个名称

-i:则让容器的标准输入保持打开。

-t:Docker分配一个伪终端,并绑定到容器的标准输入上

/bin/bash:执行一个命令

当利用docker run来建立容器时,Docker在后台运行的标准操做包括:

q检查本地是否存在指定的镜像,不存在就从公有仓库下载

q利用镜像建立并启动一个容器

q分配一个文件系统,并在只读的镜像层外面挂在一层可读写层

q从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去

q从地址池配置一个ip地址给容器

q执行用户指定的应用程序

q执行完毕后容器被终止

1.14.1.2启动已终止容器

能够利用docker start命令,直接将一个已经终止的容器启动运行。

容器的核心为所执行的应用程序,所须要的资源都是应用程序运行所必需的。除此以外,并无其余的资源。能够在伪终端中利用pstop来查看进程信息。

[root@docker ~]# docker start 1c6c3f38ea07  #启动一个终止的容器

1c6c3f38ea07

[root@docker ~]# docker ps -a  #查看是否启动

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS       NAMES       

1c6c3f38ea07        centos              "/bin/bash"         8 minutes ago       Up 1 seconds                  mycentos           

1.14.1.3守护进程运行

更多的时候,须要让Docker容器在后台以守护形式运行。此时能够经过添加-d参数来实现。

例以下面的命令会在后台运行容器。

[root@docker ~]# docker run -d centos /bin/bash -c "while true; do echo hehe; sleep 1;done"

961fd1162c2f6a8d04e4d8ab6ccacf4cb01a90af8ab553d5e2c5063ac483ffd8

 

[root@docker ~]# docker ps  #查看正在运行的docker容器

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES

961fd1162c2f        centos              "/bin/bash -c 'while "   18 minutes ago      Up 18 minutes                           agitated_raman

 

[root@docker ~]# docker logs 961fd1162c2f  #获取容器输出信息,经过dockerlogs命令

hehe

hehe

1.14.2中止容器

可使用docker stop来终止一个运行中的容器。

此外,当Docker容器中指定的应用终结时,容器也自动终止。例如启动一个终端的容器,用户经过exit命令或者ctrl+d来退出终端时,所建立的容器马上终止。

终止状态的容器能够用docker ps -a命令看到,也能够经过docker start ID 命令来启动容器。

[root@docker ~]# docker ps -a #查看全部容器的状况

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES

961fd1162c2f        centos              "/bin/bash -c 'while "   30 minutes ago      Up 30 minutes                           agitated_raman

[root@docker ~]# docker stop 961fd1162c2f  #中止容器

961fd1162c2f

[root@docker ~]# docker ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES

961fd1162c2f        centos              "/bin/bash -c 'while "   31 minutes ago      Exited (137) 27 seconds ago                agitated_raman

极端方式中止容器(不推荐)

[root@867e6627a194 ~]# docker ps -a -q   #列出全部启动容器的ID

867e6627a194

[root@867e6627a194 ~]# docker kill $(docker ps -a -q)  #批量杀掉启动的容器

./in.sh: 4: 20078 已杀死               nsenter -t $PID -u -i -n -p

1.14.3删除容器

[root@867e6627a194 ~]# docker ps -a  #查看全部容器当前状态

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES

867e6627a194        centos              "/bin/bash"         16 minutes ago      Up 5 minutes                                    mydocker

c599b569f387        centos              "/bin/echo hehe"   19 minutes ago      Exited (0) 19 minutes ago                     fervent_torvalds

302f39c202c9        nginx               "/bin/bash"         2 hours ago          Up 2 hours               80/tcp, 443/tcp      mynginx

[root@867e6627a194 ~]#

[root@867e6627a194 ~]# docker rm c599b569f387  #删除已经中止的容器

c599b569f387

[root@867e6627a194 ~]# docker rm -f 302f39c202c9   #删除正在运行的容器

302f39c202c9

1.14.4进入容器

使用-d参数时,容器启动后会进入后台。某些时候须要进入容器进行操做,有不少种方法,包括使用docker attach命令或nsenter工具等。

1.14.4.1attach命令

docker attachDocker自带的命令。下面示例如何使用该命令。

[root@docker ~]# docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                        PORTS               NAMES

867e6627a194        centos              "/bin/bash"         10 minutes ago      Exited (127) 47 seconds ago                       mydocker

[root@docker ~]# docker start 867e6627a194  #启动已经中止的容器

867e6627a194

[root@docker ~]# docker attach 867e6627a194  #经过docker attach进入

[root@867e6627a194 /]#

可是使用attach命令有时候并不方便。当多个窗口同时attach到同一个容器的时候,全部的窗口都会同步显示,当某个窗口因命令阻塞时,其余窗口也没法执行操做了。

1.14.4.2nsenter命令

nsenter能够访问另外一个进程的名字空间。nsenter须要有root权限。

[root@docker ~]# yum install -y util-linux   #安装包中有须要用到的nsenter

[root@docker ~]# docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                        PORTS               NAMES

867e6627a194        centos              "/bin/bash"         10 minutes ago      Exited (127) 47 seconds ago                       mydocker

[root@docker ~]# docker start 867e6627a194  #启动已经关闭的容器

867e6627a194

[root@docker ~]# docker inspect --format "{{.State.Pid}}" 867e6627a194  #找到容器的第一个进程PID

20012

[root@docker ~]# nsenter -t 20012 -u -i -n -p  #经过这个PID链接到容器

[root@867e6627a194 ~]# exit

[root@docker ~]# docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

867e6627a194        centos              "/bin/bash"         13 minutes ago      Up 2 minutes                            mydocker

 

 

[root@docker ~]# cat in.sh   #编写成脚本快速进入容器空间

#!/bin/sh

PID=$(docker inspect --format "{{.State.Pid}}" $1)

nsenter -t $PID -u -i -n -p

 

[root@docker ~]# docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

867e6627a194        centos              "/bin/bash"         15 minutes ago      Up 4 minutes                            mydocker

[root@docker ~]# ./in.sh 867e6627a194  #执行脚本跟上容器ID快速进入

[root@867e6627a194 ~]

笔者QQ572891887

Linux架构交流群:471443208

 

后续会陆续更新:Docker网络、Docker数据管理、Docker镜像制做、Docker私有仓库构建、Docker生产注意事项、等等

更多Docker高级相关知识请关注http://www.xuliangwei.com

相关文章
相关标签/搜索