Docker
Docker是一组平台即服务(PaaS)的产品。它基于操作系统层级的虚拟化技术,将软件与其依赖项打包为容器。托管容器的软件称为Docker引擎。Docker能够帮助开发者在轻量级容器中自动部署应用程序,并使得不同容器中的应用程序彼此隔离,高效工作。
Docker
参考文档链接
什么是Docker
Docker 是基于Go语言开发的开源项目,是开源的容器化平台,旨在简化应用程序的开发、部署和运行过程。它提供了一种轻量级、可移植和自包含的容器化环境,使开发人员能够在不同的计算机上以一致的方式构建、打包和分发应用程序。
核心概念:
- 容器(
Container):容器是 Docker 的基本部署单元。它是一个轻量级的、独立的运行时环境,包含应用程序及其相关依赖。容器利用 Linux 内核的命名空间和控制组技术,实现了隔离性和资源管理,使得应用程序在不同的容器中运行不会相互影响。 - 镜像(
Image):镜像是用于创建容器的模板。它包含了一个完整的文件系统,其中包括应用程序运行所需的所有文件、依赖和配置信息。镜像是不可变的,通过 Docker 镜像可以创建多个相同的容器实例。 - 镜像仓库(
Image Registry):镜像仓库是用于存储和分发 Docker 镜像的地方。最常用的公共镜像仓库是Docker Hub,上面有大量的官方和社区共享的镜像。也可以搭建私有的镜像仓库,用于存放自己的镜像。 Dockerfile:Dockerfile 是一种文本文件,用于定义 Docker 镜像的构建过程。它包含了一系列的指令,用于指定基础镜像、安装软件、拷贝文件、配置环境等。通过 Dockerfile,可以自动化地构建镜像,确保镜像的一致性和可重复性。

Docker 的优势:轻量性、可移植性和灵活性。通过使用 Docker,开发人员可以更轻松地创建一个可靠的开发环境、快速部署应用程序、实现弹性扩展和服务编排等。同时,它也提供了生态系统丰富的工具和服务,例如容器编排工具 Docker Compose 和容器编排平台 Kubernetes,使得容器化应用的管理更加便捷和高效。
Linux容器技术:
- Docker是在Linuk容器(
Linux Containers)技术的基础上发展起来的。 - LUX把单个操作系统的资源划分到多个孤立的组里,在孤立的组里平衡有冲突的资源使用需求。与虚拟机相比,这种通过划分组来平衡资源冲突的方式代价更小,它不需要指令级别模拟也不需要即使编译。
 - 容器直接在本地CPU上运行。
 
为什么要使用Docker
- **更快的交付和部署。**开发人员使用镜像构建标准开发环境,运维和测试人员使用镜像来获得和开发人员相同的运行环境。开发环境和测试运维环境无缝对接,节约开发、测试、部署时间。
 - 更高效的资源利用。相较于虚拟机Docker不需要额外的
Hypervisor支持,Docker是内核级别的虚拟化,实现更高的性能。 - **更简单的更新管理。**使用
Dockerfile,通过简单的修改就可以代替大量的更新操作。 
Docker与虚拟化
**虚拟化:**虚拟化是对计算机资源的抽象,是为了更好的管理计算机资源。让同时运行在一个计算机上的多个进程以为自己能够独占当前操作系统资源。
**有三种类型的虚拟化:**仿真、半虚拟化、基于容器的虚拟化
Docker虚拟化与虚拟机比较
- Docker不是虚拟化方法。它依赖于实际实现基于容器的虚拟化或操作系统级虚拟化的其他工具。
 - Docker是操作系统级的虚拟化,内核通过创建多个虚拟操作系统实例来隔离进程。虚拟机是硬件辅助虚拟化,虚拟的是整个硬件。
 - 虚拟机需要模拟一个独立的
OS Kernel而Docker不需要,与虚拟机映像相比,容器状态(Docker或LXC映像)的大小很小,因此容器映像很容易分发 - 虚拟机需要一个虚拟机管理程序如
VMware,而Docker只需要一个Docker引擎,后者的开销更小。 - Docker更快秒级,虚拟机分钟级别
 - Docker对系统资源需求更少。
- 主机上的所有容器共享主机的调度程序,从而节省了额外资源的需求。容器中的资源管理是通过cgroup实现的。Cgroups不允许容器消耗比分配给它们更多的资源。
 
 - Docker通过类似
Git理念来方便用户获取、分发更新镜像 - Docker通过
dockerfile实现灵活的创建、部署机制 
虚拟机和Docker本质的区别在于虚拟化的方式不同,虚拟机是一种硬件级别的虚拟化,通过软件去模拟硬件系统,并且虚拟机里需要虚拟OS Kernel。Docker是一种容器,是一种隔离机制,是软件级别的模拟。
虚拟机技术:资源占用十分多、冗余步骤多、启动慢;容器技术:不是模拟一个完整的OS

Docker为什么比VM快
1、Docker比VM有更少的抽象层
2、Docker利用的是宿主机的内核,VM需要的是Guest OS
故新建一个容器的时候,docker无需像虚拟机一样重新加载一个操作系统内核,避免引导。虚拟机是加载Guest OS,分钟级别的,而docker利用宿主机的操作系统,省略了这个复杂的过程,秒级!

| Docker容器 | LXC | VM | |
|---|---|---|---|
| 虚拟化类型 | OS虚拟化 | OS虚拟化 | 硬件虚拟化 | 
| 性能 | =物理机性能 | =物理机性能 | 5%-20%损耗 | 
| 隔离性 | NS隔离 | NS隔离 | 强 | 
| QoS | Cgroup 弱 | Cgroup 弱 | 强 | 
| 安全性 | 中 | 差 | 强 | 
| GuestOS | 只支持Linux< | 只支持Linux< | 全部 | 
| 可迁移性 | 强 | 弱 | 强 | 
docker是怎么工作的?
一个完整的Docker由DockerClient客户端、Docker Daemon守护进程、Docker Image镜像、DockerContainer容器四部分组成
Docker是一个Client-Server结构的系统,,docker client负责处理用户输入的各种命令,比如docker build、docker run,真正工作的其实是server,也就是docker daemon,值得注意的是,docker client和docker daemon可以运行在同一台机器上。
Docker守护进程运行在主机上,然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。

基本的Docker使用工作流程是怎样的?
- **构建镜像:**Dockerfile是镜像的源代码;用其创建镜像
 - **推送镜像到注册表:**将镜像上传到 
Docker Hub或私有注册表中。 - **拉取镜像:**通过 
docker pull从注册表中拉取镜像。 - **运行容器:**使用镜像创建并启动容器。
 - **管理容器:**使用 Docker 客户端命令管理正在运行的容器(例如查看日志、停止容器、查看资源使用情况等)。
 - **网络与存储:**容器之间通过 Docker 网络连接,数据通过 
Docker 卷或绑定挂载进行持久化。 
什么是docker-compose?
docker-compose就是一个编排同时管理多个容器的工具,与它配对使用的是一个docker-compose.yaml文件,docker-compose命令必须在一个包含docker-compose.yaml文件目录下才能使用。且当下docker-compose命令只能管理当前目录docker-compose文件中所涉及的容器,安装在机器上的其他容器无法干扰。
docker-compose的大部分命令基本和docker的命令重合,他们唯一的区别是docker命令能管理机器上所有的容器和镜像文件,而docker-compose只能管理当前docker-compose文件所涉及的容器。
如何在生产中监控Docker?
Docker提供docker status和docker事件等工具来监控生产中的Docker。我们可以使用这些命令获取重要统计数据的报告。
**Docker统计数据:**当我们使用容器ID调用docker status时,我们获得容器的CPU、内存使用情况等。它类似于Linux中top命令。
Docker事件: Docker事件是一个命令,用于查看Docker守护进程中整改再进行的活动流。一些常见的Docker事件是:attach、commit、die、datach、rename、destroy。
Docker安全么?
Docker利用了Linux内核中很多安全特性来保证不同容器之间的隔离,并且通过签名机制来对镜像进行验证。
Docker虽然隔离性无法与虚拟机相比,但仍然具有极高的安全性。
Docker如何在非Linux系统中运行容器
通过添加到Linux内核版本2.6.24的名称空间功能,可以实现容器的概念。容器将其ID添加到每个进程,并向每个系统调用添加新的访问控制检查。它由clone系统调用访问,该调用允许创建先前全局命名空间的单独实例。
Docker镜像
什么是Docker镜像
Docker镜像是Docker容器的源代码。换句话说,Docker镜像用于创建容器。使用build创建镜像,用run启动时它们将生成容器。
镜像存储在Docker注册表(docker hub)中,registry.hub.docker.com因为它们可能变得非常大,镜像被设计为由其他镜像层组成,允许在通过网络传输镜像时发送最少量的数据。
Docker镜像联合文件系统
UnionFS(联合文件系统):是一种分成,轻量级并且高性能的文件系统,支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统的Docker镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统进行叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
镜像与 UnionFS区别
Linux 的命名空间和控制组分别解决了不同资源隔离的问题,前者解决了进程、网络以及文件系统的隔离,后者实现了 CPU、内存等资源的隔离,但是在 Docker 中还有另一个非常重要的问题需要解决 - 也就是镜像。
Docker 镜像其实本质就是一个压缩包,我们可以使用命令将一个 Docker 镜像中的文件导出,你可以看到这个镜像中的目录结构与 Linux 操作系统的根目录中的内容并没有太多的区别,可以说 Docker 镜像就是一个文件。
什么是Docker Hub
Docker Hub是一个基于云的在线存储库,Docker进行可以由其他用户发布和使用。
Docker hub是一个基于云的注册表服务,允许链接到代码存储库,构建镜像并测试,存储手动推送的镜像以及指向Docker云的链接,以便将镜像部署到主机。它为整个开发流程中的容器镜像发现,分发和变更管理,用户和团队协作以及工作流自动化提供了集中资源。
Docker容器
Docker容器可扩展到多远?
诸如Foogle和Twitter之类的大型Web部署以及诸如Heroku和dotCloud之类的平台提供商都基于容器技术运行,并行运行的容器数以十万甚至至数八百计。
Docker容器退出时是否丢失数据
不、当Docker容器退出时,不会丢失数据。
应用程序写入磁盘的所有数据都会保留在其容器中直到明确删除该容器为止。即使在容器停止后,该容器的文件系统仍然存在。
Docker容器有几种状态?
有四种状态:运行、已暂停、重新启动、已退出。
容器内部机制
每个容器都在自己的命名空间中运行,但使用与所有其他容器完全相同的内核。发生隔离是因为内核知道分配给进程的命名空间,并且在API调用期间确保进程只能访问其自己的命名空间中的资源。
docker容器之间怎么隔离?
Linux中的PID、IPC、网络等资源是全局的,而NameSpace机制是一种资源隔离方案,在该机制下这些资源就不再是全局的了,而是属于某个特定的NameSpace,各个NameSpace下的资源互不干扰。
NameSpace技术可实现资源隔离,但进程仍可不受控的访问(CPU、内存、磁盘、网络等)系统资源,为了控制容器中进程对资源的访问,Docker采用control groups技术(也就是cgroup)控制容器中进程对系统资源的消耗,如限制某容器使用内存的上限、可在哪些CPU上运行等。这两项技术使容器像真正独立的操作系统。
容器与主机之间的数据拷贝命令 docker cp
1  | docker cp /www 96f7f14e99ab:/www/ # 主机到容器  | 
进入容器的方法
docker attach,用于附加到正在运行的容器的标准输入、输出和错误流。不会启动新的进程。docker exec,如docker exec -it 容器id /bin/bash,此命令将以交互模式(-i)和终端(-t)的方式进入指定容器,并开启起一个新的终端。- 通过 
docker run命令来进入容器。这种方式适用于需要在容器内执行命令而不是交互式操作的情况,使用 docker run 命令指定容器镜像和执行的命令,类似于直接进入容器 
无状态或有状态应用程序谁更适合Docker容器
最好为Docker Container创建无状态应用程序。我们可以从应用程序中创建一个容器,并从应用程序中取出可配置的状态参数。现在我们可以在生产环境和具有不同参数的QA环境中运行相同的容器。这有助于在不同场景中重用相同的镜像。另外,无状态应用程序比有状态应用程序更容易使用Docker容器进行扩展。
Dockerfile
Dockerfile中最常见的指令是什么
FROM:指定基础镜像;LABEL:功能是为镜像指定标签;RUN:运行指定的命令;CMD:容器启动时要运行的命令。
Dockerfile中的命令COPY和ADD命令区别
一般而言,ADD和COPY在功能上类似,但是首选COPY。因为COPY比ADD更易懂。COPY仅支持将本地文件复制到容器中,而ADD具有一些功能(如仅限本地的tar提取和远程URL支持),这些功能并不是很明显。
因此,ADD最佳用途是将本地tar文件自动提取到镜像中,如ADD rootfs.tar.xz /。
使用dockerfile构建apache容器服务
- 
基础镜像目录
1
2# mkdir apache
# cd apache - 
编辑镜像dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15# vim Dockerfile
FROM centos:7 # 基于的基础镜像
MAINTAINER The porject <cloud-ops@centos.org> # 维护镜像的用户信息
# 镜像操作指令安装apache软件
RUN yum -y update #更新yum
RUN yum -y install httpd
EXPOSE 80 # 开启80端口
ADD index.html /var/www/html/index.html # 复制网站首页文件
ADD run.sh /run.sh # 将执行脚本复制到镜像中
RUN chmod 755 /run.sh # 启动容器时执行脚本
CMD ["/run.sh"] - 
编辑启动脚本
1
2
3
4
5
6
7# vim run.sh
#!/bin/bash
rm -rf /run/httpd/*
exec /usr/sbin/apachectl -D FOREGROUND
echo "web test" > index.html - 
构建镜像
1
# docker build -t httpd:centos . (注意别忘 了末尾有".",且.前面有空格)
 - 
镜像容器启动运行
1
# docker run -d -p 1216:80 httpd:centos
 - 
测试验证
1
# curl http://192.168.40.30:1216
 
docker 构建一个服务的过程(node.js)
- 
编写应用代码。首先,你需要有一个应用代码。例如,一个简单的 Node.js 应用
 - 
创建 Dockerfile
在应用的根目录下创建一个名为 Dockerfile 的文件。Dockerfile 包含了一系列的指令,用于告诉 Docker 如何构建镜像。例如,对于 Node.js 应用1
2
3
4
5
6
7
8
9
10
11
12
13
14# 使用官方 Node.js 镜像作为基础镜像
FROM node:14
# 设置工作目录
WORKDIR /usr/src/app
# 复制 package.json 和 package-lock.json (如果有) 到工作目录
COPY package*.json ./
# 安装依赖
RUN npm install
# 复制项目文件到工作目录
COPY . .
# 暴露端口
EXPOSE 3000
# 定义容器启动时执行的命令
CMD [ "node", "app.js" ] - 
构建 Docker 镜像。打开终端或命令行工具,导航到包含 Dockerfile 的目录,然后运行以下命令来构建 Docker 镜像:
1
2docker build -t my-nodejs-app .
# 这里,-t 参数用于标记你的镜像,my-nodejs-app 是你的镜像名称,. 表示 Dockerfile 所在的当前目录。 - 
运行 Docker 容器。构建完成后,你可以使用以下命令来运行你的 Docker 容器:
1
2docker run -p 4000:3000 my-nodejs-app
# 这里,-p 参数将容器的 3000 端口映射到主机的 4000 端口。现在,如果你的机器上的任何程序访问 localhost:4000,它们将会看到你的 Node.js 应用运行。 - 
检查运行状态(可选)。可以使用以下命令来查看正在运行的容器:
1
docker ps
 - 
停止并删除容器(可选)。当完成测试后,可以停止并删除容器:
1
2docker stop <container_id> # 使用 docker ps 获取 container_id
docker rm <container_id> # 使用 docker ps 获取 container_id 或 docker rm $(docker ps -aq) 来删除所有容器 
部署相关
CI/CD聚焦代码集成与交付的自动化流程(Jenkins)
CI/CD 是指持续集成(Continuous Integration)和持续部署(Continuous Deployment)或持续交付(Continuous Delivery)
持续集成(Continuous Integration)
持续集成是一种软件开发实践,团队成员频繁地将他们的工作集成到共享的代码仓库中。其主要特点包括:
频繁提交代码:开发人员可以每天多次提交代码,确保代码库始终保持最新状态。自动化构建:每次提交后,自动触发构建过程,包括编译、测试、静态分析等快速反馈:如果构建失败或测试不通过,能够快速地向开发人员提供反馈,以便及时修复问题。
持续部署(Continuous Deployment)
持续部署是在持续集成的基础上,将通过所有测试的代码自动部署到生产环境中。其特点如下:
自动化流程:从代码提交到生产环境的部署完全自动化,无需人工干预。高频率部署:可以实现频繁的部署,使得新功能能够快速地提供给用户,风险控制:需要有强大的测试和监控体系来确保部署的稳定性和可靠性。
持续交付(continuous Delivery)
持续交付与持续部署类似,但不一定自动部署到生产环境,而是随时可以部署。重点在于确保软件随时处于可发布状态。
CI/CD 好处包括:
提高开发效率:减少手动操作和等待时间,加快开发周期。尽早发现问题:通过频繁的集成和测试,问题能够在早期被发现和解决。降低风险:减少了大规模部署时可能出现的问题,提高了软件的质量和稳定性。增强团队协作:促进团队成员之间的沟通和协作,提高团队的整体效率,
DevOps
DevOps 是涵盖开发与运维全生命周期协作的文化与实践体系。
DevOps 是一种文化与方法论,旨在打破开发与运维的壁垒,通过自动化工具链、协作流程和共享责任,加速软件全生命周期交付。
DevOps 覆盖更广包括需求规划、基础设施管理、监控反馈等全流程,强调团队协作、文化变革及工具整合。更强调“人+流程+工具”的系统性优化。
**技术优势:**更快地解决问题
**商业利益:**有更多时间可以增加价值(而不是修复/维护)



