Docker之父Solomon Hykes:Docker就好比传统的货运集装箱
什么是docker?
Docker是管理容器的引擎,为应用打包、部署平台,而非单纯的虚拟化技术 它具有以下几个重要特点和优势:
. 轻量级虚拟化
:Docker 容器相较于传统的虚拟机更加轻量和高效,能够快速启动和停止,节省系统资源。 例如,启动一个 Docker 容器可能只需要几秒钟,而启动一个虚拟机则可能需要几分钟。
一致性
:确保应用程序在不同的环境中(如开发、测试、生产)具有一致的运行表现。 无论在本地还是云端,应用的运行环境都能保持相同,减少了因环境差异导致的问题。
可移植性
:可以轻松地将 Docker 容器从一个平台迁移到另一个平台,无需担心依赖和环境配置的差 异。 比如,在本地开发的容器可以无缝部署到云服务器上
高效的资源利用
:多个 Docker 容器可以共享主机的操作系统内核,从而更有效地利用系统资 源。
易于部署和扩展
能够快速部署新的应用实例,并且可以根据需求轻松地进行水平扩展。 总之,Docker 极大地简化了应用程序的开发、部署和管理流程,提高了开发效率和运维的便利性。 它在现代软件开发和云计算领域得到了广泛的应用。
docker在企业中的应用场景
docker与虚拟化的对比
docker的优势
对于开发人员:Build once、Run anywhere。
对于运维人员:Configure once、Run anything
容器技术大大提升了IT人员的幸福指数!
部署docker
容器工作方法
容器站点
官方站点: https://docs.docker.com/
配置软件仓库
yum-config-manager --add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装docker-ce并启动服务
在Linux rhel7 中需要激活内核
Docker的基本操作
Docker镜像管理
搜索镜像
拉取镜像
查看本地镜像
查看镜像信息
导出镜像
#保存镜像
docker image save nginx:latest -o nginx-latest.tar.gz
保存所有镜像
docker save `docker images | awk 'NR>1{print $1":"$2}'` o images.tar.gz
删除镜像
docker rmi nginx:latest
容器的常用操作
启动容器
查看容器运行信息
停停止和运行容器
docker stop busybox
docker start busybox
杀死容器可以使用信号
docker kill busybox
删除容器
容器内容提交
系统中的文件和容器中的文件传输
查询容器内部日志
docker镜像构建
docker镜像结构
共享宿主机的kernel
base镜像提供的是最小的Linux发行版
同一docker主机支持运行多种Linux发行版
采用分层结构的最大好处是:共享资源
镜像运行的基本原理
Copy-on-Write 可写容器层
容器层以下所有镜像层都是只读的
docker从上往下依次查找文件
容器层保存镜像变化的部分,并不会对镜像本身进行任何修改
一个镜像最多127层
镜像获得方式
基本镜像通常由软件官方提供
企业镜像可以用官方镜像+Dockerfile来生成
系统关于镜像的获取动作有两种:
docker pull 镜像地址 docker load –i 本地镜像包
镜像构建
构建参数
示例
#ENV CMD 可被替代
EXPOSE VOLUME VOLUME
Dockerfile实例
建立构建目录,编写构建文件
vi Dockerfile
通过dockerfile生成镜像
docker build -t (name):v1 .
测试镜像可用性
查看容器详情
镜像优化
示例
方法1.缩减镜像层
方法2.多阶段构建
方法3.使用最精简镜像
下载地址: https://github.com/GoogleContainerTools/distroless
下载镜像
docker pull gcr.io/distroless/base
docker仓库
Docker 仓库(Docker Registry) 是用于存储和分发 Docker 镜像的集中式存储库
它就像是一个大型的镜像仓库,开发者可以将自己创建的 Docker 镜像推送到仓库中,也可以从仓库中拉 取所需的镜像。
分为公有和私有
docker hub
官网: https://hub.docker.com/
Docker Hub 是 Docker 官方提供的一个公共的镜像仓库服务。
特点和优势:
1. 丰富的镜像资源:涵盖了各种常见的操作系统、编程语言运行时、数据库、Web 服务器等众多应用 的镜像。
例如,您可以轻松找到 Ubuntu、CentOS 等操作系统的镜像,以及 MySQL、Redis 等数据库 的镜像。
2. 官方支持:提供了由 Docker 官方维护的一些重要镜像,确保其质量和安全性。
3. 社区贡献:开发者们可以自由上传和分享他们创建的镜像,促进了知识和资源的共享。
4. 版本管理:对于每个镜像,通常都有多个版本可供选择,方便用户根据需求获取特定版本。
5. 便于搜索:用户可以通过关键词轻松搜索到所需的镜像
docker hub的使用方法
docker login 登录
cd .docker/ 登陆信息保存位置
ls
vi config.json
{ "auths": { "https://index.docker.io/v1/": { "auth": "dGltaW5nbGVlOjY3NTE1MTVtaW5nemxu" } }
docker tag gcr.io/distroless/base-debian11:latest timinglee/base-debian11:latest
docker push timinglee/base-debian11:latest
docker仓库的工作原理
pull push 原理
pull
镜像拉取分为以下几步:
1.docker客户端向index发送镜像拉去请求并完成与index的认证
2.index发送认证token和镜像位置给dockerclient
3.dockerclient携带token和根据index指引的镜像位置取连接registry
4.Registry会根据client持有的token跟index核实身份合法性
5.index确认此token合法性
6.Registry会根据client的请求传递镜像到客户端
push
步骤
1.client向index发送上传请求并完成用户认证
2.index会发方token给client来证明client的合法性
3.client携带index提供的token连接Registry
4.Registry向index合适token的合法性
5.index证实token的合法性
6.Registry开始接收客户端上传过来的镜像
搭建docker的私有仓库
docker公司已经将registry开源,我们可以快速构建企业私有仓库 地址: https://docs.docker.com/registry/deploying/
搭建简单的Registry仓库
下载Registry镜像
docker pull registry
开启Registry
上传镜像到仓库中
注意
在文件daemon.json只能写一个否则会报错
查看
查看镜像上传
为Registry提加密传输
生成认证key和证书
启动
为客户端建立证书
cp /root/certs/timinglee.org.crt /etc/docker/certs.d/reg.timinglee.org/ca.crt
restart
curl -k https://reg.timinglee.org/v2/_catalog
为仓库建立登陆认证
下载安装
建立认证文件
添加认证到registry容器中
构建企业级私有仓库
下载软件包地址 https://github.com/goharbor/harbor/releases
主要功能和特点
1. 基于角色的访问控制(RBAC):可以为不同的用户和用户组分配不同的权限,增强了安全性和管理 的灵活性。
2. 镜像复制:支持在不同的 Harbor 实例之间复制镜像,方便在多个数据中心或环境中分发镜像。 3. 图形化用户界面(UI):提供了直观的 Web 界面,便于管理镜像仓库、项目、用户等。
4. 审计日志:记录了对镜像仓库的各种操作,有助于追踪和审查活动。
5. 垃圾回收:可以清理不再使用的镜像,节省存储空间。
部署harbor
./install.sh --with-chartmuseum
管理仓库
登陆进入
上传镜像
图形化
登录
查看
docker网络
docker安装后会自动创建3种网络:bridge、host、none
docker原生bridge网络
bridge模式下容器没有一个公有ip,只有宿主机可以直接访问,外部主机是不可见的。
容器通过宿主机的NAT规则后可以访问外网
设置iptables
查看
docker的自定义网络
自定义桥接网络
由于桥接IP与打开次序有关如图
自定义后
先自定义
可用name ping通
如何让不同的自定义网络互通?
让net1 net2可联通
后
也可ping通
joined容器网络
示例
利用容器部署phpmyadmin管理mysql
容器访问内外网
docker 跨主机网络
macvlan网络方式实现跨主机通信
打开网卡混杂模式:
.添加macvlan网络
测试
Docker 数据卷管理及优化
Docker 数据卷是一个可供容器使用的特殊目录,它绕过了容器的文件系统,直接将数据存储在宿主机 上。
这样可以实现以下几个重要的目的:
数据持久化:即使容器被删除或重新创建,数据卷中的数据仍然存在,不会丢失。
数据共享:多个容器可以同时挂载同一个数据卷,实现数据的共享和交互。
独立于容器生命周期:数据卷的生命周期独立于容器,不受容器的启动、停止和删除的影响
docker提供了两种卷:
bind mount docker managed volume
bind mount 数据卷
是将主机上的目录或文件mount到容器里。
使用直观高效,易于理解。
使用 -v 选项指定路径,格式
-v选项指定的路径,如果不存在,挂载时会自动创建
docker managed 数据卷
bind mount必须指定host文件系统路径,限制了移植性
docker managed volume 不需要指定mount源,docker自动为容器创建数据卷目录
默认创建的数据卷目录都在 /var/lib/docker/volumes 中
如果挂载时指向容器内已有的目录,原有数据会被复制到volume中
示例
清理未使用的 Docker 数据卷
docker volume prune
建立及查看卷
建立数据卷容器
使用数据卷容器
bind mount 数据卷和docker managed 数据卷的对 比
备份与迁移数据卷
[root@docker ~]# docker run --volumes-from datavol \-v `pwd`:/backup busybox \
Docker 的安全优化
Docker容器的安全性,很大程度上依赖于Linux系统自身
评估Docker的安全性时,主要考虑以下几个方面:
Linux内核的命名空间机制提供的容器隔离安全
Linux控制组机制对容器资源的控制能力安全。
Linux内核的能力机制所带来的操作权限安全
Docker程序(特别是服务端)本身的抗攻击性。
其他安全增强机制对容器安全性的影响
#在rhel9中默认使用cgroup-v2 但是cgroup-v2中不利于观察docker的资源限制情况,所以推荐使用 cgroup-v1
修改cgroup
命名空间隔离的安全
当docker run启动一个容器时,Docker将在后台为容器创建一个独立的命名空间。
命名空间提供了 最基础也最直接的隔离。
与虚拟机方式相比,通过Linux namespace来实现的隔离不是那么彻底。
容器只是运行在宿主机上的一种特殊的进程,那么多个容器之间使用的就还是同一个宿主机的操作 系统内核。
在 Linux 内核中,有很多资源和对象是不能被 Namespace 化的,比如:磁盘等等
进程的namespace
控制组资源控制的安全
当docker run启动一个容器时,Docker将在后台为容器创建一个独立的控制组策略集合。
Linux Cgroups提供了很多有用的特性,确保各容器可以公平地分享主机的内存、CPU、磁盘IO等 资源。
确保当发生在容器内的资源压力不会影响到本地主机系统和其他容器,它在防止拒绝服务攻击 (DDoS)方面必不可少
内核能力机制
能力机制(Capability)是Linux内核一个强大的特性,可以提供细粒度的权限访问控制。
大部分情况下,容器并不需要“真正的”root权限,容器只需要少数的能力即可。
默认情况下,Docker采用“白名单”机制,禁用“必需功能”之外的其他权限。
Docker服务端防护
使用Docker容器的核心是Docker服务端,确保只有可信的用户才能访问到Docker服务。
将容器的root用户映射到本地主机上的非root用户,减轻容器和主机之间因权限提升而引起的安全 问题。
允许Docker 服务端在非root权限下运行,利用安全可靠的子进程来代理执行需要特权权限的操作。 这些子进程只允许在特定范围内进行操作
默认docker是用root用户控制资源的
Docker的资源限制
Linux Cgroups 的全称是 Linux Control Group。
是限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。
对进程进行优先级设置、审计,以及将进程挂起和恢复等操作。
Linux Cgroups
给用户暴露出来的操作接口是文件系统 它以文件和目录的方式组织在操作系统的 /sys/fs/cgroup 路径下。
执行此命令查看:mount -t cgroup
在 /sys/fs/cgroup 下面有很多诸如 cpuset、cpu、 memory 这样的子目录,也叫子系统。
在每个子系统下面,为每个容器创建一个控制组(即创建一个新目录)。
控制组下面的资源文件里填上什么值,就靠用户执行 docker run 时的参数指定
限制cpu使用
限制前
限制后 (限制使用的周期和长度)
限制cpu 优先级
限制内存使用
限制容器使用内存大小
查看
安装
示例
自建控制器
mkdir -p /sys/fs/cgroup/memory/x1/
内存+swap控制
限制docker的磁盘io
查看磁盘
指定容器使用硬盘io的速率
oflag=direct 设定dd命令直接写入磁盘
查看速率和修改后的
Docker的安全加固
Docker默认隔离性
解决Docker的默认隔离性
LXCFS 是一个为 LXC(Linux Containers)容器提供增强文件系统功能的工具。
主要功能
1. 资源可见性:
2415 LXCFS 可以使容器内的进程看到准确的 CPU、内存和磁盘 I/O 等资源使用信息。
在没有 LXCFS 时,容器内看到的资源信息可能不准确,这会影响到在容器内运行的应用程序对资源的评估和 管理。
2. 性能监控:
方便对容器内的资源使用情况进行监控和性能分析。
通过提供准确的资源信息,管理员和开发 人员可以更好地了解容器化应用的性能瓶颈,并进行相应的优化。
安装
lxcfs-5.0.4-1.el9.x86_64.rpm lxc-libs-4.0.12-1.el9.x86_64.rpm lxc-templates 4.0.12-1.el9.x86_64.rpm
运行lxcfs并解决容器隔离性
ps ax
容器特权
在容器中默认情况下即使我是容器的超级用户也无法修改某些系统设定
如
但是由于某些需要求,容器需要控制一些默认控制不了的资源,如何解决此问题,这时我们就要设置容 器特权
示例
如果添加了--privileged 参数开启容器,容器获得权限近乎于宿主机的root用户
容器特权的白名单
--privileged=true 的权限非常大,接近于宿主机的权限,为了防止用户的滥用,需要增加限制,只提供 给容器必须的权限。此时Docker 提供了权限白名单的机制,使用--cap-add添加必要的权限
限制容器对网络有root权限
可以设定网络 但不能管理磁盘
容器编排工具Docker Compose
Docker Compose 介绍
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。 其是官方的一个开源项目,托管到github上
网址 https://github.com/docker/compose
主要功能
1. 定义服务:
使用 YAML 格式的配置文件来定义一组相关的容器服务。每个服务可以指定镜像、端口映射、 环境变量、存储卷等参数。
例如,可以在配置文件中定义一个 Web 服务和一个数据库服务,以及它们之间的连接关系。
2. 一键启动和停止:
通过一个简单的命令,可以启动或停止整个应用程序所包含的所有容器。这大大简化了多容器 应用的部署和管理过程。
例如,使用 docker-compose up 命令可以启动配置文件中定义的所有服务,使用 compose down 命令可以停止并删除这些服务。
3. 服务编排:
docker 可以定义容器之间的依赖关系,确保服务按照正确的顺序启动和停止。例如,可以指定数据库 服务必须在 Web 服务之前启动。
支持网络配置,使不同服务的容器可以相互通信。可以定义一个自定义的网络,将所有相关的 容器连接到这个网络上。
4. 环境变量管理:
可以在配置文件中定义环境变量,并在容器启动时传递给容器。这使得在不同环境(如开发、 测试和生产环境)中使用不同的配置变得更加容易。
例如,可以定义一个数据库连接字符串的环境变量,在不同环境中可以设置不同的值。
工作原理
1. 读取配置文件:
Docker Compose 读取 YAML 配置文件,解析其中定义的服务和参数。
2. 创建容器:
根据配置文件中的定义,Docker Compose 调用 Docker 引擎创建相应的容器。它会下载所需 的镜像(如果本地没有),并设置容器的各种参数。
3. 管理容器生命周期:
Docker Compose 监控容器的状态,并在需要时启动、停止、重启容器。 它还可以处理容器的故障恢复,例如自动重启失败的容器。
Docker Compose 中的管理层
1. 服务 (service) 一个应用的容器,实际上可以包括若干运行相同镜像的容器实例
2. 项目 (project) 由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中 定义
3. 容器(container)容器是服务的具体实例,每个服务可以有一个或多个容器。容器是基于服务定义 的镜像创建的运行实例
Docker Compose 的常用命令参数
vi docker-compose.yml(默认文件)
常用命令:
docker compose -d (指定默认的配置文件名的配置文件)
-f 可指定非默认配置文件名的配置文件
docker compose -f 文件名 -d
停止并删除配置文件中定义的所有服务以及相关的网络和存储卷。
启动已经存在的服务,但不会创建新的服务。start
启动和关闭
服务状态查看
构建和重新构建服务
build
vi docker-compose.yml
yml文件
网络
services: test: image: busybox1 command: ["/bin/sh","-c","sleep 3000"] restart: always network_mode: default container_name: busybox test1: image: busybox2 command: ["/bin/sh","-c","sleep 3000"] restart: always container_name: busybox1 networks:- mynet1 test3: image: busybox3 command: ["/bin/sh","-c","sleep 3000"] restart: alwaysservices:
test:
image: busybox1
command: ["/bin/sh","-c","sleep 3000"]
restart: always
network_mode: default
container_name: busybox
test1:
image: busybox2
command: ["/bin/sh","-c","sleep 3000"]
restart: always
container_name: busybox1
networks:- mynet1
test3:
image: busybox3
command: ["/bin/sh","-c","sleep 3000"]
restart: always
container_name: busybox1
networks:
- mynet1
networks:
mynet1:
driver: bridge
default:
external: true
name: bridge
mynet2:
ipam:
driver: default
config:- subnet: 172.28.0.0/16
gateway: 172.28.0.254