首页 » Docker » Docker 详解

Docker 详解

 
文章目录

一、Docker  的介绍

1、Docker 简介

Docker 是一个能够把开发的应用程序自动部署到容器的开源引擎。Docker 在虚拟机的容器执行环境中增加了一个应用程序部署引擎。该引擎的目标及时提供一个轻量、快速的环境,能够运行开发者的程序,并方便高效地将程序从开发者的笔记本部署到测试环境,然后再部署到生成环境。Docker及其简洁,它所需的全部环境只是一台仅仅安装了兼容版本的Linux内核和二进制文件最小限的宿主机。而Docker的目标就是要提供以下这些东西。

1.1 提供一个简单、轻量的建模方式

Docker 上手非常快,用户只需几分钟,就可以把自己的程序“Docker化”。Docker 依赖于“写时复制(copy-on-write)模型”,使修改应用程序也非常迅速。

随后就可以创建容器来运行应用程序了。大多数Docker 容器只需不到1秒即可开启。由于除了管理程序的开销,Docker 容器拥有很高的性能,同时同一台宿主机中也可以运行更多的容器,使用户可以尽可能充分地利用系统资源。

 

1.2指责的逻辑分离

使用Docker,开发人员只需关心容器中运行的应用程序,而运维人员只关心如何管理容器。Docker 设计的目的就是要加强开发人员写代码的开发环境与应用程序要部署的生产环境的一致性,从而降低那种“开发时一切都正常,肯定是运维的问题”的风险。

 

1.3快速、高效的开发生命周期

Docker 的目标之一就是缩短代码从开发、测试到部署、上线运行的周期,让你的应用程序具备可移植性,易于构建,并易于写作。

1.4 鼓励使用面向服务的架构

Docker 还鼓励面向服务的架构和微服务架构。Docker推荐单个容器只运行一个应用程序或进程,这样就形成了一个分布式的应用程序模型,在这种模型下,应用程序或服务都可以表示为一系列内部互联的容器,从而是分布式部署应用程序,扩展或调试应用程序都变得非常简单,同时也提高了程序的内省性。

 

2、Docker 组件

核心组件

Docker 客户端和服务器,也称为Docker 引擎

Docker 镜像

Registry

Docker 容器

2.1 docker 客户端和服务器

docker 是一个客户端/服务器(C/S)架构的程序。Docker 客户端只需向docker 服务器或守护进程发出请求,服务器或守护进程将完成所有工作并返回结果。docker 守护进程有时也称为docker引擎。docker提供了一个命令行工具docker 一起一整套 RESTful API 来与守护进程交互。用户可以在同一台宿主机上运行docker 守护进程和客户端,也可以从本地的docker 客户端连接到运行在另一台宿主机的远程docker 守护进程。下图描绘了docker 的C/S 架构

timg (6)

2.2 docker镜像

镜像是架构docker世界的基石。用户基于镜像来运行自己的容器。镜像也是docker 生命周期的“构建”部分。镜像是基于联合(Union)文件系统的一种层式的架构,由一系列指令一步一步构建出来。例如:

添加一个文件

执行一个命令

打开一个端口

也可以把镜像当作容器的"源代码"。镜像体积很小,非常“便携”,易于分享、存储和更新。

 

2.3 Registry

docker 用registry 来保存用户构建的镜像。registry 分为公共和私有两种。

 

2.4容器

docker可以帮助用户构建和部署容器,用户只需把自己的应用程序或服务打包放进容器即可。我们刚刚提到,容器是基于镜像启动起来的,容器中可以运行一个或多个进程。我们可以认为,镜像是docker 生命周期中的构建或打包阶段,而容器则是启动或者执行阶段。

总结起来,docker 容器就是:

一个镜像格式;

一系列标准的操作;

一个执行环境。

3、Docker 技术组件

Docker 可以运行与任何安装了现代Linux 内核的x64 主机上。推荐的内核版本是3.8或更高。docker的开销比较低,可以用于服务器、台式机或笔记本。它包括以下几个部分。

一个原生的Linux容器格式,docker 中称为libcontainer

Linux内核的命名空间(namespace),用户隔离文件系统、进程和网络

文件系统隔离:每个容器都有自己的root 文件系统

进程隔离:每个容器都运行在自己的运行环境中

网络隔离:容器间的虚拟网络接口和IP地址都是分开的

资源隔离和分组:使用cgroup将cpu 和内存之类的资源独立分配给每个docker 容器

写时复制:文件系统都是通过写时复制创建的,这就意味着文件系统是分层的、快速的,而且占用的磁盘空间更小

日志:容器产生的STDOUT     STDERR    STDIN 这些IO流都会被收集并记入日志,用来进行日志分析

交互式shell:用户可以创建一个伪tty终端,将其连接到STDIN,为容器提供一个交互式的shell。

 

二、Docker 的使用

4、Docker 的安装

4.1 安装docker 的先决条件

和安装其他软件一样,安装docker 也需要一些基本的前提条件。Docker要求的条件具体如下:

  • 运行64位CPU架构的计算机(目前只能是x86_64和amd64),请注意,docker目前不支持32位cpu。
  • 运行linux 3.8或更高版本内核。一些老版本的6x或其后的内核也能运行docker,但运行结果会有很大的不同。
  • 内核必须支持一种合适的存储驱动,默认存储驱动通常是Device Mapper或AUFS
  • 内核必须支持并开启cgroup和命名空间(namespace)功能。

4.2 在ubuntu 中安装docker

4.2.1检查前提条件

4.2.2 安装docker

4.2.3运行docker容器

现在,我们可以使用docker  run命令创建容器。docker  run命令提供了docker容器的创建到启动的功能。4.2.3运行docker容器 现在,我们可以使用docker run命令创建容器。docker run命令提供了docker容器的创建到启动的功能。

首先,我们告诉docker 执行docker  run 命令,指定-i和-t两个命令行参数。-I 标志保证容器STDIN是开启的,尽管没有附着到容器中。-t ,它告诉docker为要创建的容器分配一个伪tty终端,这样,新创建的容器才能提供一个交互式shell。接下来,我们告诉docker基于什么镜像来创建容器,示例中使用的是ubuntu镜像。随后,docker在文件系统内部用这个镜像创建了一个容器。该容器拥有自己的网络、IP地址,以及一个用来和宿主机进行通信的桥接网络接口。最后,我们告诉docker在新容器中要运行什么命令/bin/bash 启动一个bash shell。

4.2.4使用docker容器

现在,我们已经以root用户登录到了新容器中,容器ID c6befc56557c。这是一个完整的Ubuntu系统,可以用它来做任何事情。我们用下看看。

用户可继续在容器中做任何自己想做的事情。当所有工作都结束时,输入exit,就可以返回ubuntu宿主机的命令行提示符界面了。

上面,我们输入exit 了,那么这个容器现在就已经停止运行了!只有在指定/bin/bash命令处于运行状态的时候,我们的容器也才会相应的处于运行状态。一旦退出容器,/bin/bash命令也就结束了,这是容器也随之停止运行。但是容器仍然是存在的,可以用docker  ps  -a

命令查看。

5、使用docker 镜像和仓库

5.1 什么是docker 镜像

Docker 镜像是由文件系统叠加而成。最底端的是一个引导文件系统,即bootfs。Docker 镜像的第二层是root文件系统rootfs,它位于引导文件系统之上。Rootfs可以是一种或多种操作系统。Docker将这样的文件系统称为镜像。一个镜像可以放到另一个镜像的顶部,当从一个镜像启动容易时,docker会在该镜像的最顶层加载一个读写文件系统。我们想在docker中运行的程序就是在这个读写层中执行的。看下docker 文件系统层图

 

5.2 列出镜像

使用 docker images 列出docker 镜像

可以看到镜像列表,它来源一个名为ubuntu 的仓库。这个是之前创建镜像docker run 的时候进行了镜像下载。本地镜像都保存在docker宿主机的/var/lib/docker 目录下。每个镜像都保存在docker 所采用的存储驱动目录下面,如前面我提到的aufs或devicemapper下面。

镜像从仓库下载下来。镜像保存在仓库中,而仓库存在于Registry中。默认Registry是由docker 公司运营的公共Registry服务,docker hub。

 

5.3 下载镜像

使用docker run 命令从镜像启动一个容器时,如果该镜像不在本地,docker 会先从docker hub下载镜像。如果没有指定标签,会自动下载latest标签的镜像。

下载镜像使用命令docker pull

5.4 查找镜像

通过docker  search命令来查找所有docker hub上公共的可用镜像

5.5 使用dockerfile 构建镜像

现在,我们创建一个目录并在里面创建初始的Dockerfile。我们将创建一个包含简单web服务器的docker镜像。

创建static_web目录来保存Dockerfile,该目录就是我们的构建环境,docker 则称此环境为上下文或构建上下文。Docker 会在构建镜像时将构建山下文和该上下文中的文件和目录上传到docker守护进程。这样docker 守护进程就能直接访问用户想在镜像中存储的任何代码、文件或者其他数据。

 

 

作为开始,我们创建了一个空dockerfile,下面就通过一个例子来看看如何通过dockerfile构建一个能作为web服务器的docker镜像。

该dockerfile由一系列指令和参数组成。每条指令都必须为大写字母,且后面要跟一个参数。

每条指令都会创建一个新的镜像层并对镜像进行提交。Docker 大体上安装如下流程执行dockerfile 中的指令。

 

  • Docker 从基础镜像运行一个容器。
  • 执行一条指令,对容器做出修改。
  • 执行类似docker commit 的操作,提交一个新的镜像层。
  • Docker 再基于刚提交的镜像运行一个新容器。
  • 执行dockerfile 中的下一条指令,直到所有指令执行完毕。

 

 

下面,我们就可以基于dockerfile构建新镜像了。执行docker build时,dockerfile中的所有指令都会被执行并且提交,并且在该命令成功后返回一个新镜像。

 

5.6  查看新镜像

如果想深入探求镜像时如何构建出来的,可以使用docker history命令

5.7 从新镜像启动容器

我们可以基于新镜像启动一个新容器,来检查我们构建的工作是否正常。

这里我们解释下参数,前面的就不说了。nginx –g ”daemon off”这将以前台运行的方式启动Nginx。-p 用来控制docker 运行时应该公开那些网络端口给宿主机。Docker可以在宿主机上随机选择一个位于32768---61000的一个比较大的端口来映射到容器中的80端口,也可以指定具体端口号,通过 –p 选项指定。(-p 8080:80方式)

下面查看下映射情况

使用curl 连接到容器

5.8 dockerfile 指令详解

5.9 docker 镜像的保存与导入

镜像导入和容器导入的区别
1)容器导入 是将当前容器 变成一个新的镜像
2)镜像导入 是复制的过程
save 和 export区别:
1)save 保存镜像所有的信息-包含历史
2)export 只导出当前的信息

 

6、docker 镜像的管理

6.1 基于dockerfile 的方式创建SSH服务镜像

随后我们用命令来使容器能长时间运行在后台,不至于运行了几秒后容器会自动退出:

7.docker 镜像私有仓库registry的搭建

7.1 部署私有仓库

显然,拥有docker镜像的一个公共的registry非常有用。但是,有时候我们希望构建和存储包含不想被公开的信息或数据的镜像。这时候我们可以构建自己的仓库。

从容器运行registry。我们在registry上做仓库(192.168.1.71)

root@ registry:~# docker pull registry:2.2

获取registry镜像

运行基于容器的registry

docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:2.2

该命令运行一个registry2.2版本的容器,并将5000端口绑定到本地宿主机。

目前没有增加或上传任何镜像,所以为空

上传镜像到私有仓库

 

原文链接:Docker 详解,转载请注明来源!

0