1. Docker发展与简介
1.1 云服务与虚拟化基础
1.1.1 云服务模型介绍
云计算通过网络为用户提供可伸缩的计算资源,主要分为以下几种类型:
-
IaaS(基础设施即服务):提供虚拟化计算资源(如虚拟机、存储、网络等)。用户可以灵活配置自己的计算环境,负责安装操作系统、管理资源等。优点是灵活度高、可扩展性强;缺点是管理复杂,需要较多技术支持。
-
PaaS(平台即服务):提供一个开发平台,用户可以在上面开发应用程序,而无需关注底层硬件或操作系统。优点是简化开发过程,适合开发者;缺点是灵活度较低,可能受到平台限制。
-
SaaS(软件即服务):提供已经构建好的应用程序,用户可以直接使用,无需安装和维护。优点是快速部署,省时省力;缺点是定制化差,依赖于服务提供商。
-
DaaS(数据即服务):提供数据处理和分析服务,用户可以访问、分析云端存储的大数据。优点是降低用户管理数据的难度;缺点是可能涉及数据隐私问题。
1.1.2 常见云服务提供商
市场上主要的云服务提供商包括阿里云、腾讯云、AWS、Google Cloud、华为云等。这些提供商通常提供各种服务,如存储、计算、网络、CDN等。
1.2 虚拟化技术概述
1.2.1 虚拟化基础
-
虚拟化类型:
-
全虚拟化:虚拟化软件完全模拟硬件环境,允许多个操作系统共享硬件资源,彼此之间相互独立。适用场景是需要兼容多个操作系统(如Linux与Windows同时运行)的环境。
-
半虚拟化:虚拟机与宿主操作系统协作,通过修改操作系统内核来提高性能。适用场景是高性能需求的环境,尤其是优化了开源操作系统(如Linux)的虚拟化。
-
-
虚拟化产品:
-
VMware:广泛使用的企业级虚拟化平台,支持全虚拟化和半虚拟化。
-
KVM:Linux内核中的虚拟化解决方案,支持硬件虚拟化。
-
Hyper-V:由微软推出的虚拟化平台,集成于Windows Server中。
-
VirtualBox:适用于个人和开发者的虚拟化产品,跨平台支持(Linux、macOS、Windows)。
-
1.3 Docker简介及其重要性
1.3.1 为什么使用Docker
Docker是一种容器化技术,它使得开发者可以将应用及其依赖打包到一个标准化的容器中,从而在任何环境下都能一致地运行。容器技术相比传统的虚拟化技术(如VMware)具有显著优势。传统虚拟化需要在每个虚拟机中运行完整的操作系统,资源消耗大,而Docker仅在宿主操作系统上运行多个隔离的容器,不需要完整的操作系统,大大减少了系统开销和资源浪费。
通过Docker,应用可以更轻松地实现跨平台部署和运行。例如,一个应用程序可以被打包成一个容器,在不同的操作系统上(如CentOS到Ubuntu)无缝迁移,确保应用始终以相同的方式运行。
1.3.2 Docker发展历史
Docker由Solomon Hykes和他的团队在2013年从DotCloud开始开发。其主要发展节点包括:
-
2013年:Docker项目发布;
-
2014年:Docker公司成立;
-
2015年:发布Docker 1.8,引入新的网络架构和卷管理;
-
2017年:发布Docker Enterprise Edition(企业版)和Docker Community Edition(社区版),并开始时间驱动的版本发布;
-
2018年:发布Docker 18.09,加入新的构建功能和改进的性能,重点是多阶段构建和新的容器日志功能;
-
2019年:发布Docker 19.03,新增对GPU加速的支持,以及Docker CLI的改进;
-
2020年:发布Docker 20.10,新增对Docker Compose v2的支持,并在性能、功能和稳定性方面进行了一系列增强;
-
2021年:进一步优化本地开发工具,增强与Kubernetes的集成;
-
2022年:加大对开发者体验的关注,推出对GitHub等工具的深度集成;
-
2023年:进一步增强对云原生应用的支持,特别是对Kubernetes生态系统的集成增强。
1.3.3 Docker版本:CE vs EE
Docker提供了两个主要版本:
-
Docker Community Edition(CE):适用于个人开发者或小型团队,提供基本的容器功能,免费使用。
-
Docker Enterprise Edition(EE):适用于大规模生产环境,强调企业级的安全性和支持,通常是付费版本。
每个版本的发布周期不同,CE通常每个月发布新版本,而EE版本则会有更长的维护周期。
1.3.4 Docker与传统虚拟化的区别
Docker通过操作系统级虚拟化(LXC)提供轻量级的虚拟化,容器之间共享宿主机的操作系统内核,因此相比传统虚拟机,Docker容器更加轻便、高效。
| 特性 | Docker容器 | 虚拟机 |
|---|---|---|
| 启动速度 | 秒级 | 分钟级 |
| 计算能力损耗 | 几乎无 | 损耗50%左右 |
| 性能 | 接近原生 | 弱于 |
| 系统支持量(单机) | 上千个 | 几十个 |
| 隔离性 | 资源隔离/限制 | 完全隔离 |
1.3.5 容器化技术的生态系统
容器技术是一种轻量级、提供隔离的虚拟化技术。一些知名的容器技术包括:
-
Docker:市场上最为知名和流行的容器框架之一,拥有完善的生态系统和活跃的社区。
-
Kubernetes:Google开发并开源的容器编排平台,可以管理、调度和扩展容器的应用。
-
OpenShift:Red Hat提供的开源容器平台,基于Kubernetes,但提供了更丰富的功能。
-
LXC:Linux容器技术,比Docker更接近传统的虚拟化技术,可以看作是轻量级的VM。
-
Rkt:由CoreOS开发的一种容器技术,设计上有别于Docker,更注重于安全性和模块化。
-
Apache Mesos:一种用于大规模数据中心的容器编排平台,可以与其他调度系统集成。
-
Containerd:开源的容器运行时,是Docker的核心组件之一,用于管理完整的容器生命周期。
-
Crio:轻量级的容器运行时,专门用于Kubernetes。
-
Singularity:专注于面向性能敏感和计算密集型应用程序的容器技术。
-
Podman:与Docker相似,但无需守护进程,支持运行和管理OCI容器和镜像。
1.3.6 Docker容器的优势
-
移植性:应用和其依赖打包在容器中,跨平台和跨环境运行无缝。
-
隔离性:容器内的应用互相隔离,不会影响宿主机或其他容器。
-
效率高:由于不需要完整的操作系统,容器消耗的资源少,启动速度快。
-
简化部署:通过Docker,可以轻松创建、复制、修改和删除容器,简化了应用部署和管理的复杂度。
1.3.7 容器技术的应用场景
-
CI/CD(持续集成与持续交付):利用Docker快速构建和部署应用,保证开发、测试、生产环境的一致性。
-
微服务架构:容器技术与微服务架构相得益彰,可以独立部署和扩展每个微服务。
-
多云与混合云环境:容器跨平台能力使得应用能在不同云环境和本地环境间无缝迁移。
1.4 Docker基础概念
1.4.1 Docker简介
-
Docker的Logo设计:Docker的Logo设计为一条蓝色鲸鱼,拖着许多集装箱。鲸鱼代表宿主机,集装箱代表相互隔离的容器,每个集装箱中都包含自己的应用程序。
-
Docker的设计宗旨:Build, Ship and Run Any App, Anywhere。通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的"一次封装,到处运行"的目的。
1.4.2 Docker核心概念重点
-
镜像(Image):包含应用程序及其所有依赖环境的可执行包。它是一个只读模板,基于该模板可以创建容器实例。
-
容器(Container):镜像的运行实例。容器提供了与外部环境隔离的运行时环境,可以在不同的系统上运行。
-
仓库(Repository):存放Docker镜像的地方。Docker Hub是最常用的公共仓库,用户也可以创建私有仓库。
1.4.3 Docker安装与配置
Docker目前仅支持64位系统。安装步骤包括关闭防火墙和SELinux,安装依赖包,设置阿里云镜像源,安装Docker-CE并设置为开机自动启动。
1.4.4 Docker与传统虚拟化的区别
Docker容器通过操作系统级虚拟化(LXC)提供轻量级的虚拟化,容器之间共享宿主机的操作系统内核,因此相比传统虚拟机,Docker容器更加轻便、高效。
2. Docker容器管理
2.1 Docker镜像操作
-
搜索镜像 :使用
docker search命令在Docker Hub上搜索相关的镜像。 -
获取镜像 :使用
docker pull命令从Docker Hub拉取镜像。 -
镜像加速下载:配置阿里云、华为云等镜像加速器来提高镜像下载速度。
-
查看镜像信息 :使用
docker images命令查看本地所有镜像。 -
获取镜像详细信息 :使用
docker inspect命令获取指定镜像的详细信息。 -
为本地镜像添加标签 :使用
docker tag命令为本地镜像添加新的标签。 -
删除镜像 :使用
docker rmi命令删除指定标签的镜像。 -
存储镜像(导出) :使用
docker save命令将本地镜像保存为tar包。 -
载入镜像(导入) :使用
docker load命令从本地tar文件中加载镜像。 -
上传镜像到Docker Hub :使用
docker tag和docker push命令将本地镜像上传到Docker Hub。
2.2 Docker容器操作
-
创建容器 :使用
docker create命令创建一个新容器,但不启动它。 -
启动容器 :使用
docker start命令启动已创建的容器。 -
停止容器 :使用
docker stop命令停止正在运行的容器。 -
查看容器状态 :使用
docker ps命令查看正在运行的容器,使用docker ps -a查看所有容器。 -
创建并启动容器 :使用
docker run命令等同于先执行docker create命令,再执行docker start命令。 -
在后台持续运行容器 :使用
docker run -d命令让Docker容器以守护形式在后台运行。 -
容器交互 :使用
docker exec命令进入运行着的容器。 -
复制到容器中 :使用
docker cp命令将宿主机的文件复制到容器内部,或将容器内部的文件复制到宿主机。 -
容器的导出与导入 :使用
docker export和docker import命令将容器导出为文件,或从文件导入容器。 -
删除容器 :使用
docker rm命令删除容器。
3. Docker网络管理
3.1 Docker网络实现原理
Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。
3.2 Docker的网络模式
-
Host模式:容器与宿主机共享网络环境,不具备独立的IP和网卡,而是使用宿主机的IP和端口。
-
Container模式:新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。
-
无网络模式(None):容器没有网络配置,只有回环接口(lo)。
-
桥接模式(Bridge):默认的网络模式,容器使用独立Network Namespace,并连接到docker0虚拟网卡。
-
自定义模式:用户可以自定义容器的网络范围、子网和路由,从而提供更高的网络控制和隔离性。
4. 资源限制
4.1 CPU资源控制
-
设置CPU使用率上限 :使用
--cpu-period和--cpu-quota参数控制CPU使用率。 -
设置CPU占用比(权重) :使用
--cpu-shares参数指定相对权重。 -
绑定指定CPU :使用
--cpuset-cpus参数将容器进程绑定到宿主机的指定CPU核上。
4.2 内存使用限制
-
限制容器可用的物理内存 :使用
-m或--memory参数。 -
限制容器可用的物理内存+swap总量 :使用
--memory-swap参数。
4.3 磁盘IO(blkio/io)控制
- 限制设备读写带宽与IOPS :使用
--device-read-bps、--device-write-bps、--device-read-iops、--device-write-iops等参数。
5. 数据卷容器(Data Volumes Containers)
5.1 数据卷
数据卷是Docker中一种专门为容器提供持久化存储的机制。通过使用数据卷,容器可以在其生命周期内访问和修改数据,而不会影响镜像本身。
5.2 数据卷容器
数据卷容器是一种专门用于共享数据的容器,它不是用于运行应用程序的容器,而是仅仅提供一个数据卷,供其他容器挂载并使用。
6. 端口映射
端口映射将宿主机的端口映射到容器内的端口,从而使得外部网络能够通过访问宿主机的端口,进而访问容器内的服务。
7. 容器互联
容器互联是一种让容器之间能够通过网络相互通信的机制。通过在容器间建立网络通信隧道,源容器和接收容器可以互相看到对方的指定信息。
8. Docker镜像的创建
Docker提供了多种方式来创建镜像,常见的有三种方法:基于已有镜像创建、基于本地模板创建和基于Dockerfile创建。
8.3.1 Dockerfile操作常用指令
-
FROM:指定新镜像基于的基础镜像。
-
MAINTAINER:指定镜像的维护者信息。
-
RUN:执行命令并将结果提交到镜像中。
-
ENTRYPOINT:设置容器启动时默认执行的命令。
-
CMD:容器启动时执行的默认命令。
-
EXPOSE:声明容器内的端口。
-
ENV:设置环境变量。
-
ADD:将文件或目录从宿主机复制到镜像中。
-
COPY:将本地文件或目录复制到镜像中。
-
VOLUME:在容器中创建挂载点。
-
USER:设置容器内运行命令时的用户。
-
WORKDIR:设置后续指令的工作目录。
-
ONBUILD:设置当该镜像作为基础镜像时,后续Dockerfile执行的命令。
-
HEALTHCHECK:设置容器的健康检查。
9. Docker Compose编排
9.1 简介
Docker Compose是一个用于定义和运行多容器Docker应用的工具。通过Docker Compose,可以在一个YAML配置文件中定义多个服务,并实现容器之间的联动,简化了应用的部署和管理。
9.3 YAML文件格式及编写注意事项
-
基本语法:YAML是大小写敏感的,使用空格进行缩进,列表项使用短横线表示,字典使用冒号连接键值对。
-
常用字段 :包括
build、image、command、container_name、environment、networks、ports、volumes等。
9.4 准备Nginx配置
在nginx/nginx.conf中,配置Nginx作为反向代理,转发请求到Tomcat服务。
9.5 编写docker-compose.yml
编写docker-compose.yml配置文件,定义Nginx和Tomcat两个服务。
9.6 启动服务
通过docker-compose up -d命令启动项目。
10. Docker-Harbor私有仓库部署与管理
10.1 搭建本地私有仓库
-
下载registry镜像 :使用
docker pull registry命令下载官方的registry镜像。 -
配置Docker守护进程 :编辑
/etc/docker/daemon.json文件,添加私有仓库地址。 -
运行Registry容器 :使用
docker run命令运行一个registry容器,指定本地存储路径和端口映射。
10.2 Harbor简介
Harbor是一个企业级的Docker镜像仓库管理平台,提供了图形化管理界面、角色访问控制、镜像复制、LDAP集成等功能。
10.3 部署Harbor服务
-
安装Docker Compose :使用
curl命令下载并安装Docker Compose。 -
下载Harbor安装包:从Harbor官网下载离线安装包。
-
修改Harbor配置文件 :在
/usr/local/harbor/目录中修改harbor.yml配置文件,设置Harbor服务器的地址、管理员密码等。 -
启动Harbor :运行
./prepare和./install.sh命令启动Harbor服务。
10.4 客户端上传镜像
-
配置Docker客户端 :在Docker客户端配置文件中添加
--insecure-registry参数,确保Docker客户端能够访问私有仓库。 -
上传镜像 :使用
docker login、docker tag和docker push命令上传镜像到Harbor。
10.5 维护管理Harbor
-
通过Harbor Web创建项目:在Harbor仓库中创建新项目。
-
创建Harbor用户:在Web管理界面中创建新用户并分配权限。
-
查看日志:通过Harbor的Web界面查看操作日志。
-
修改Harbor.cfg配置文件 :修改
harbor.yml配置文件中的可选参数,更新Harbor的配置。 -
移除Harbor服务容器 :使用
docker-compose down -v命令移除Harbor服务容器,同时保留镜像数据和数据库。
Docker全阶段精炼总结
1. Docker基础
-
云服务与虚拟化:理解IaaS、PaaS、SaaS、DaaS的区别。
-
Docker简介:轻量级容器技术,简化应用部署和管理。
-
安装与配置:掌握Docker的安装步骤和基本配置。
2. 容器管理
-
镜像操作:搜索、获取、加速下载、查看、添加标签、删除、存储和导入导出镜像。
-
容器操作:创建、启动、停止、查看状态、后台运行、交互、复制文件、导出导入和删除容器。
3. 网络与资源管理
-
网络模式:Host、Container、无网络、桥接和自定义模式。
-
资源限制:CPU、内存和磁盘IO的控制。
4. 数据与编排
-
数据卷和容器互联:提供持久化存储和容器间通信。
-
Docker Compose:通过YAML文件管理多容器应用。
5. Harbor私有仓库
- Harbor部署:企业级镜像仓库,支持图形化管理、角色访问控制、镜像复制等功能。