基础知识
- Docker简介:
1.Docker是一种用于构建、发布及运行应用程序的开源项目,他通过容器化技术简化了应用程序的部署和管理
2.Docker是一个开源的应用容器引擎,基于go语言开发,为应用打包、部署平台,而非单纯的虚拟化技术
3.Docker类似于集装箱,各式各样的货物,经过集装箱的标准化进行托管,而集装箱之间互不影响
4.Docker是一个轻量级的容器,我们可以把环境交给Docker管理,当我们需要移植我们的产品的时候,就可以将环境整个的迁移到另一台主机上
二、Docker优势:
(1)应用部署
Docker简化了应用程序的部署和管理,通过将应用程序打包到容器中,确保他们在任何环境中都能以一致的方式运行
(2)微服务架构
Docker是微服务架构的理想选择,允许将大型应用程序分解成较小的、独立的模块,从而提高敏捷性和可扩展性
(3)轻量级虚拟化
Docker容器较于传统的虚拟机更加轻量和高效,能够快速启动和停止,节省资源系统
(4)运行环境一致性
无论在本地还是云端,应用的运行环境都能保持相同,减少了因环境差异导致的问题
(5)可移植性
可以轻松的将docker容器从一个平台迁移到另一个平台,无需担心依赖和环境配置的差异比如:在本地开发的容器可以无缝部署到云服务器上
(6)高效的资源利用
多个docker容器可以共享主机的操作系统内核,从而更有效地利用系统资源
(7)隔离性
每个服务器都是独立运行的,完全隔离的。避免公用的服务器资源会容易受到其他用户影响
(8)快速的启动部署
可以做到秒级,甚至毫秒级的启动时间,大大节约了开发、测试、部署的时间
(9)易于部署和扩展
能够快速部署新的应用实例,并且可以根据需求轻松的进行水平扩展
(10)DevOps
Docker桥接了开发和运维之间的差距,使团队能够有效的协作并实现DevOps实践
对于开发人员:build once、run anywhere
对于运维人员:configure once、run anything
三、为什么使用Docker
Docker解决了产品多版本迭代之后,不同环境之间的兼容问题;Docker的出现使我们开发的软件可以“带环境安装”,即安装的时候,可以把原始环境一模一样的复制过来,在自己的机器上可以运行,在别人的机器上也可以运行
Docker Hub的关键特点和优势
- 丰富的镜像资源:涵盖了各种常见的操作系统、编程语言运行时、数据库、Web 服务器等众多应用的镜像。
- 官方支持:提供了由 Docker 官方维护的一些重要镜像,确保其质量和安全性。
- 社区贡献:开发者们可以自由上传和分享他们创建的镜像,促进了知识和资源的共享。
- 版本管理:对于每个镜像,通常都有多个版本可供选择,方便用户根据需求获取特定版本。
- 便于搜索:用户可以通过关键词轻松搜索到所需的镜像。
四、认识registry和Harbor
概述:Docker Registry是一个存放镜像的仓库,可以方便的存储、管理和分发镜像。通过将镜像上传到Registry,用户可以在不同环境中快速的下载和运行镜像,大大提高了应用的部署和管理效率。
Registry简介:
- 镜像仓库:Docker Registry是一个集中式的镜像仓库,可以存储、管理和分发镜像。它通常被部署在互联网服务器或者云端,使得用户可以在任何地方下载和运行镜像
- 跨环境一致性:由于在多个环境中使用的是相同的镜像,因此可以确保应用在不同环境中的一致性。用户只需要在开发环境中制作好镜像,并将其上传到Registry,就可以在生产环境中直接下载并运行该镜像
- 与Docker完美集成:Docker本身已经与Registry完美集成,用户可以通过简单的Docker命令来上传、下载和运行镜像,无需了解Registry的具体细节
- 开源项目:Registry本身是一个开源项目,任何人都可以下载并部署自己的私有Registry
Harbor(英文单词:港湾)简介:
主要功能和特点:
- 基于角色的访问控制(RBAC):可以为不同的用户和用户组分配不同的权限,增强了安全性和管理的灵活性
- 镜像复制:支持在不同的harbor实例之间复制镜像,方便在多个数据中心或环境中分发镜像
- 图形化用户界面(UI):提供了直观地Web界面,便于管理镜像仓库、项目、用户等
- 审计日志:记录了对镜像仓库的各种操作,有助于追踪和审查活动
- 垃圾回收:可以清理不再使用的镜像,节省存储空间
- 学习Registry与Harbor的应用场景
(1)像Docker Hub、阿里云这样的公共镜像仓库有的时候用起来不太方便,Docker Hub网速太慢,阿里云需要花钱买主机
(2)涉及内部资源的保密性,有的机构不太可能将镜像提供给公网,因此需要创建一个基于内部项目镜像,构造本地私人仓库供给团队使用
六、Registry与harbor仓库的优势:
Harbor和Registry都是Docker的镜像仓库,但是Harbor作为更多企业的选择,是因为相比较于Registry来说,它具有更多的优势:
- 提供分层传输机制
Docker镜像是分层的,而如果每次传输都使用全量文件(所以用ftp的方式并不适合),显然不经济,必须提供识别分层传输的机制,以层的UUID为标识,确定传输的对象
- 提供Web界面,优化用户体验
只用镜像的名字来进行上传下载显然很不方便,需要一个用户界面可以支持登录、搜索功能,包括区分公有、私有镜像
- 支持水平扩展集群
当有用户对镜像的上传下载操作集中在某服务器,需要对相应的访问压力作分解
- 良好的安全机制
企业中的开发团队有很多不同的职位,对于不同的职位人员,分配不同的权限,具有更好的安全性
- Harbor提供基于角色的访问控制机制,并通过项目对镜像进行组织和访问权限的控制
私有库的应用场景:
七、Docker仓库的工作原理:
Index docker:索引服务,负责并维护有关用户、账户、镜像的校验以及公共命名空间的信息。
Registry docker 仓库:是镜像和图表的仓库
Registry Client docker:充当registry客户端来维护、推送和拉取,以及客户端的授权
Docker守护进程(docker daemon):负责管理镜像、容器、容器网络、数据卷等
Client:负责发送docker操作指令,日常主要通过client完成镜像和容器的管理镜像
Docker仓库(docker registry)
用于存储和分发docker镜像的集中式存储库
负责存储docker镜像,并处理docker pull/push命令
实验操作
一、Docker安装
1.选择安装的平台:docker要求centos系统的内核版本高于3.0
2.查看系统版本:
# cat /etc/os-release
3.更新yum源:
# Yum update
4.卸载旧版本:
5.安装yum工具:
6.设置镜像仓库:
注:拉取国内阿里云的速度比较快速
7.更新一下yum索引:
注:yum makecache fast命令解析
目的:以更快的方式创建或更新yum软件包的元数据缓存
清除旧的元数据缓存:首先,yum将删除旧的元数据缓存,以确保下一步更新的是最新的数据而不是旧数据
注意的是:yum makecache fast 命令创建的元数据缓存可能不是完整的。因为只下载了部分的元数据,所以某些软件包的详细信息可能不可用。这意味在某些情况下,您可能无法获取到完整的软件包描述、依赖关系
总的来说:yum makecache fast 命令的作用是以更快的方式创建或更新yum软件包的元数据缓存。它使用较少的持久化哈希来下载元数据,以提高命令的执行速度,但可能会导致某些软件包的详细信息不完整
8.安装docker:
9.启动docker并查看状态:
10.测试docker是否运行:(测试hellow-world)
11.查看刚刚下载的镜像:
二、Docker的基础命令及使用:
1.帮助命令:
1.1查看docker的版本信息:docker version
1.2查看docker的系统信息,包括镜像和容器的数量:docker info
1.3帮助命令:# docker 命令 --help
2.镜像命令
2.1查看所有本地主机的镜像:
解析:
REPOSITORY:镜像仓库源
TAR:镜像标签
IMAGE ID:镜像的id
CREATED:镜像创建时间
SIZE:镜像的大小
参数:
-a, --all 显示所有镜像(docker images -a)
-q, --quiet 仅显示镜像id(docker images -q)
2.2搜索镜像
参数:
--filter-stars=3000 搜索出来的镜像修饰stars大于3000的
2.4下载镜像
# docker pull 镜像名[:tag]
注:如果不写tag,默认为最新版本;分层下载,docker images的核心,联合文件下载
测试:
至此,mysql镜像下载完成
2.5删除镜像
(1)# docker rmi -f 镜像id 删除指定镜像
测试:
(2)# docker rmi -f 镜像id 镜像id 镜像id 删除多个镜像(空格分开)
(3)# docker rmi if $(docker images -aq) 删除全部镜像
2.6上传镜像
# docker push 镜像名:tag
2.7保存镜像为一个压缩包
# docker save -o 保存的目录文件名称 镜像名
2.8加载镜像
2.9镜像标签
# docker tag 源镜像名 想要生成新的镜像名
3.容器命令:
3.1下载centos镜像:(有了镜像才可以去创建容器)
3.2新建容器
# docker run [可选参数] image(镜像名):版本号(默认最新版本)
参数说明:
-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-P(大写P): 随机端口映射,容器内部端口随机映射到主机的端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-name=“nginx-lb”: 为容器指定一个名称;
-dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
-dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
-h “mars”: 指定容器的hostname;
-e username=“ritchie”: 设置环境变量;
-env-file=[]: 从指定文件读入环境变量;
-cpuset=“0-2” or --cpuset=“0,1,2”: 绑定容器到指定CPU运行;
-m : 设置容器使用内存最大值;
-net=“bridge”: 指定容器的网络连接类型,支持 bridge/host/none/container四种类型;
-link=[]: 添加链接到另一个容器;
-expose=[]: 开放一个端口或一组端口;
-volume , -v: 绑定一个卷;
--rm 容器关闭后就被删除,一般用于测试
练习:
例:使用Docker镜像Nginx:lastest以后台的模式启动一个容器,并命名为mynginx
例:使用镜像Nginx,以后台模式启动一个容器,并将容器的80端口映射到主机的8080端口
例:查看镜像支持的环境变量
(5)使用镜像centos以交互模式启动一个容器,在容器内执行/bin/bash命令
退出容器,退出到主机
退出并停止容器
退出但不停止(现在运行的容器是两个)
Ctrl+P+Q
3.3构建自己的Docker镜像
- 基于已有镜像创建
# docker commit [选项] 容器id/名称 仓库名称:[标签]
- 基于本地模版创建
通过导入操作系统模版文件生成新的镜像
使用wget命令导入为本地镜像
导入成功可查看本地镜像信息
- 基于dockerfile创建
# docker build [选项] PATH |URL |.
选项:
-t:指定镜像的名称和标签
-f:指定Dockerfile的路径或URL
-no-cache:不使用缓存构建镜像
-build-arg:指定构建镜像时使用的参数
-force-rm:在构建镜像时删除中间容器
命令示例:
(1)从当前目录构建镜像
Docker build -t zyherhuo .
- 从指定路径构建镜像
Docker build -t zyherhuo /path/to/dockerfile
- 指定构建镜像的目标阶段
Docker build -t zyherhuo -target build.
练习:构建SSH镜像
新建一个sshd目录用于存放dockerfile及其所需文件,创建dockerfile文件
新建镜像并查看:
3.4Dockerfile MAINTAINER和LABEL指令语法解析
任何文件系统的数据分为数据和元数据。数据是指普通文件中的实际数据,而元数据指用来描述一个文件的特征的系统数据,诸如访问权限,文件拥有者等。Docker提供了MAINTAINER和 LABEL用于处理镜像的元数据
(1)MAINTAINER语法:MAINTAINER <name>
解析:指定镜像作者信息,即镜像的Author属性。LABEL是一个更灵活的版本,可以代替MAINTAINER,LABEL可以设置任何需要设置的元数据
MAINTAINER示例:
进入Docker目录下,创建dockerfile文件
基于dockerfile构建镜像
通过docker inspect 命令查看镜像Author的值
(2)LABER语法:
进入/root/nginx目录下,创建dockerfile文件
基于dockerfile构建镜像
通过docker inspect命令查看镜像Config.Lables.maintainer的值
3.5列出所有运行的容器
# docker ps
参数:
-a 列出当前正在运行的加上历史上运行过和没有运行的容器
-n=? 显示最近运行的容器个数
-p 只显示容器的编号(与docker image -aq相同)
测试:
3.6删除容器
- # docker rm 容器id
删除指定的容器,不能删除正在运行的容器,若想强制删除,使用rm -f
- # docker rm -f $(docker ps -aq) 删除所有的容器
- # docker ps -a -q|xargs docker rm 删除所有容器
3.7启动和停止容器的操作
# docker start 容器id 启动容器
# docker restart 容器id 重启容器
# docker stop 容器id 停止当前正在运行的容器
# docker kill 容器id 强制停止当前容器
3.8后台启动容器:
# docker run -d centos 后台启动centos
3.9暂停与恢复一个运行的容器
# docker pause/unpause name
3.10容器自启动
未有的容器
# docker run [选项] 名称 --restart=always 镜像
已有的容器
3.11查看容器内部进程信息:
3.12进入当前正在运行的容器
(1)# docker exec 进入容器后开启一个新的终端,可以在里面操作
(2)# docker attach 进入容器正在执行的终端,不会启动新的进程
3.13重新启动关闭的容器
# docker start 容器id
3.14从容器内拷贝文件到主机
# docker cp 容器id:容器内路径 目的主机的路径
(1)进入容器并在容器内路径下新建文件
(2)从容器内拷贝文件到主机
测试结果:
3.15查看系统CPU状态:
# docker stats [容器id]
3.16查看日志:
# docker logs -tf --tail 容器id
参数:
-t:打印时间
-f:实时追踪日志
--tail:显示指定的日志条数
3.18数据卷
概念:数据卷是一个可供一个或多个容器使用的特殊目录,它将主机操作系统目录直接映射进容器
特点:
可供容器使用的特殊目录,可以在容器之间共享和重用
对数据卷的修改会立即生效,对数据卷的更新不会影响镜像
卷会一直存在,直到没有容器使用
类型:
- 宿主机数据卷:直接在宿主机的文件系统中但是容器可以访问
- 命名的数据卷:磁盘上Docker管理的数据卷
- 匿名数据卷
一旦完成数据卷挂载,对容器的一切操作都会作用在数据卷对应的宿主机目录
操作宿主机的/var/lib/docker/volumes/html目录,就等于操作容器内的/usr/share/nginx/html
数据卷操作命令
(1)挂载数据卷
-v html:/root/html:把html数据卷挂载到容器内的/root/html这个目录
(2)创建数据卷
# docker volume create 数据卷名称
创建数据卷之后默认会存放在一个目录下/var/lib/docker/volumes/数据卷名称/_data
(3)查看数据卷的详细信息
# docker volume inspect 数据卷名称
(4)查看全部数据卷
# docker volume ls
(5)删除数据卷
# docker volume rm 数据卷名称
(6)应用数据卷
当你映射数据卷时,如果数据卷不存在,Docker会帮你自动创建
# docker run -v 数据卷名称:容器内部路径 镜像id
4.练习
安装Nginx
4.1搜索镜像:
4.2下载镜像:
4.3查看所有镜像:
4.4启动Nginx:
4.5查看是否启动:
4.6运行测试:
关闭防火墙:systemctl stop firewalld
4.7公网ip:3344可以在浏览器访问